diff options
Diffstat (limited to 'llvm/lib/CodeGen/CodeGenPrepare.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/CodeGenPrepare.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 52263026d6ce..422916a28669 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -7739,9 +7739,14 @@ bool CodeGenPrepare::tryToSinkFreeOperands(Instruction *I) { for (Use *U : reverse(OpsToSink)) { auto *UI = cast<Instruction>(U->get()); - if (isa<PHINode>(UI)) - continue; - if (UI->getParent() == TargetBB) { + if (auto *PN = dyn_cast<PHINode>(UI)) { + auto *I0 = dyn_cast<Instruction>(PN->hasIdenticalValue()); + if (!I0) + continue; + if (I0->getParent() == TargetBB && + InstOrdering[I0] < InstOrdering[InsertPoint]) + InsertPoint = I0; + } else if (UI->getParent() == TargetBB) { if (InstOrdering[UI] < InstOrdering[InsertPoint]) InsertPoint = UI; continue; @@ -7753,7 +7758,11 @@ bool CodeGenPrepare::tryToSinkFreeOperands(Instruction *I) { DenseMap<Instruction *, Instruction *> NewInstructions; for (Use *U : ToReplace) { auto *UI = cast<Instruction>(U->get()); - Instruction *NI = UI->clone(); + Instruction *NI; + if (auto *PN = dyn_cast<PHINode>(UI)) + NI = cast<Instruction>(PN->hasIdenticalValue())->clone(); + else + NI = UI->clone(); if (IsHugeFunc) { // Now we clone an instruction, its operands' defs may sink to this BB |
