diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-12-10 09:14:52 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-12-10 09:14:52 +0000 |
commit | ae707582c024e5db30f13d3fc3a7f21e72c4bc18 (patch) | |
tree | 79fb236821bcc58280ef4e8927a6233e406eaea4 /llvm/lib | |
parent | 0104ff65294a1a56af4b7260a57ed4da9ddf8af7 (diff) | |
download | bcm5719-llvm-ae707582c024e5db30f13d3fc3a7f21e72c4bc18.tar.gz bcm5719-llvm-ae707582c024e5db30f13d3fc3a7f21e72c4bc18.zip |
InstSimplify: [al]shr exact undef, %X -> undef
Exact shifts always keep the non-zero bits of their input. This means
it keeps it's undef bits.
llvm-svn: 223923
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 767b42b4bd7..1c5a917cbec 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1387,8 +1387,10 @@ static Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact, return V; // undef >>l X -> 0 + // undef >>l X -> undef (if it's exact) if (match(Op0, m_Undef())) - return Constant::getNullValue(Op0->getType()); + return isExact ? UndefValue::get(Op0->getType()) + : Constant::getNullValue(Op0->getType()); // (X << A) >> A -> X Value *X; @@ -1421,8 +1423,10 @@ static Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact, return Op0; // undef >>a X -> all ones + // undef >>a X -> undef (if it's exact) if (match(Op0, m_Undef())) - return Constant::getAllOnesValue(Op0->getType()); + return isExact ? UndefValue::get(Op0->getType()) + : Constant::getAllOnesValue(Op0->getType()); // (X << A) >> A -> X Value *X; |