diff options
author | Craig Topper <craig.topper@intel.com> | 2017-08-10 17:48:14 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2017-08-10 17:48:14 +0000 |
commit | 57b4d8646ba1ae4385d04e2448c15f0c61790cb7 (patch) | |
tree | 9d1e5d9341119384e54bbea55ab3c4e9c5ede656 /llvm/lib/Transforms | |
parent | cd13ebca5feb96a415119adbcd9a6df4f08f9d60 (diff) | |
download | bcm5719-llvm-57b4d8646ba1ae4385d04e2448c15f0c61790cb7.tar.gz bcm5719-llvm-57b4d8646ba1ae4385d04e2448c15f0c61790cb7.zip |
[InstCombine] Fix a crash in getSelectCondition if we happen to have two inverse vectors of i1 constants.
We used to try to truncate the constant vector to vXi1, but if it's already i1 this would fail. Instead we now use IRBuilder::getZExtOrTrunc which should check the type and only create a trunc if needed. I believe this should trigger constant folding in the IRBuilder and ultimately do the same thing just with the additional type check.
llvm-svn: 310639
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 0aea1edb0d0..bc8b0496ec7 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -1494,8 +1494,9 @@ static Value *getSelectCondition(Value *A, Value *B, // If both operands are constants, see if the constants are inverse bitmasks. Constant *AC, *BC; if (match(A, m_Constant(AC)) && match(B, m_Constant(BC)) && - areInverseVectorBitmasks(AC, BC)) - return ConstantExpr::getTrunc(AC, CmpInst::makeCmpResultType(Ty)); + areInverseVectorBitmasks(AC, BC)) { + return Builder.CreateZExtOrTrunc(AC, CmpInst::makeCmpResultType(Ty)); + } // If both operands are xor'd with constants using the same sexted boolean // operand, see if the constants are inverse bitmasks. |