Be more careful when inserting reused instructions. This fixes CodeGen/Generic/2007...
authorChris Lattner <sabre@nondot.org>
Tue, 17 Apr 2007 23:43:50 +0000 (23:43 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 17 Apr 2007 23:43:50 +0000 (23:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36231 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolutionExpander.cpp

index a9b88c1155e8bbde9d46a0e33a74a749c7a03ea4..c88c78119540970ae8b080c2f52ac6c374fee1a0 100644 (file)
@@ -71,15 +71,20 @@ 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) {
   // 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)
+          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;
   }