diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-11-06 11:28:22 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-11-06 11:28:22 +0000 |
commit | c1da5f757e5f0bbf7857d54348a94c88cff0cb64 (patch) | |
tree | ea7a321fd0f11ed4422f24b3c2e1feb7e8190840 /llvm/lib | |
parent | abbd713eb7417f3638541b75b8aff051d2f48377 (diff) | |
download | llvm-c1da5f757e5f0bbf7857d54348a94c88cff0cb64.zip llvm-c1da5f757e5f0bbf7857d54348a94c88cff0cb64.tar.gz llvm-c1da5f757e5f0bbf7857d54348a94c88cff0cb64.tar.bz2 |
[InstCombine] Ensure nested shifts are in range (OSS-Fuzz #9880)
llvm-svn: 346225
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp index 045ce42..c562d45 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp @@ -725,9 +725,9 @@ Instruction *InstCombiner::visitLShr(BinaryOperator &I) { Value *X; const APInt *ShOp1; - if (match(Op0, m_Shl(m_Value(X), m_APInt(ShOp1)))) { - unsigned ShlAmt = ShOp1->getZExtValue(); - if (ShlAmt < ShAmt) { + if (match(Op0, m_Shl(m_Value(X), m_APInt(ShOp1))) && ShOp1->ult(BitWidth)) { + if (ShOp1->ult(ShAmt)) { + unsigned ShlAmt = ShOp1->getZExtValue(); Constant *ShiftDiff = ConstantInt::get(Ty, ShAmt - ShlAmt); if (cast<BinaryOperator>(Op0)->hasNoUnsignedWrap()) { // (X <<nuw C1) >>u C2 --> X >>u (C2 - C1) @@ -740,7 +740,8 @@ Instruction *InstCombiner::visitLShr(BinaryOperator &I) { APInt Mask(APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt)); return BinaryOperator::CreateAnd(NewLShr, ConstantInt::get(Ty, Mask)); } - if (ShlAmt > ShAmt) { + if (ShOp1->ugt(ShAmt)) { + unsigned ShlAmt = ShOp1->getZExtValue(); Constant *ShiftDiff = ConstantInt::get(Ty, ShlAmt - ShAmt); if (cast<BinaryOperator>(Op0)->hasNoUnsignedWrap()) { // (X <<nuw C1) >>u C2 --> X <<nuw (C1 - C2) @@ -753,7 +754,7 @@ Instruction *InstCombiner::visitLShr(BinaryOperator &I) { APInt Mask(APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt)); return BinaryOperator::CreateAnd(NewShl, ConstantInt::get(Ty, Mask)); } - assert(ShlAmt == ShAmt); + assert(*ShOp1 == ShAmt); // (X << C) >>u C --> X & (-1 >>u C) APInt Mask(APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt)); return BinaryOperator::CreateAnd(X, ConstantInt::get(Ty, Mask)); |