diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopRotation.cpp | 26 | ||||
-rw-r--r-- | llvm/test/Transforms/LoopRotate/phi-duplicate.ll | 5 |
2 files changed, 23 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopRotation.cpp b/llvm/lib/Transforms/Scalar/LoopRotation.cpp index 4ca422e6209..2b00caeb4e0 100644 --- a/llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ b/llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -14,9 +14,10 @@ #define DEBUG_TYPE "loop-rotate" #include "llvm/Transforms/Scalar.h" #include "llvm/Function.h" -#include "llvm/Analysis/LoopPass.h" -#include "llvm/Analysis/DominanceFrontier.h" #include "llvm/Analysis/CodeMetrics.h" +#include "llvm/Analysis/DominanceFrontier.h" +#include "llvm/Analysis/LoopPass.h" +#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" @@ -205,9 +206,24 @@ bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) { // Otherwise, create a duplicate of the instruction. Instruction *C = Inst->clone(); - C->setName(Inst->getName()); - C->insertBefore(LoopEntryBranch); - ValueMap[Inst] = C; + // Eagerly remap the operands of the instruction. + RemapInstruction(C, ValueMap, + RF_NoModuleLevelChanges|RF_IgnoreMissingEntries); + + // With the operands remapped, see if the instruction constant folds or is + // otherwise simplifyable. This commonly occurs because the entry from PHI + // nodes allows icmps and other instructions to fold. + if (Value *V = SimplifyInstruction(C)) { + // If so, then delete the temporary instruction and stick the folded value + // in the map. + delete C; + ValueMap[Inst] = V; + } else { + // Otherwise, stick the new instruction into the new block! + C->setName(Inst->getName()); + C->insertBefore(LoopEntryBranch); + ValueMap[Inst] = C; + } } // Along with all the other instructions, we just cloned OrigHeader's diff --git a/llvm/test/Transforms/LoopRotate/phi-duplicate.ll b/llvm/test/Transforms/LoopRotate/phi-duplicate.ll index 5403e723ee1..c252a32d515 100644 --- a/llvm/test/Transforms/LoopRotate/phi-duplicate.ll +++ b/llvm/test/Transforms/LoopRotate/phi-duplicate.ll @@ -34,14 +34,13 @@ for.end: ; preds = %for.cond ; CHECK: define void @test ; CHECK-NEXT: entry: -; CHECK-NEXT: icmp slt i64 -; CHECK-NEXT: br i1 +; CHECK-NEXT: br i1 true, label %bb.nph, label %for.end ; CHECK-NOT: : ; CHECK: bb.nph: ; CHECK-NEXT: br label %for.body ; CHECK-NOT: : ; CHECK: for.body: -; CHECK-NEXT: %j.02 = phi i64 +; CHECK-NEXT: %j.01 = phi i64 ; CHECK-NOT: phi ; CHECK: ret void ; CHECK-NEXT: } |