Fix PR2434. When scanning for exising binary operator to reuse don't
authorWojciech Matyjewicz <wmatyjewicz@fastmail.fm>
Sun, 15 Jun 2008 19:07:39 +0000 (19:07 +0000)
committerWojciech Matyjewicz <wmatyjewicz@fastmail.fm>
Sun, 15 Jun 2008 19:07:39 +0000 (19:07 +0000)
take into account the instrucion pointed by InsertPt. Thanks to it,
returning the new value of InsertPt to the InsertBinop() caller can be
avoided. The bug was, actually, in visitAddRecExpr() method which wasn't
correctly handling changes of InsertPt. There shouldn't be any
performance regression, as -gvn pass (run after -indvars) removes any
redundant binops.

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

include/llvm/Analysis/ScalarEvolutionExpander.h
lib/Analysis/ScalarEvolutionExpander.cpp
test/Transforms/IndVarsSimplify/2008-06-15-SCEVExpanderBug.ll [new file with mode: 0644]

index daff373348b89b0da904aa8a5ff9f8a302de6155..9a69b2416516e8097461ab76a8c515b3f0d5bc48 100644 (file)
@@ -88,7 +88,7 @@ namespace llvm {
     /// InsertBinop - Insert the specified binary operator, doing a small amount
     /// of work to avoid inserting an obviously redundant operation.
     static Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS,
-                              Value *RHS, Instruction *&InsertPt);
+                              Value *RHS, Instruction *InsertPt);
   protected:
     Value *expand(SCEV *S);
     
index a241960b374cc040240d40e0fc98cc472b967908..9872ced519ed80f9c890240d90f83b229120fbb2 100644 (file)
@@ -73,7 +73,7 @@ Value *SCEVExpander::InsertCastOfTo(Instruction::CastOps opcode, Value *V,
 /// InsertBinop - Insert the specified binary operator, doing a small amount
 /// of work to avoid inserting an obviously redundant operation.
 Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode, Value *LHS,
-                                 Value *RHS, Instruction *&InsertPt) {
+                                 Value *RHS, Instruction *InsertPt) {
   // Fold a binop with constant operands.
   if (Constant *CLHS = dyn_cast<Constant>(LHS))
     if (Constant *CRHS = dyn_cast<Constant>(RHS))
@@ -81,21 +81,21 @@ Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode, Value *LHS,
 
   // Do a quick scan to see if we have this binop nearby.  If so, reuse it.
   unsigned ScanLimit = 6;
-  for (BasicBlock::iterator IP = InsertPt, E = InsertPt->getParent()->begin();
-       ScanLimit; --IP, --ScanLimit) {
-    if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(IP))
-      if (BinOp->getOpcode() == Opcode && BinOp->getOperand(0) == LHS &&
-          BinOp->getOperand(1) == RHS) {
-        // If we found the instruction *at* the insert point, insert later
-        // instructions after it.
-        if (BinOp == InsertPt)
-          InsertPt = ++IP;
-        return BinOp;
-      }
-    if (IP == E) break;
+  BasicBlock::iterator BlockBegin = InsertPt->getParent()->begin();
+  if (InsertPt != BlockBegin) {
+    // Scanning starts from the last instruction before InsertPt.
+    BasicBlock::iterator IP = InsertPt;
+    --IP;
+    for (; ScanLimit; --IP, --ScanLimit) {
+      if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(IP))
+        if (BinOp->getOpcode() == Opcode && BinOp->getOperand(0) == LHS &&
+            BinOp->getOperand(1) == RHS)
+          return BinOp;
+      if (IP == BlockBegin) break;
+    }
   }
-
-  // If we don't have 
+  
+  // If we haven't found this binop, insert it.
   return BinaryOperator::Create(Opcode, LHS, RHS, "tmp", InsertPt);
 }
 
diff --git a/test/Transforms/IndVarsSimplify/2008-06-15-SCEVExpanderBug.ll b/test/Transforms/IndVarsSimplify/2008-06-15-SCEVExpanderBug.ll
new file mode 100644 (file)
index 0000000..aac8d97
--- /dev/null
@@ -0,0 +1,17 @@
+; RUN: llvm-as < %s | opt -indvars -disable-output
+; PR2434
+
+define fastcc void @regcppop() nounwind  {
+entry:
+       %tmp61 = add i32 0, -5          ; <i32> [#uses=1]
+       br label %bb
+
+bb:            ; preds = %bb, %entry
+       %PL_savestack_ix.tmp.0 = phi i32 [ %tmp61, %entry ], [ %tmp127, %bb ]           ; <i32> [#uses=2]
+       %indvar10 = phi i32 [ 0, %entry ], [ %indvar.next11, %bb ]              ; <i32> [#uses=2]
+       %tmp13 = mul i32 %indvar10, -4          ; <i32> [#uses=0]
+       %tmp111 = add i32 %PL_savestack_ix.tmp.0, -3            ; <i32> [#uses=0]
+       %tmp127 = add i32 %PL_savestack_ix.tmp.0, -4            ; <i32> [#uses=1]
+       %indvar.next11 = add i32 %indvar10, 1           ; <i32> [#uses=1]
+       br label %bb
+}