mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-07 03:40:35 +00:00
fix PR5827 by disabling the phi slicing transformation in a case
where instcombine would have to split a critical edge due to a phi node of an invoke. Since instcombine can't change the CFG, it has to bail out from doing the transformation. llvm-svn: 91763
This commit is contained in:
parent
067a1be3e9
commit
d9bf69f1a5
@ -11234,6 +11234,23 @@ Instruction *InstCombiner::SliceUpIllegalIntegerPHI(PHINode &FirstPhi) {
|
||||
for (unsigned PHIId = 0; PHIId != PHIsToSlice.size(); ++PHIId) {
|
||||
PHINode *PN = PHIsToSlice[PHIId];
|
||||
|
||||
// Scan the input list of the PHI. If any input is an invoke, and if the
|
||||
// input is defined in the predecessor, then we won't be split the critical
|
||||
// edge which is required to insert a truncate. Because of this, we have to
|
||||
// bail out.
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
||||
InvokeInst *II = dyn_cast<InvokeInst>(PN->getIncomingValue(i));
|
||||
if (II == 0) continue;
|
||||
if (II->getParent() != PN->getIncomingBlock(i))
|
||||
continue;
|
||||
|
||||
// If we have a phi, and if it's directly in the predecessor, then we have
|
||||
// a critical edge where we need to put the truncate. Since we can't
|
||||
// split the edge in instcombine, we have to bail out.
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
for (Value::use_iterator UI = PN->use_begin(), E = PN->use_end();
|
||||
UI != E; ++UI) {
|
||||
Instruction *User = cast<Instruction>(*UI);
|
||||
@ -11316,7 +11333,9 @@ Instruction *InstCombiner::SliceUpIllegalIntegerPHI(PHINode &FirstPhi) {
|
||||
PredVal = EltPHI;
|
||||
EltPHI->addIncoming(PredVal, Pred);
|
||||
continue;
|
||||
} else if (PHINode *InPHI = dyn_cast<PHINode>(PN)) {
|
||||
}
|
||||
|
||||
if (PHINode *InPHI = dyn_cast<PHINode>(PN)) {
|
||||
// If the incoming value was a PHI, and if it was one of the PHIs we
|
||||
// already rewrote it, just use the lowered value.
|
||||
if (Value *Res = ExtractedVals[LoweredPHIRecord(InPHI, Offset, Ty)]) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: opt < %s -instcombine -S
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128:n8:16:32"
|
||||
target triple = "i386-apple-darwin10.0"
|
||||
|
||||
define i32 @test0(i8 %tmp2) ssp {
|
||||
@ -148,3 +148,59 @@ entry:
|
||||
store i32* getelementptr (i32* bitcast (i32 (i32, i8**)* @test6 to i32*), i32 -2048), i32** @test6g, align 4
|
||||
unreachable
|
||||
}
|
||||
|
||||
|
||||
; PR5827
|
||||
|
||||
%class.RuleBasedBreakIterator = type { i64 ()* }
|
||||
%class.UStack = type { i8** }
|
||||
|
||||
define i32 @_ZN22RuleBasedBreakIterator15checkDictionaryEi(%class.RuleBasedBreakIterator* %this, i32 %x) align 2 {
|
||||
entry:
|
||||
%breaks = alloca %class.UStack, align 4 ; <%class.UStack*> [#uses=3]
|
||||
call void @_ZN6UStackC1Ei(%class.UStack* %breaks, i32 0)
|
||||
%tobool = icmp ne i32 %x, 0 ; <i1> [#uses=1]
|
||||
br i1 %tobool, label %cond.end, label %cond.false
|
||||
|
||||
terminate.handler: ; preds = %ehcleanup
|
||||
%exc = call i8* @llvm.eh.exception() ; <i8*> [#uses=1]
|
||||
%0 = call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %exc, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i32 1) ; <i32> [#uses=0]
|
||||
call void @_ZSt9terminatev() noreturn nounwind
|
||||
unreachable
|
||||
|
||||
ehcleanup: ; preds = %cond.false
|
||||
%exc1 = call i8* @llvm.eh.exception() ; <i8*> [#uses=2]
|
||||
%1 = call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %exc1, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* null) ; <i32> [#uses=0]
|
||||
invoke void @_ZN6UStackD1Ev(%class.UStack* %breaks)
|
||||
to label %cont unwind label %terminate.handler
|
||||
|
||||
cont: ; preds = %ehcleanup
|
||||
call void @_Unwind_Resume_or_Rethrow(i8* %exc1)
|
||||
unreachable
|
||||
|
||||
cond.false: ; preds = %entry
|
||||
%tmp4 = getelementptr inbounds %class.RuleBasedBreakIterator* %this, i32 0, i32 0 ; <i64 ()**> [#uses=1]
|
||||
%tmp5 = load i64 ()** %tmp4 ; <i64 ()*> [#uses=1]
|
||||
%call = invoke i64 %tmp5()
|
||||
to label %cond.end unwind label %ehcleanup ; <i64> [#uses=1]
|
||||
|
||||
cond.end: ; preds = %cond.false, %entry
|
||||
%cond = phi i64 [ 0, %entry ], [ %call, %cond.false ] ; <i64> [#uses=1]
|
||||
%conv = trunc i64 %cond to i32 ; <i32> [#uses=1]
|
||||
call void @_ZN6UStackD1Ev(%class.UStack* %breaks)
|
||||
ret i32 %conv
|
||||
}
|
||||
|
||||
declare void @_ZN6UStackC1Ei(%class.UStack*, i32)
|
||||
|
||||
declare void @_ZN6UStackD1Ev(%class.UStack*)
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
|
||||
declare i8* @llvm.eh.exception() nounwind readonly
|
||||
|
||||
declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind
|
||||
|
||||
declare void @_ZSt9terminatev()
|
||||
|
||||
declare void @_Unwind_Resume_or_Rethrow(i8*)
|
||||
|
Loading…
Reference in New Issue
Block a user