Commit aee68a10 authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r143437:

------------------------------------------------------------------------
r143437 | efriedma | 2011-10-31 21:49:29 -0700 (Mon, 31 Oct 2011) | 3 lines

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: 143438
parent 3a2254cb
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -2025,9 +2025,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);

+25 −0
Original line number Diff line number Diff line
@@ -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
}