diff options
author | Dan Gohman <gohman@apple.com> | 2011-07-01 01:03:43 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2011-07-01 01:03:43 +0000 |
commit | 68c0dbc14fb7599987fb3e27be4e12c1ac36535e (patch) | |
tree | d1eb614605e080339290cc5405e433c3b2ffd0ea /lib/VMCore/ConstantFold.cpp | |
parent | 5e653c925c7da969c3fb5fa9a46263ffb160b81e (diff) | |
download | llvm-68c0dbc14fb7599987fb3e27be4e12c1ac36535e.tar.gz llvm-68c0dbc14fb7599987fb3e27be4e12c1ac36535e.tar.bz2 llvm-68c0dbc14fb7599987fb3e27be4e12c1ac36535e.tar.xz |
Improve constant folding of undef for cmp and select operators.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134223 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/ConstantFold.cpp')
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 8cca06fdda..b7a1350ff5 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -730,9 +730,12 @@ Constant *llvm::ConstantFoldSelectInstruction(Constant *Cond, } + if (isa<UndefValue>(Cond)) { + if (isa<UndefValue>(V1)) return V1; + return V2; + } if (isa<UndefValue>(V1)) return V2; if (isa<UndefValue>(V2)) return V1; - if (isa<UndefValue>(Cond)) return V1; if (V1 == V2) return V1; if (ConstantExpr *TrueVal = dyn_cast<ConstantExpr>(V1)) { @@ -1851,7 +1854,9 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred, if (isa<UndefValue>(C1) || isa<UndefValue>(C2)) { // For EQ and NE, we can always pick a value for the undef to make the // predicate pass or fail, so we can return undef. - if (ICmpInst::isEquality(ICmpInst::Predicate(pred))) + // Also, if both operands are undef, we can return undef. + if (ICmpInst::isEquality(ICmpInst::Predicate(pred)) || + (isa<UndefValue>(C1) && isa<UndefValue>(C2))) return UndefValue::get(ResultTy); // Otherwise, pick the same value as the non-undef operand, and fold // it to true or false. |