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.
This commit is contained in:
parent
e89f883a18
commit
ceb19815c7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/clang900-import/; revision=352318
@ -1428,10 +1428,9 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,
|
||||
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,10 +1444,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;
|
||||
}
|
||||
|
||||
@ -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*> 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());
|
||||
@ -1597,10 +1595,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();
|
||||
|
Loading…
Reference in New Issue
Block a user