Correct type info for isLegalAddressImmediate() check.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35086 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2007-03-13 20:34:37 +00:00
parent 56eef22a07
commit 1d95816db5

View File

@ -610,11 +610,12 @@ void BasedUser::RewriteInstructionToUseNewBase(const SCEVHandle &NewBase,
/// isTargetConstant - Return true if the following can be referenced by the /// isTargetConstant - Return true if the following can be referenced by the
/// immediate field of a target instruction. /// immediate field of a target instruction.
static bool isTargetConstant(const SCEVHandle &V, const TargetLowering *TLI) { static bool isTargetConstant(const SCEVHandle &V, const Type *UseTy,
const TargetLowering *TLI) {
if (SCEVConstant *SC = dyn_cast<SCEVConstant>(V)) { if (SCEVConstant *SC = dyn_cast<SCEVConstant>(V)) {
int64_t VC = SC->getValue()->getSExtValue(); int64_t VC = SC->getValue()->getSExtValue();
if (TLI) if (TLI)
return TLI->isLegalAddressImmediate(VC, V->getType()); return TLI->isLegalAddressImmediate(VC, UseTy);
else else
// Defaults to PPC. PPC allows a sign-extended 16-bit immediate field. // Defaults to PPC. PPC allows a sign-extended 16-bit immediate field.
return (VC > -(1 << 16) && VC < (1 << 16)-1); return (VC > -(1 << 16) && VC < (1 << 16)-1);
@ -674,15 +675,20 @@ static void MoveLoopVariantsToImediateField(SCEVHandle &Val, SCEVHandle &Imm,
/// that can fit into the immediate field of instructions in the target. /// that can fit into the immediate field of instructions in the target.
/// Accumulate these immediate values into the Imm value. /// Accumulate these immediate values into the Imm value.
static void MoveImmediateValues(const TargetLowering *TLI, static void MoveImmediateValues(const TargetLowering *TLI,
Instruction *User,
SCEVHandle &Val, SCEVHandle &Imm, SCEVHandle &Val, SCEVHandle &Imm,
bool isAddress, Loop *L) { bool isAddress, Loop *L) {
const Type *UseTy = User->getType();
if (StoreInst *SI = dyn_cast<StoreInst>(User))
UseTy = SI->getOperand(0)->getType();
if (SCEVAddExpr *SAE = dyn_cast<SCEVAddExpr>(Val)) { if (SCEVAddExpr *SAE = dyn_cast<SCEVAddExpr>(Val)) {
std::vector<SCEVHandle> NewOps; std::vector<SCEVHandle> NewOps;
NewOps.reserve(SAE->getNumOperands()); NewOps.reserve(SAE->getNumOperands());
for (unsigned i = 0; i != SAE->getNumOperands(); ++i) { for (unsigned i = 0; i != SAE->getNumOperands(); ++i) {
SCEVHandle NewOp = SAE->getOperand(i); SCEVHandle NewOp = SAE->getOperand(i);
MoveImmediateValues(TLI, NewOp, Imm, isAddress, L); MoveImmediateValues(TLI, User, NewOp, Imm, isAddress, L);
if (!NewOp->isLoopInvariant(L)) { if (!NewOp->isLoopInvariant(L)) {
// If this is a loop-variant expression, it must stay in the immediate // If this is a loop-variant expression, it must stay in the immediate
@ -701,7 +707,7 @@ static void MoveImmediateValues(const TargetLowering *TLI,
} else if (SCEVAddRecExpr *SARE = dyn_cast<SCEVAddRecExpr>(Val)) { } else if (SCEVAddRecExpr *SARE = dyn_cast<SCEVAddRecExpr>(Val)) {
// Try to pull immediates out of the start value of nested addrec's. // Try to pull immediates out of the start value of nested addrec's.
SCEVHandle Start = SARE->getStart(); SCEVHandle Start = SARE->getStart();
MoveImmediateValues(TLI, Start, Imm, isAddress, L); MoveImmediateValues(TLI, User, Start, Imm, isAddress, L);
if (Start != SARE->getStart()) { if (Start != SARE->getStart()) {
std::vector<SCEVHandle> Ops(SARE->op_begin(), SARE->op_end()); std::vector<SCEVHandle> Ops(SARE->op_begin(), SARE->op_end());
@ -711,12 +717,12 @@ static void MoveImmediateValues(const TargetLowering *TLI,
return; return;
} else if (SCEVMulExpr *SME = dyn_cast<SCEVMulExpr>(Val)) { } else if (SCEVMulExpr *SME = dyn_cast<SCEVMulExpr>(Val)) {
// Transform "8 * (4 + v)" -> "32 + 8*V" if "32" fits in the immed field. // Transform "8 * (4 + v)" -> "32 + 8*V" if "32" fits in the immed field.
if (isAddress && isTargetConstant(SME->getOperand(0), TLI) && if (isAddress && isTargetConstant(SME->getOperand(0), UseTy, TLI) &&
SME->getNumOperands() == 2 && SME->isLoopInvariant(L)) { SME->getNumOperands() == 2 && SME->isLoopInvariant(L)) {
SCEVHandle SubImm = SCEVUnknown::getIntegerSCEV(0, Val->getType()); SCEVHandle SubImm = SCEVUnknown::getIntegerSCEV(0, Val->getType());
SCEVHandle NewOp = SME->getOperand(1); SCEVHandle NewOp = SME->getOperand(1);
MoveImmediateValues(TLI, NewOp, SubImm, isAddress, L); MoveImmediateValues(TLI, User, NewOp, SubImm, isAddress, L);
// If we extracted something out of the subexpressions, see if we can // If we extracted something out of the subexpressions, see if we can
// simplify this! // simplify this!
@ -724,7 +730,7 @@ static void MoveImmediateValues(const TargetLowering *TLI,
// Scale SubImm up by "8". If the result is a target constant, we are // Scale SubImm up by "8". If the result is a target constant, we are
// good. // good.
SubImm = SCEVMulExpr::get(SubImm, SME->getOperand(0)); SubImm = SCEVMulExpr::get(SubImm, SME->getOperand(0));
if (isTargetConstant(SubImm, TLI)) { if (isTargetConstant(SubImm, UseTy, TLI)) {
// Accumulate the immediate. // Accumulate the immediate.
Imm = SCEVAddExpr::get(Imm, SubImm); Imm = SCEVAddExpr::get(Imm, SubImm);
@ -738,7 +744,7 @@ static void MoveImmediateValues(const TargetLowering *TLI,
// Loop-variant expressions must stay in the immediate field of the // Loop-variant expressions must stay in the immediate field of the
// expression. // expression.
if ((isAddress && isTargetConstant(Val, TLI)) || if ((isAddress && isTargetConstant(Val, UseTy, TLI)) ||
!Val->isLoopInvariant(L)) { !Val->isLoopInvariant(L)) {
Imm = SCEVAddExpr::get(Imm, Val); Imm = SCEVAddExpr::get(Imm, Val);
Val = SCEVUnknown::getIntegerSCEV(0, Val->getType()); Val = SCEVUnknown::getIntegerSCEV(0, Val->getType());
@ -979,8 +985,8 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
if (SI->getOperand(1) == UsersToProcess[i].OperandValToReplace) if (SI->getOperand(1) == UsersToProcess[i].OperandValToReplace)
isAddress = true; isAddress = true;
MoveImmediateValues(TLI, UsersToProcess[i].Base, UsersToProcess[i].Imm, MoveImmediateValues(TLI, UsersToProcess[i].Inst, UsersToProcess[i].Base,
isAddress, L); UsersToProcess[i].Imm, isAddress, L);
} }
} }
@ -1034,7 +1040,7 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
Constant *C = dyn_cast<Constant>(CommonBaseV); Constant *C = dyn_cast<Constant>(CommonBaseV);
if (!C || if (!C ||
(!C->isNullValue() && (!C->isNullValue() &&
!isTargetConstant(SCEVUnknown::get(CommonBaseV), TLI))) !isTargetConstant(SCEVUnknown::get(CommonBaseV), ReplacedTy, TLI)))
// We want the common base emitted into the preheader! This is just // We want the common base emitted into the preheader! This is just
// using cast as a copy so BitCast (no-op cast) is appropriate // using cast as a copy so BitCast (no-op cast) is appropriate
CommonBaseV = new BitCastInst(CommonBaseV, CommonBaseV->getType(), CommonBaseV = new BitCastInst(CommonBaseV, CommonBaseV->getType(),
@ -1087,7 +1093,7 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
// this by forcing a BitCast (noop cast) to be inserted into the preheader // this by forcing a BitCast (noop cast) to be inserted into the preheader
// in this case. // in this case.
if (Constant *C = dyn_cast<Constant>(BaseV)) { if (Constant *C = dyn_cast<Constant>(BaseV)) {
if (!C->isNullValue() && !isTargetConstant(Base, TLI)) { if (!C->isNullValue() && !isTargetConstant(Base, ReplacedTy, TLI)) {
// We want this constant emitted into the preheader! This is just // We want this constant emitted into the preheader! This is just
// using cast as a copy so BitCast (no-op cast) is appropriate // using cast as a copy so BitCast (no-op cast) is appropriate
BaseV = new BitCastInst(BaseV, BaseV->getType(), "preheaderinsert", BaseV = new BitCastInst(BaseV, BaseV->getType(), "preheaderinsert",