diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-06-09 16:30:42 +0000 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-06-09 16:30:42 +0000 |
commit | d669758d84217f7e057740053783e012369337d0 (patch) | |
tree | 8bcb60a4779edb10702d06d75d5475a736915fdb /llvm/lib | |
parent | ff0c99b0177ddb091aea24576559dad6d00630ba (diff) | |
download | bcm5719-llvm-d669758d84217f7e057740053783e012369337d0.tar.gz bcm5719-llvm-d669758d84217f7e057740053783e012369337d0.zip |
[InstCombine] foldICmpWithLowBitMaskedVal(): 'icmp sgt/sle': avoid miscompiles
A precondition 'x != 0' was forgotten by me:
https://rise4fun.com/Alive/JFNP
https://rise4fun.com/Alive/jHvL
These 4 folds with non-constants could be re-enabled,
but for now let's go for the simplest solution.
https://bugs.llvm.org/show_bug.cgi?id=42198
llvm-svn: 362911
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index a04e56916f8..0cfd930003a 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3110,6 +3110,10 @@ static Value *foldICmpWithLowBitMaskedVal(ICmpInst &I, // x s> x & (-1 >> y) -> x s> (-1 >> y) if (X != I.getOperand(0)) // X must be on LHS of comparison! return nullptr; // Ignore the other case. + if (!match(M, m_Constant())) // Can not do this fold with non-constant. + return nullptr; + if (!match(M, m_NonNegative())) // Must not have any -1 vector elements. + return nullptr; DstPred = ICmpInst::Predicate::ICMP_SGT; break; case ICmpInst::Predicate::ICMP_SGE: @@ -3136,6 +3140,10 @@ static Value *foldICmpWithLowBitMaskedVal(ICmpInst &I, // x s<= x & (-1 >> y) -> x s<= (-1 >> y) if (X != I.getOperand(0)) // X must be on LHS of comparison! return nullptr; // Ignore the other case. + if (!match(M, m_Constant())) // Can not do this fold with non-constant. + return nullptr; + if (!match(M, m_NonNegative())) // Must not have any -1 vector elements. + return nullptr; DstPred = ICmpInst::Predicate::ICMP_SLE; break; default: |