diff options
author | Florian Hahn <flo@fhahn.com> | 2020-11-03 10:32:38 +0000 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2020-11-03 12:58:39 +0000 |
commit | d68bed0fa94e133f79c14248621f8c5544f7bdd9 (patch) | |
tree | 3d519cadc01ce93bf2c85a93387dfa9ddc77cbeb /llvm/lib | |
parent | bd32386410402e5f8d6b1f84f36e6846ef9d814c (diff) | |
download | llvm-d68bed0fa94e133f79c14248621f8c5544f7bdd9.zip llvm-d68bed0fa94e133f79c14248621f8c5544f7bdd9.tar.gz llvm-d68bed0fa94e133f79c14248621f8c5544f7bdd9.tar.bz2 |
[SCCP] Handle bitcast of vector constants.
Vectors where all elements have the same known constant range are treated as a
single constant range in the lattice. When bitcasting such vectors, there is a
mis-match between the width of the lattice value (single constant range) and
the original operands (vector). Go to overdefined in that case.
Fixes PR47991.
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index b3732c1..24b4da6 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -843,6 +843,16 @@ void SCCPSolver::visitCastInst(CastInst &I) { auto &LV = getValueState(&I); ConstantRange OpRange = OpSt.getConstantRange(); Type *DestTy = I.getDestTy(); + // Vectors where all elements have the same known constant range are treated + // as a single constant range in the lattice. When bitcasting such vectors, + // there is a mis-match between the width of the lattice value (single + // constant range) and the original operands (vector). Go to overdefined in + // that case. + if (I.getOpcode() == Instruction::BitCast && + I.getOperand(0)->getType()->isVectorTy() && + OpRange.getBitWidth() < DL.getTypeSizeInBits(DestTy)) + return (void)markOverdefined(&I); + ConstantRange Res = OpRange.castOp(I.getOpcode(), DL.getTypeSizeInBits(DestTy)); mergeInValue(LV, &I, ValueLatticeElement::getRange(Res)); |