diff options
author | David L. Jones <dlj@google.com> | 2019-04-04 02:27:57 +0000 |
---|---|---|
committer | David L. Jones <dlj@google.com> | 2019-04-04 02:27:57 +0000 |
commit | 8b8a02175a46dfb27f96b7710cfe897fe28a68da (patch) | |
tree | 305d6599b393a901471f2f1f76b6219c938e904c /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 3afc733e41a6fd12eaaad6626fef6a021bf70de6 (diff) | |
download | bcm5719-llvm-8b8a02175a46dfb27f96b7710cfe897fe28a68da.tar.gz bcm5719-llvm-8b8a02175a46dfb27f96b7710cfe897fe28a68da.zip |
Revert r357452 - 'SimplifyCFG SinkCommonCodeFromPredecessors: Also sink function calls without used results (PR41259)'
This revision causes tests to fail under ASAN. Since the cause of the failures
is not clear (could be ASAN, could be a Clang bug, could be a bug in this
revision), the safest course of action seems to be to revert while investigating.
llvm-svn: 357667
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index c64ef350a6c..c3e8203ef9e 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1438,10 +1438,9 @@ HoistTerminator: static bool canSinkInstructions( ArrayRef<Instruction *> Insts, DenseMap<Instruction *, SmallVector<Value *, 4>> &PHIOperands) { - // Prune out obviously bad instructions to move. Each instruction must have - // exactly zero or one use, and we check later that use is by a single, common - // PHI instruction in the successor. - bool HasUse = !Insts.front()->user_empty(); + // Prune out obviously bad instructions to move. Any non-store instruction + // must have exactly one use, and we check later that use is by a single, + // common PHI instruction in the successor. for (auto *I : Insts) { // These instructions may change or break semantics if moved. if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) || @@ -1455,10 +1454,9 @@ static bool canSinkInstructions( if (C->isInlineAsm()) return false; - // Each instruction must have zero or one use. - if (HasUse && !I->hasOneUse()) - return false; - if (!HasUse && !I->user_empty()) + // Everything must have only one use too, apart from stores which + // have no uses. + if (!isa<StoreInst>(I) && !I->hasOneUse()) return false; } @@ -1467,11 +1465,11 @@ static bool canSinkInstructions( if (!I->isSameOperationAs(I0)) return false; - // All instructions in Insts are known to be the same opcode. If they have a - // use, check that the only user is a PHI or in the same block as the - // instruction, because if a user is in the same block as an instruction we're - // contemplating sinking, it must already be determined to be sinkable. - if (HasUse) { + // All instructions in Insts are known to be the same opcode. If they aren't + // stores, check the only user of each is a PHI or in the same block as the + // instruction, because if a user is in the same block as an instruction + // we're contemplating sinking, it must already be determined to be sinkable. + if (!isa<StoreInst>(I0)) { auto *PNUse = dyn_cast<PHINode>(*I0->user_begin()); auto *Succ = I0->getParent()->getTerminator()->getSuccessor(0); if (!all_of(Insts, [&PNUse,&Succ](const Instruction *I) -> bool { @@ -1549,7 +1547,7 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) { // it is slightly over-aggressive - it gets confused by commutative instructions // so double-check it here. Instruction *I0 = Insts.front(); - if (!I0->user_empty()) { + if (!isa<StoreInst>(I0)) { auto *PNUse = dyn_cast<PHINode>(*I0->user_begin()); if (!all_of(Insts, [&PNUse](const Instruction *I) -> bool { auto *U = cast<Instruction>(*I->user_begin()); @@ -1607,10 +1605,11 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) { I0->andIRFlags(I); } - if (!I0->user_empty()) { + if (!isa<StoreInst>(I0)) { // canSinkLastInstruction checked that all instructions were used by // one and only one PHI node. Find that now, RAUW it to our common // instruction and nuke it. + assert(I0->hasOneUse()); auto *PN = cast<PHINode>(*I0->user_begin()); PN->replaceAllUsesWith(I0); PN->eraseFromParent(); |