Date: Sat, 14 Sep 2019 10:55:33 +0000 (UTC) From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r352318 - projects/clang900-import/contrib/llvm/lib/Transforms/Utils Message-ID: <201909141055.x8EAtXED044945@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dim Date: Sat Sep 14 10:55:33 2019 New Revision: 352318 URL: https://svnweb.freebsd.org/changeset/base/352318 Log: Revert commit from upstream llvm trunk (by Hans Wennborg): Re-commit r357452 (take 3): "SimplifyCFG SinkCommonCodeFromPredecessors: Also sink function calls without used results (PR41259)" Third time's the charm. This was reverted in r363220 due to being suspected of an internal benchmark regression and a test failure, none of which turned out to be caused by this. As reported in https://bugs.llvm.org/show_bug.cgi?id=43269, this causes UNREACHABLE errors when compiling if_malo_pci.c for arm and aarch64. Modified: projects/clang900-import/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp Modified: projects/clang900-import/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp ============================================================================== --- projects/clang900-import/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp Sat Sep 14 10:52:20 2019 (r352317) +++ projects/clang900-import/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp Sat Sep 14 10:55:33 2019 (r352318) @@ -1428,10 +1428,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) || @@ -1445,11 +1444,10 @@ static bool canSinkInstructions( if (C->isInlineAsm()) return false; - // Each instruction must have zero or one use. - if (HasUse && !I->hasOneUse()) + // Everything must have only one use too, apart from stores which + // have no uses. + if (!isa<StoreInst>(I) && !I->hasOneUse()) return false; - if (!HasUse && !I->user_empty()) - return false; } const Instruction *I0 = Insts.front(); @@ -1457,11 +1455,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 { @@ -1539,7 +1537,7 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> // 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()); @@ -1597,10 +1595,11 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> 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();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201909141055.x8EAtXED044945>