Pass the type of the store access, not the type of the store, into the

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
This commit is contained in:
Chris Lattner 2007-04-02 06:34:44 +00:00
parent 44ad85e0e8
commit 1ebd89eb6b

View File

@ -899,8 +899,15 @@ bool LoopStrengthReduce::ValidStride(int64_t Scale,
Imm = SC->getValue()->getSExtValue(); Imm = SC->getValue()->getSExtValue();
else else
Imm = 0; 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 false;
} }
return true; return true;