Pass the type of the store access, not the type of the store, into the
authorChris Lattner <sabre@nondot.org>
Mon, 2 Apr 2007 06:34:44 +0000 (06:34 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 2 Apr 2007 06:34:44 +0000 (06:34 +0000)
target hook.  This allows us to codegen a loop as:

LBB1_1: @cond_next
        mov r2, #0
        str r2, [r0, +r3, lsl #2]
        add r3, r3, #1
        cmn r3, #1
        bne LBB1_1      @cond_next

instead of:

LBB1_1: @cond_next
        mov r2, #0
        str r2, [r0], #+4
        add r3, r3, #1
        cmn r3, #1
        bne LBB1_1      @cond_next

This looks the same, but has one fewer induction variable (and therefore,
one fewer register) live in the loop.

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

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index 9cb8d484de222c6a8fe81de82a3a26c076a78378..744e0548bad0480870bdf9b6890d7684bd957532 100644 (file)
@@ -899,8 +899,15 @@ bool LoopStrengthReduce::ValidStride(int64_t Scale,
       Imm = SC->getValue()->getSExtValue();
     else
       Imm = 0;
-    if (!TLI->isLegalAddressScaleAndImm(Scale, Imm, 
-                                  UsersToProcess[i].Inst->getType()))
+    
+    // If this is a load or other access, pass the type of the access in.
+    const Type *AccessTy = Type::VoidTy;
+    if (StoreInst *SI = dyn_cast<StoreInst>(UsersToProcess[i].Inst))
+      AccessTy = SI->getOperand(0)->getType();
+    else if (LoadInst *LI = dyn_cast<LoadInst>(UsersToProcess[i].Inst))
+      AccessTy = LI->getType();
+    
+    if (!TLI->isLegalAddressScaleAndImm(Scale, Imm, AccessTy))
       return false;
   }
   return true;