forked from OSchip/llvm-project
[LVI] Extract helper for binary range calculations; NFC
llvm-svn: 361692
This commit is contained in:
parent
46e5052b8e
commit
17367b0d89
|
@ -422,6 +422,10 @@ namespace {
|
||||||
BasicBlock *BB);
|
BasicBlock *BB);
|
||||||
Optional<ConstantRange> getRangeForOperand(unsigned Op, Instruction *I,
|
Optional<ConstantRange> getRangeForOperand(unsigned Op, Instruction *I,
|
||||||
BasicBlock *BB);
|
BasicBlock *BB);
|
||||||
|
bool solveBlockValueBinaryOpImpl(
|
||||||
|
ValueLatticeElement &BBLV, Instruction *I, BasicBlock *BB,
|
||||||
|
std::function<ConstantRange(const ConstantRange &,
|
||||||
|
const ConstantRange &)> OpFn);
|
||||||
bool solveBlockValueBinaryOp(ValueLatticeElement &BBLV, BinaryOperator *BBI,
|
bool solveBlockValueBinaryOp(ValueLatticeElement &BBLV, BinaryOperator *BBI,
|
||||||
BasicBlock *BB);
|
BasicBlock *BB);
|
||||||
bool solveBlockValueCast(ValueLatticeElement &BBLV, CastInst *CI,
|
bool solveBlockValueCast(ValueLatticeElement &BBLV, CastInst *CI,
|
||||||
|
@ -1040,6 +1044,26 @@ bool LazyValueInfoImpl::solveBlockValueCast(ValueLatticeElement &BBLV,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LazyValueInfoImpl::solveBlockValueBinaryOpImpl(
|
||||||
|
ValueLatticeElement &BBLV, Instruction *I, BasicBlock *BB,
|
||||||
|
std::function<ConstantRange(const ConstantRange &,
|
||||||
|
const ConstantRange &)> OpFn) {
|
||||||
|
// Figure out the ranges of the operands. If that fails, use a
|
||||||
|
// conservative range, but apply the transfer rule anyways. This
|
||||||
|
// lets us pick up facts from expressions like "and i32 (call i32
|
||||||
|
// @foo()), 32"
|
||||||
|
Optional<ConstantRange> LHSRes = getRangeForOperand(0, I, BB);
|
||||||
|
Optional<ConstantRange> RHSRes = getRangeForOperand(1, I, BB);
|
||||||
|
if (!LHSRes.hasValue() || !RHSRes.hasValue())
|
||||||
|
// More work to do before applying this transfer rule.
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ConstantRange LHSRange = LHSRes.getValue();
|
||||||
|
ConstantRange RHSRange = RHSRes.getValue();
|
||||||
|
BBLV = ValueLatticeElement::getRange(OpFn(LHSRange, RHSRange));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool LazyValueInfoImpl::solveBlockValueBinaryOp(ValueLatticeElement &BBLV,
|
bool LazyValueInfoImpl::solveBlockValueBinaryOp(ValueLatticeElement &BBLV,
|
||||||
BinaryOperator *BO,
|
BinaryOperator *BO,
|
||||||
BasicBlock *BB) {
|
BasicBlock *BB) {
|
||||||
|
@ -1060,8 +1084,10 @@ bool LazyValueInfoImpl::solveBlockValueBinaryOp(ValueLatticeElement &BBLV,
|
||||||
case Instruction::AShr:
|
case Instruction::AShr:
|
||||||
case Instruction::And:
|
case Instruction::And:
|
||||||
case Instruction::Or:
|
case Instruction::Or:
|
||||||
// continue into the code below
|
return solveBlockValueBinaryOpImpl(BBLV, BO, BB,
|
||||||
break;
|
[BO](const ConstantRange &CR1, const ConstantRange &CR2) {
|
||||||
|
return CR1.binaryOp(BO->getOpcode(), CR2);
|
||||||
|
});
|
||||||
default:
|
default:
|
||||||
// Unhandled instructions are overdefined.
|
// Unhandled instructions are overdefined.
|
||||||
LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
|
LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
|
||||||
|
@ -1069,27 +1095,6 @@ bool LazyValueInfoImpl::solveBlockValueBinaryOp(ValueLatticeElement &BBLV,
|
||||||
BBLV = ValueLatticeElement::getOverdefined();
|
BBLV = ValueLatticeElement::getOverdefined();
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Figure out the ranges of the operands. If that fails, use a
|
|
||||||
// conservative range, but apply the transfer rule anyways. This
|
|
||||||
// lets us pick up facts from expressions like "and i32 (call i32
|
|
||||||
// @foo()), 32"
|
|
||||||
Optional<ConstantRange> LHSRes = getRangeForOperand(0, BO, BB);
|
|
||||||
Optional<ConstantRange> RHSRes = getRangeForOperand(1, BO, BB);
|
|
||||||
|
|
||||||
if (!LHSRes.hasValue() || !RHSRes.hasValue())
|
|
||||||
// More work to do before applying this transfer rule.
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ConstantRange LHSRange = LHSRes.getValue();
|
|
||||||
ConstantRange RHSRange = RHSRes.getValue();
|
|
||||||
|
|
||||||
// NOTE: We're currently limited by the set of operations that ConstantRange
|
|
||||||
// can evaluate symbolically. Enhancing that set will allows us to analyze
|
|
||||||
// more definitions.
|
|
||||||
Instruction::BinaryOps BinOp = BO->getOpcode();
|
|
||||||
BBLV = ValueLatticeElement::getRange(LHSRange.binaryOp(BinOp, RHSRange));
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ValueLatticeElement getValueFromICmpCondition(Value *Val, ICmpInst *ICI,
|
static ValueLatticeElement getValueFromICmpCondition(Value *Val, ICmpInst *ICI,
|
||||||
|
|
Loading…
Reference in New Issue