forked from OSchip/llvm-project
[SCEV] List all binops in getOperandsToCreate()
Explicitly list all binops rather than having a default case. There were two bugs here: 1. U->getOpcode() was used instead of BO->Opcode, which means we used the logic for the wrong opcode in some cases. 2. SCEV construction does not support LShr. We should return unknown for it rather than recursing into the operands.
This commit is contained in:
parent
c720b6fddd
commit
2659e1bf4b
|
@ -7249,7 +7249,7 @@ ScalarEvolution::getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops) {
|
|||
Operator *U = cast<Operator>(V);
|
||||
if (auto BO = MatchBinaryOp(U, DT)) {
|
||||
bool IsConstArg = isa<ConstantInt>(BO->RHS);
|
||||
switch (U->getOpcode()) {
|
||||
switch (BO->Opcode) {
|
||||
case Instruction::Add: {
|
||||
// For additions and multiplications, traverse add/mul chains for which we
|
||||
// can potentially create a single SCEV, to reduce the number of
|
||||
|
@ -7291,7 +7291,10 @@ ScalarEvolution::getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops) {
|
|||
} while (true);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
case Instruction::Sub:
|
||||
case Instruction::UDiv:
|
||||
case Instruction::URem:
|
||||
break;
|
||||
case Instruction::AShr:
|
||||
case Instruction::Shl:
|
||||
case Instruction::Xor:
|
||||
|
@ -7303,7 +7306,10 @@ ScalarEvolution::getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops) {
|
|||
if (!IsConstArg && BO->LHS->getType()->isIntegerTy(1))
|
||||
return nullptr;
|
||||
break;
|
||||
case Instruction::LShr:
|
||||
return getUnknown(V);
|
||||
default:
|
||||
llvm_unreachable("Unhandled binop");
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue