Have loop-rotate simplify instructions (yay instsimplify!) as it clones
authorChris Lattner <sabre@nondot.org>
Sat, 8 Jan 2011 08:24:46 +0000 (08:24 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 8 Jan 2011 08:24:46 +0000 (08:24 +0000)
them into the loop preheader, eliminating silly instructions like
"icmp i32 0, 100" in fixed tripcount loops.  This also better exposes the
bigger problem with loop rotate that I'd like to fix: once this has been
folded, the duplicated conditional branch *often* turns into an uncond branch.

Not aggressively handling this is pessimizing later loop optimizations
somethin' fierce by making "dominates all exit blocks" checks fail.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123060 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopRotation.cpp
test/Transforms/LoopRotate/phi-duplicate.ll

index 4ca422e62097d21a6cc85f3663d6ec3734bb8458..2b00caeb4e049cf0f8a8feb6da875eed71f8bcb8 100644 (file)
 #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
index 5403e723ee1554c2e99f67fc28c4cc790a682c36..c252a32d51569e7feb76a857be10009cec8419f2 100644 (file)
@@ -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: }