aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/LoopRotation.cpp26
-rw-r--r--test/Transforms/LoopRotate/phi-duplicate.ll5
2 files changed, 23 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/LoopRotation.cpp b/lib/Transforms/Scalar/LoopRotation.cpp
index 4ca422e620..2b00caeb4e 100644
--- a/lib/Transforms/Scalar/LoopRotation.cpp
+++ b/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/test/Transforms/LoopRotate/phi-duplicate.ll b/test/Transforms/LoopRotate/phi-duplicate.ll
index 5403e723ee..c252a32d51 100644
--- a/test/Transforms/LoopRotate/phi-duplicate.ll
+++ b/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: }