Skip to content

Commit

Permalink
SROA: Don't insert instructions before a PHI
Browse files Browse the repository at this point in the history
SROA may decide that it needs to insert a bitcast and would set it's
insertion point before a PHI.  This will create an invalid module
right quick.

Instead, choose the first insertion point in the basic block that holds
our PHI.

This fixes PR20822.

Differential Revision: http://reviews.llvm.org/D5141

llvm-svn: 216891
  • Loading branch information
majnemer committed Sep 1, 2014
1 parent d2df501 commit d4cffcf
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
5 changes: 4 additions & 1 deletion llvm/lib/Transforms/Scalar/SROA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2708,7 +2708,10 @@ class AllocaSliceRewriter : public InstVisitor<AllocaSliceRewriter, bool> {
// the old pointer, which necessarily must be in the right position to
// dominate the PHI.
IRBuilderTy PtrBuilder(IRB);
PtrBuilder.SetInsertPoint(OldPtr);
if (isa<PHINode>(OldPtr))
PtrBuilder.SetInsertPoint(OldPtr->getParent()->getFirstInsertionPt());
else
PtrBuilder.SetInsertPoint(OldPtr);
PtrBuilder.SetCurrentDebugLocation(OldPtr->getDebugLoc());

Value *NewPtr = getNewAllocaSlicePtr(PtrBuilder, OldPtr->getType());
Expand Down
34 changes: 34 additions & 0 deletions llvm/test/Transforms/SROA/phi-and-select.ll
Original file line number Diff line number Diff line change
Expand Up @@ -566,3 +566,37 @@ merge:
%4 = load float* %3, align 4
ret float %4
}

%struct.S = type { i32 }

; Verifies we fixed PR20822. We have a foldable PHI feeding a speculatable PHI
; which requires the rewriting of the speculated PHI to handle insertion
; when the incoming pointer is itself from a PHI node. We would previously
; insert a bitcast instruction *before* a PHI, producing an invalid module;
; make sure we insert *after* the first non-PHI instruction.
define void @PR20822() {
; CHECK-LABEL: @PR20822(
entry:
%f = alloca %struct.S, align 4
; CHECK: %[[alloca:.*]] = alloca
br i1 undef, label %if.end, label %for.cond

for.cond: ; preds = %for.cond, %entry
br label %if.end

if.end: ; preds = %for.cond, %entry
%f2 = phi %struct.S* [ %f, %entry ], [ %f, %for.cond ]
; CHECK: phi i32
; CHECK: %[[cast:.*]] = bitcast i32* %[[alloca]] to %struct.S*
phi i32 [ undef, %entry ], [ undef, %for.cond ]
br i1 undef, label %if.then5, label %if.then2

if.then2: ; preds = %if.end
br label %if.then5

if.then5: ; preds = %if.then2, %if.end
%f1 = phi %struct.S* [ undef, %if.then2 ], [ %f2, %if.end ]
; CHECK: phi {{.*}} %[[cast]]
store %struct.S undef, %struct.S* %f1, align 4
ret void
}

0 comments on commit d4cffcf

Please sign in to comment.