mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Generalize createSCEV to be able to form SCEV expressions from
ConstantExprs. llvm-svn: 52615
This commit is contained in:
parent
81c83d9a1d
commit
90894ac18b
@ -1704,20 +1704,28 @@ SCEVHandle ScalarEvolutionsImpl::createSCEV(Value *V) {
|
||||
if (!isa<IntegerType>(V->getType()))
|
||||
return SE.getUnknown(V);
|
||||
|
||||
if (Instruction *I = dyn_cast<Instruction>(V)) {
|
||||
switch (I->getOpcode()) {
|
||||
unsigned Opcode = Instruction::UserOp1;
|
||||
if (Instruction *I = dyn_cast<Instruction>(V))
|
||||
Opcode = I->getOpcode();
|
||||
else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
|
||||
Opcode = CE->getOpcode();
|
||||
else
|
||||
return SE.getUnknown(V);
|
||||
|
||||
User *U = cast<User>(V);
|
||||
switch (Opcode) {
|
||||
case Instruction::Add:
|
||||
return SE.getAddExpr(getSCEV(I->getOperand(0)),
|
||||
getSCEV(I->getOperand(1)));
|
||||
return SE.getAddExpr(getSCEV(U->getOperand(0)),
|
||||
getSCEV(U->getOperand(1)));
|
||||
case Instruction::Mul:
|
||||
return SE.getMulExpr(getSCEV(I->getOperand(0)),
|
||||
getSCEV(I->getOperand(1)));
|
||||
return SE.getMulExpr(getSCEV(U->getOperand(0)),
|
||||
getSCEV(U->getOperand(1)));
|
||||
case Instruction::UDiv:
|
||||
return SE.getUDivExpr(getSCEV(I->getOperand(0)),
|
||||
getSCEV(I->getOperand(1)));
|
||||
return SE.getUDivExpr(getSCEV(U->getOperand(0)),
|
||||
getSCEV(U->getOperand(1)));
|
||||
case Instruction::Sub:
|
||||
return SE.getMinusSCEV(getSCEV(I->getOperand(0)),
|
||||
getSCEV(I->getOperand(1)));
|
||||
return SE.getMinusSCEV(getSCEV(U->getOperand(0)),
|
||||
getSCEV(U->getOperand(1)));
|
||||
case Instruction::Or:
|
||||
// If the RHS of the Or is a constant, we may have something like:
|
||||
// X*4+1 which got turned into X*4|1. Handle this as an Add so loop
|
||||
@ -1725,59 +1733,59 @@ SCEVHandle ScalarEvolutionsImpl::createSCEV(Value *V) {
|
||||
//
|
||||
// In order for this transformation to be safe, the LHS must be of the
|
||||
// form X*(2^n) and the Or constant must be less than 2^n.
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||
SCEVHandle LHS = getSCEV(I->getOperand(0));
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
||||
SCEVHandle LHS = getSCEV(U->getOperand(0));
|
||||
const APInt &CIVal = CI->getValue();
|
||||
if (GetMinTrailingZeros(LHS) >=
|
||||
(CIVal.getBitWidth() - CIVal.countLeadingZeros()))
|
||||
return SE.getAddExpr(LHS, getSCEV(I->getOperand(1)));
|
||||
return SE.getAddExpr(LHS, getSCEV(U->getOperand(1)));
|
||||
}
|
||||
break;
|
||||
case Instruction::Xor:
|
||||
// If the RHS of the xor is a signbit, then this is just an add.
|
||||
// Instcombine turns add of signbit into xor as a strength reduction step.
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
||||
if (CI->getValue().isSignBit())
|
||||
return SE.getAddExpr(getSCEV(I->getOperand(0)),
|
||||
getSCEV(I->getOperand(1)));
|
||||
return SE.getAddExpr(getSCEV(U->getOperand(0)),
|
||||
getSCEV(U->getOperand(1)));
|
||||
else if (CI->isAllOnesValue())
|
||||
return SE.getNotSCEV(getSCEV(I->getOperand(0)));
|
||||
return SE.getNotSCEV(getSCEV(U->getOperand(0)));
|
||||
}
|
||||
break;
|
||||
|
||||
case Instruction::Shl:
|
||||
// Turn shift left of a constant amount into a multiply.
|
||||
if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||
if (ConstantInt *SA = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
||||
uint32_t BitWidth = cast<IntegerType>(V->getType())->getBitWidth();
|
||||
Constant *X = ConstantInt::get(
|
||||
APInt(BitWidth, 1).shl(SA->getLimitedValue(BitWidth)));
|
||||
return SE.getMulExpr(getSCEV(I->getOperand(0)), getSCEV(X));
|
||||
return SE.getMulExpr(getSCEV(U->getOperand(0)), getSCEV(X));
|
||||
}
|
||||
break;
|
||||
|
||||
case Instruction::Trunc:
|
||||
return SE.getTruncateExpr(getSCEV(I->getOperand(0)), I->getType());
|
||||
return SE.getTruncateExpr(getSCEV(U->getOperand(0)), U->getType());
|
||||
|
||||
case Instruction::ZExt:
|
||||
return SE.getZeroExtendExpr(getSCEV(I->getOperand(0)), I->getType());
|
||||
return SE.getZeroExtendExpr(getSCEV(U->getOperand(0)), U->getType());
|
||||
|
||||
case Instruction::SExt:
|
||||
return SE.getSignExtendExpr(getSCEV(I->getOperand(0)), I->getType());
|
||||
return SE.getSignExtendExpr(getSCEV(U->getOperand(0)), U->getType());
|
||||
|
||||
case Instruction::BitCast:
|
||||
// BitCasts are no-op casts so we just eliminate the cast.
|
||||
if (I->getType()->isInteger() &&
|
||||
I->getOperand(0)->getType()->isInteger())
|
||||
return getSCEV(I->getOperand(0));
|
||||
if (U->getType()->isInteger() &&
|
||||
U->getOperand(0)->getType()->isInteger())
|
||||
return getSCEV(U->getOperand(0));
|
||||
break;
|
||||
|
||||
case Instruction::PHI:
|
||||
return createNodeForPHI(cast<PHINode>(I));
|
||||
return createNodeForPHI(cast<PHINode>(U));
|
||||
|
||||
case Instruction::Select:
|
||||
// This could be a smax or umax that was lowered earlier.
|
||||
// Try to recover it.
|
||||
if (ICmpInst *ICI = dyn_cast<ICmpInst>(I->getOperand(0))) {
|
||||
if (ICmpInst *ICI = dyn_cast<ICmpInst>(U->getOperand(0))) {
|
||||
Value *LHS = ICI->getOperand(0);
|
||||
Value *RHS = ICI->getOperand(1);
|
||||
switch (ICI->getPredicate()) {
|
||||
@ -1787,9 +1795,9 @@ SCEVHandle ScalarEvolutionsImpl::createSCEV(Value *V) {
|
||||
// fall through
|
||||
case ICmpInst::ICMP_SGT:
|
||||
case ICmpInst::ICMP_SGE:
|
||||
if (LHS == I->getOperand(1) && RHS == I->getOperand(2))
|
||||
if (LHS == U->getOperand(1) && RHS == U->getOperand(2))
|
||||
return SE.getSMaxExpr(getSCEV(LHS), getSCEV(RHS));
|
||||
else if (LHS == I->getOperand(2) && RHS == I->getOperand(1))
|
||||
else if (LHS == U->getOperand(2) && RHS == U->getOperand(1))
|
||||
// -smax(-x, -y) == smin(x, y).
|
||||
return SE.getNegativeSCEV(SE.getSMaxExpr(
|
||||
SE.getNegativeSCEV(getSCEV(LHS)),
|
||||
@ -1801,9 +1809,9 @@ SCEVHandle ScalarEvolutionsImpl::createSCEV(Value *V) {
|
||||
// fall through
|
||||
case ICmpInst::ICMP_UGT:
|
||||
case ICmpInst::ICMP_UGE:
|
||||
if (LHS == I->getOperand(1) && RHS == I->getOperand(2))
|
||||
if (LHS == U->getOperand(1) && RHS == U->getOperand(2))
|
||||
return SE.getUMaxExpr(getSCEV(LHS), getSCEV(RHS));
|
||||
else if (LHS == I->getOperand(2) && RHS == I->getOperand(1))
|
||||
else if (LHS == U->getOperand(2) && RHS == U->getOperand(1))
|
||||
// ~umax(~x, ~y) == umin(x, y)
|
||||
return SE.getNotSCEV(SE.getUMaxExpr(SE.getNotSCEV(getSCEV(LHS)),
|
||||
SE.getNotSCEV(getSCEV(RHS))));
|
||||
@ -1816,7 +1824,6 @@ SCEVHandle ScalarEvolutionsImpl::createSCEV(Value *V) {
|
||||
default: // We cannot analyze this expression.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return SE.getUnknown(V);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user