Skip to content

Commit

Permalink
[SimplifyCFG] Tail-merge calls with sideeffects
Browse files Browse the repository at this point in the history
This was deliberately disabled during my rewrite of SinkIfThenToEnd to keep behaviour
at least vaguely consistent with the previous version and keep it as close to NFC as
I could.

There's no real reason not to merge sideeffect calls though, so let's do it! Small fixup
along the way to ensure we don't create indirect calls.

Should fix PR28964.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280215 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
James Molloy committed Aug 31, 2016
1 parent 0bc610c commit 5ae3447
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
10 changes: 3 additions & 7 deletions lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1433,11 +1433,6 @@ static bool canSinkLastInstruction(ArrayRef<BasicBlock*> Blocks,
if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) ||
I->getType()->isTokenTy())
return false;
// Apart from loads and stores, we won't move anything that could
// change memory or have sideeffects.
if (!isa<StoreInst>(I) && !isa<LoadInst>(I) &&
(I->mayHaveSideEffects() || I->mayHaveSideEffects()))
return false;
// Everything must have only one use too, apart from stores which
// have no uses.
if (!isa<StoreInst>(I) && !I->hasOneUse())
Expand Down Expand Up @@ -1472,10 +1467,11 @@ static bool canSinkLastInstruction(ArrayRef<BasicBlock*> Blocks,
if (!canReplaceOperandWithVariable(I0, OI))
// We can't create a PHI from this GEP.
return false;
if ((isa<CallInst>(I0) || isa<InvokeInst>(I0)) && OI != 0)
// Don't create indirect calls!
// Don't create indirect calls! The called value is the final operand.
if ((isa<CallInst>(I0) || isa<InvokeInst>(I0)) && OI == OE - 1) {
// FIXME: if the call was *already* indirect, we should do this.
return false;
}
++NumPHIsRequired;
}
}
Expand Down
25 changes: 24 additions & 1 deletion test/Transforms/SimplifyCFG/sink-common-code.ll
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,29 @@ if.end:
; CHECK-NOT: load
; CHECK-NOT: store

; The call should be commoned.
define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {
entry:
br i1 %flag, label %if.then, label %if.else

if.then:
%sv1 = call i32 @bar(i32 %x)
br label %if.end

if.else:
%sv2 = call i32 @bar(i32 %y)
br label %if.end

if.end:
%p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]
ret i32 1
}
declare i32 @bar(i32)

; CHECK-LABEL: test13a
; CHECK: %[[x:.*]] = select i1 %flag
; CHECK: call i32 @bar(i32 %[[x]])

; CHECK: !0 = !{!1, !1, i64 0}
; CHECK: !1 = !{!"float", !2}
; CHECK: !2 = !{!"an example type tree"}
; CHECK: !2 = !{!"an example type tree"}

0 comments on commit 5ae3447

Please sign in to comment.