mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 22:30:33 +00:00
Make sure we use the right insertion point when instcombine replaces a PHI with another instruction. (Specifically, don't insert an arbitrary instruction before a PHI.) Fixes PR11275.
llvm-svn: 143437
This commit is contained in:
parent
038abbd863
commit
676558ae92
@ -2028,9 +2028,10 @@ bool InstCombiner::DoOneIteration(Function &F, unsigned Iteration) {
|
||||
BasicBlock *InstParent = I->getParent();
|
||||
BasicBlock::iterator InsertPos = I;
|
||||
|
||||
if (!isa<PHINode>(Result)) // If combining a PHI, don't insert
|
||||
while (isa<PHINode>(InsertPos)) // middle of a block of PHIs.
|
||||
++InsertPos;
|
||||
// If we replace a PHI with something that isn't a PHI, fix up the
|
||||
// insertion point.
|
||||
if (!isa<PHINode>(Result) && isa<PHINode>(InsertPos))
|
||||
InsertPos = InstParent->getFirstInsertionPt();
|
||||
|
||||
InstParent->getInstList().insert(InsertPos, Result);
|
||||
|
||||
|
@ -374,3 +374,28 @@ for.inc: ; preds = %for.cond
|
||||
return: ; No predecessors!
|
||||
ret void
|
||||
}
|
||||
|
||||
; PR11275
|
||||
declare void @test18b() noreturn
|
||||
declare void @test18foo(double**)
|
||||
declare void @test18a() noreturn
|
||||
define fastcc void @test18x(i8* %t0, i1 %b) uwtable align 2 {
|
||||
entry:
|
||||
br i1 %b, label %e1, label %e2
|
||||
e1:
|
||||
%t2 = bitcast i8* %t0 to double**
|
||||
invoke void @test18b() noreturn
|
||||
to label %u unwind label %lpad
|
||||
e2:
|
||||
%t4 = bitcast i8* %t0 to double**
|
||||
invoke void @test18a() noreturn
|
||||
to label %u unwind label %lpad
|
||||
lpad:
|
||||
%t5 = phi double** [ %t2, %e1 ], [ %t4, %e2 ]
|
||||
%lpad.nonloopexit262 = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0
|
||||
cleanup
|
||||
call void @test18foo(double** %t5)
|
||||
unreachable
|
||||
u:
|
||||
unreachable
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user