mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-06 09:39:28 +00:00
[Constant Hoisting] Avoid inserting instructions before EH pads
Now that terminators can be EH pads, this code needs to iterate over the immediate dominators of the EH pad to find a valid insertion point. Fix for PR32107 Patch by Robert Olliff! Differential Revision: https://reviews.llvm.org/D30511 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296698 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
deebf969c5
commit
386f13715a
@ -136,8 +136,16 @@ Instruction *ConstantHoistingPass::findMatInsertPt(Instruction *Inst,
|
||||
if (Idx != ~0U && isa<PHINode>(Inst))
|
||||
return cast<PHINode>(Inst)->getIncomingBlock(Idx)->getTerminator();
|
||||
|
||||
BasicBlock *IDom = DT->getNode(Inst->getParent())->getIDom()->getBlock();
|
||||
return IDom->getTerminator();
|
||||
// This must be an EH pad. Iterate over immediate dominators until we find a
|
||||
// non-EH pad. We need to skip over catchswitch blocks, which are both EH pads
|
||||
// and terminators.
|
||||
auto IDom = DT->getNode(Inst->getParent())->getIDom();
|
||||
while (IDom->getBlock()->isEHPad()) {
|
||||
assert(Entry != IDom->getBlock() && "eh pad in entry block");
|
||||
IDom = IDom->getIDom();
|
||||
}
|
||||
|
||||
return IDom->getBlock()->getTerminator();
|
||||
}
|
||||
|
||||
/// \brief Find an insertion point that dominates all uses.
|
||||
|
62
test/Transforms/ConstantHoisting/X86/ehpad.ll
Normal file
62
test/Transforms/ConstantHoisting/X86/ehpad.ll
Normal file
@ -0,0 +1,62 @@
|
||||
; RUN: opt -S -consthoist < %s | FileCheck %s
|
||||
|
||||
; FIXME: The catchpad doesn't even use the constant, so a better fix would be to
|
||||
; insert the bitcast in the catchpad block.
|
||||
|
||||
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-windows-msvc"
|
||||
|
||||
; CHECK-LABEL: define i32 @main
|
||||
; CHECK: %tobool = icmp eq i32 %argc, 0
|
||||
; CHECK-NEXT: bitcast i64 9209618997431186100 to i64
|
||||
; CHECK-NEXT: br i1 %tobool
|
||||
|
||||
; Function Attrs: norecurse
|
||||
define i32 @main(i32 %argc, i8** nocapture readnone %argv) local_unnamed_addr #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
|
||||
%call = tail call i64 @fn(i64 0)
|
||||
%call1 = tail call i64 @fn(i64 1)
|
||||
%tobool = icmp eq i32 %argc, 0
|
||||
br i1 %tobool, label %2, label %1
|
||||
|
||||
; <label>:1: ; preds = %0
|
||||
%call2 = invoke i64 @fn(i64 %call)
|
||||
to label %6 unwind label %catch.dispatch
|
||||
|
||||
; <label>:2: ; preds = %0
|
||||
%call3 = invoke i64 @fn(i64 %call1)
|
||||
to label %6 unwind label %catch.dispatch
|
||||
|
||||
catch.dispatch: ; preds = %2, %1
|
||||
%z.0 = phi i64 [ %call, %1 ], [ %call1, %2 ]
|
||||
%3 = catchswitch within none [label %4] unwind to caller
|
||||
|
||||
; <label>:4: ; preds = %catch.dispatch
|
||||
%5 = catchpad within %3 [i8* null, i32 64, i8* null]
|
||||
br i1 %tobool, label %then, label %else
|
||||
|
||||
then:
|
||||
%call4 = tail call i64 @fn(i64 %z.0) [ "funclet"(token %5) ]
|
||||
%add = add i64 %call4, 9209618997431186100
|
||||
br label %endif
|
||||
|
||||
else:
|
||||
%call5 = tail call i64 @fn(i64 0) [ "funclet"(token %5) ]
|
||||
%add6 = add i64 %call5, 9209618997431186100
|
||||
br label %endif
|
||||
|
||||
endif:
|
||||
%v = phi i64 [ %add, %then ], [ %add6, %else ]
|
||||
%call7 = tail call i64 @fn(i64 %v) [ "funclet"(token %5) ]
|
||||
%call8 = tail call i64 @fn(i64 %call7) [ "funclet"(token %5) ]
|
||||
catchret from %5 to label %6
|
||||
|
||||
; <label>:6: ; preds = %1, %2, %4
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i64 @fn(i64) local_unnamed_addr #1
|
||||
|
||||
declare i32 @__CxxFrameHandler3(...)
|
||||
|
||||
attributes #0 = { norecurse "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
Loading…
x
Reference in New Issue
Block a user