summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/InstructionSimplify.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-02-18 18:05:08 +0000
committerSanjay Patel <spatel@rotateright.com>2018-02-18 18:05:08 +0000
commitadf6e88c74b1af1ccf2905d28814a0a971287108 (patch)
treee2eccaece6904144ca707385c75b04c80b26d5d3 /llvm/lib/Analysis/InstructionSimplify.cpp
parent7faceaed31c9a5577aadd9412eef12eebd8dcfcb (diff)
downloadbcm5719-llvm-adf6e88c74b1af1ccf2905d28814a0a971287108.tar.gz
bcm5719-llvm-adf6e88c74b1af1ccf2905d28814a0a971287108.zip
[PatternMatch, InstSimplify] enhance m_AllOnes() to ignore undef elements in vectors
Loosening the matcher definition reveals a subtle bug in InstSimplify (we should not assume that because an operand constant matches that it's safe to return it as a result). So I'm making that change here too (that diff could be independent, but I'm not sure how to reveal it before the matcher change). This also seems like a good reason to *not* include matchers that capture the value. We don't want to encourage the potential misstep of propagating undef values when it's not allowed/intended. I didn't include the capture variant option here or in the related rL325437 (m_One), but it already exists for other constant matchers. llvm-svn: 325466
Diffstat (limited to 'llvm/lib/Analysis/InstructionSimplify.cpp')
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp18
1 files changed, 7 insertions, 11 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 34a10c5d5ea..a424e693842 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -1264,9 +1264,10 @@ static Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
MaxRecurse))
return V;
- // all ones >>a X -> all ones
+ // all ones >>a X -> -1
+ // Do not return Op0 because it may contain undef elements if it's a vector.
if (match(Op0, m_AllOnes()))
- return Op0;
+ return Constant::getAllOnesValue(Op0->getType());
// (X << A) >> A -> X
Value *X;
@@ -1783,21 +1784,16 @@ static Value *SimplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
return C;
// X | undef -> -1
- if (match(Op1, m_Undef()))
+ // X | -1 = -1
+ // Do not return Op1 because it may contain undef elements if it's a vector.
+ if (match(Op1, m_Undef()) || match(Op1, m_AllOnes()))
return Constant::getAllOnesValue(Op0->getType());
// X | X = X
- if (Op0 == Op1)
- return Op0;
-
// X | 0 = X
- if (match(Op1, m_Zero()))
+ if (Op0 == Op1 || match(Op1, m_Zero()))
return Op0;
- // X | -1 = -1
- if (match(Op1, m_AllOnes()))
- return Op1;
-
// A | ~A = ~A | A = -1
if (match(Op0, m_Not(m_Specific(Op1))) ||
match(Op1, m_Not(m_Specific(Op0))))
OpenPOWER on IntegriCloud