aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2020-03-22 12:16:42 +0100
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2020-03-22 14:45:31 +0100
commitd077d678d34efdb811e6e2e05ef4417770806d1b (patch)
tree7d359404a48abd08813e270c5aef0ad0e1ee87f1 /llvm/lib/Analysis/ValueTracking.cpp
parenta63eaa5449fac237d492bd725a88fabf39881dc2 (diff)
downloadllvm-d077d678d34efdb811e6e2e05ef4417770806d1b.zip
llvm-d077d678d34efdb811e6e2e05ef4417770806d1b.tar.gz
llvm-d077d678d34efdb811e6e2e05ef4417770806d1b.tar.bz2
[ValueTracking] Avoid blind cast from Operator to Instruction
Summary: Avoid blind cast from Operator to ExtractElementInst in computeKnownBitsFromOperator. This resulted in some crashes in downstream fuzzy testing. Instead we use getOperand directly on the Operator when accessing the vector/index operands. Haven't seen any problems with InsertElement and ShuffleVector, but I believe those could be used in constant expressions as well. So the same kind of fix as for ExtractElement was also applied for InsertElement. When it comes to ShuffleVector we now simply bail out if a dynamic cast of the Operator to ShuffleVectorInst fails. I've got no reproducer indicating problems for ShuffleVector, and a fix would be slightly more complicated as getShuffleDemandedElts is involved. Reviewers: RKSimon, nikic, spatel, efriedma Reviewed By: RKSimon Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D76564
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 9a93b55..d612e2e 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1737,7 +1737,12 @@ static void computeKnownBitsFromOperator(const Operator *I,
}
break;
case Instruction::ShuffleVector: {
- auto *Shuf = cast<ShuffleVectorInst>(I);
+ auto *Shuf = dyn_cast<ShuffleVectorInst>(I);
+ // FIXME: Do we need to handle ConstantExpr involving shufflevectors?
+ if (!Shuf) {
+ Known.resetAll();
+ return;
+ }
// For undef elements, we don't know anything about the common state of
// the shuffle result.
APInt DemandedLHS, DemandedRHS;
@@ -1763,10 +1768,9 @@ static void computeKnownBitsFromOperator(const Operator *I,
break;
}
case Instruction::InsertElement: {
- auto *IEI = cast<InsertElementInst>(I);
- Value *Vec = IEI->getOperand(0);
- Value *Elt = IEI->getOperand(1);
- auto *CIdx = dyn_cast<ConstantInt>(IEI->getOperand(2));
+ const Value *Vec = I->getOperand(0);
+ const Value *Elt = I->getOperand(1);
+ auto *CIdx = dyn_cast<ConstantInt>(I->getOperand(2));
// Early out if the index is non-constant or out-of-range.
unsigned NumElts = DemandedElts.getBitWidth();
if (!CIdx || CIdx->getValue().uge(NumElts)) {
@@ -1796,9 +1800,8 @@ static void computeKnownBitsFromOperator(const Operator *I,
case Instruction::ExtractElement: {
// Look through extract element. If the index is non-constant or
// out-of-range demand all elements, otherwise just the extracted element.
- auto* EEI = cast<ExtractElementInst>(I);
- const Value* Vec = EEI->getVectorOperand();
- const Value* Idx = EEI->getIndexOperand();
+ const Value *Vec = I->getOperand(0);
+ const Value *Idx = I->getOperand(1);
auto *CIdx = dyn_cast<ConstantInt>(Idx);
unsigned NumElts = Vec->getType()->getVectorNumElements();
APInt DemandedVecElts = APInt::getAllOnesValue(NumElts);