LSR: fix expansion of scaled reg in non-address type formulae.
For non-address users, Base and Scaled registers are not specially associated to fit an address mode, so SCEVExpander should apply normal expansion rules. Otherwise we may sink computation into inner loops that have already been optimized. llvm-svn: 158537
This commit is contained in:
parent
aca8fb3c45
commit
8370c7c38f
|
@ -4268,13 +4268,6 @@ Value *LSRInstance::Expand(const LSRFixup &LF,
|
|||
Ops.push_back(SE.getUnknown(Rewriter.expandCodeFor(Reg, 0, IP)));
|
||||
}
|
||||
|
||||
// Flush the operand list to suppress SCEVExpander hoisting.
|
||||
if (!Ops.empty()) {
|
||||
Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, IP);
|
||||
Ops.clear();
|
||||
Ops.push_back(SE.getUnknown(FullV));
|
||||
}
|
||||
|
||||
// Expand the ScaledReg portion.
|
||||
Value *ICmpScaledV = 0;
|
||||
if (F.AM.Scale != 0) {
|
||||
|
@ -4296,23 +4289,34 @@ Value *LSRInstance::Expand(const LSRFixup &LF,
|
|||
} else {
|
||||
// Otherwise just expand the scaled register and an explicit scale,
|
||||
// which is expected to be matched as part of the address.
|
||||
|
||||
// Flush the operand list to suppress SCEVExpander hoisting address modes.
|
||||
if (!Ops.empty() && LU.Kind == LSRUse::Address) {
|
||||
Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, IP);
|
||||
Ops.clear();
|
||||
Ops.push_back(SE.getUnknown(FullV));
|
||||
}
|
||||
ScaledS = SE.getUnknown(Rewriter.expandCodeFor(ScaledS, 0, IP));
|
||||
ScaledS = SE.getMulExpr(ScaledS,
|
||||
SE.getConstant(ScaledS->getType(), F.AM.Scale));
|
||||
Ops.push_back(ScaledS);
|
||||
|
||||
// Flush the operand list to suppress SCEVExpander hoisting.
|
||||
Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, IP);
|
||||
Ops.clear();
|
||||
Ops.push_back(SE.getUnknown(FullV));
|
||||
}
|
||||
}
|
||||
|
||||
// Expand the GV portion.
|
||||
if (F.AM.BaseGV) {
|
||||
Ops.push_back(SE.getUnknown(F.AM.BaseGV));
|
||||
|
||||
// Flush the operand list to suppress SCEVExpander hoisting.
|
||||
if (!Ops.empty()) {
|
||||
Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, IP);
|
||||
Ops.clear();
|
||||
Ops.push_back(SE.getUnknown(FullV));
|
||||
}
|
||||
Ops.push_back(SE.getUnknown(F.AM.BaseGV));
|
||||
}
|
||||
|
||||
// Flush the operand list to suppress SCEVExpander hoisting of both folded and
|
||||
// unfolded offsets. LSR assumes they both live next to their uses.
|
||||
if (!Ops.empty()) {
|
||||
Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty, IP);
|
||||
Ops.clear();
|
||||
Ops.push_back(SE.getUnknown(FullV));
|
||||
|
|
Loading…
Reference in New Issue