mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[LoopStrengthReduce] Don't rewrite PHIs with incoming values from CatchSwitches
Bail out if we have a PHI on an EHPad that gets a value from a CatchSwitchInst. Because the CatchSwitchInst cannot be split, there is no good place to stick any instructions. This fixes PR26373. llvm-svn: 259702
This commit is contained in:
parent
e08ae5f43b
commit
1126f604ac
@ -2512,6 +2512,14 @@ public:
|
||||
return block_begin() + getNumOperands();
|
||||
}
|
||||
|
||||
iterator_range<block_iterator> blocks() {
|
||||
return make_range(block_begin(), block_end());
|
||||
}
|
||||
|
||||
iterator_range<const_block_iterator> blocks() const {
|
||||
return make_range(block_begin(), block_end());
|
||||
}
|
||||
|
||||
op_range incoming_values() { return operands(); }
|
||||
|
||||
const_op_range incoming_values() const { return operands(); }
|
||||
|
@ -4799,6 +4799,17 @@ LSRInstance::LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE,
|
||||
DEBUG(dbgs() << "LSR skipping loop, too many IV Users in " << U << "\n");
|
||||
return;
|
||||
}
|
||||
// Bail out if we have a PHI on an EHPad that gets a value from a
|
||||
// CatchSwitchInst. Because the CatchSwitchInst cannot be split, there is
|
||||
// no good place to stick any instructions.
|
||||
if (auto *PN = dyn_cast<PHINode>(U.getUser())) {
|
||||
auto *FirstNonPHI = PN->getParent()->getFirstNonPHI();
|
||||
if (isa<FuncletPadInst>(FirstNonPHI) ||
|
||||
isa<CatchSwitchInst>(FirstNonPHI))
|
||||
for (BasicBlock *PredBB : PN->blocks())
|
||||
if (isa<CatchSwitchInst>(PredBB->getFirstNonPHI()))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
@ -214,3 +214,32 @@ try.cont.7: ; preds = %try.cont
|
||||
|
||||
; CHECK: catch.dispatch.2:
|
||||
; CHECK: %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ]
|
||||
|
||||
define i32 @test2() personality i32 (...)* @_except_handler3 {
|
||||
entry:
|
||||
br label %for.body
|
||||
|
||||
for.body: ; preds = %for.inc, %entry
|
||||
%phi = phi i32 [ %inc, %for.inc ], [ 0, %entry ]
|
||||
invoke void @reserve()
|
||||
to label %for.inc unwind label %catch.dispatch
|
||||
|
||||
catch.dispatch: ; preds = %for.body
|
||||
%tmp18 = catchswitch within none [label %catch.handler] unwind to caller
|
||||
|
||||
catch.handler: ; preds = %catch.dispatch
|
||||
%phi.lcssa = phi i32 [ %phi, %catch.dispatch ]
|
||||
%tmp19 = catchpad within %tmp18 [i8* null]
|
||||
catchret from %tmp19 to label %done
|
||||
|
||||
done:
|
||||
ret i32 %phi.lcssa
|
||||
|
||||
for.inc: ; preds = %for.body
|
||||
%inc = add i32 %phi, 1
|
||||
br label %for.body
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define i32 @test2(
|
||||
; CHECK: %phi.lcssa = phi i32 [ %phi, %catch.dispatch ]
|
||||
; CHECK-NEXT: catchpad within
|
||||
|
Loading…
Reference in New Issue
Block a user