diff options
author | James Molloy <james.molloy@arm.com> | 2016-08-31 10:46:16 +0000 |
---|---|---|
committer | James Molloy <james.molloy@arm.com> | 2016-08-31 10:46:16 +0000 |
commit | 923e98c232fe8e06fa73fba29cd789e42499df5d (patch) | |
tree | bf6f0489186a188e12475d5a63fe761b5e784d22 /llvm/lib/Transforms | |
parent | 7b09af193a221fb5382d1094c134e50b31bdf7e6 (diff) | |
download | bcm5719-llvm-923e98c232fe8e06fa73fba29cd789e42499df5d.tar.gz bcm5719-llvm-923e98c232fe8e06fa73fba29cd789e42499df5d.zip |
[SimplifyCFG] Tail-merge calls with sideeffects
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.
llvm-svn: 280215
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 28686418a4c..dc36a6e1f0b 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -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()) @@ -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; } } |