diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2006-10-22 22:22:58 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2006-10-22 22:22:58 +0000 |
commit | 7e189d095e2cb28ce0d845fcee3b8517e41adcc0 (patch) | |
tree | be7b75d16983e33f690bda95e6b3939deb5a3fea /lib | |
parent | ecb8d0635638bbf1125c836152e2085e28bf13a8 (diff) |
Fix similar missing optimization opportunity in XOR.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31123 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/PredicateSimplifier.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 6cda6d257d..d1fe10668c 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -349,19 +349,28 @@ namespace { } } break; case Instruction::Xor: { - ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1); - if (!CI) break; - if (CI->isAllOnesValue()) { - if (BO->getOperand(0) == V1) - add(Opcode, ConstantBool::getFalse(), BO->getOperand(1), false); - if (BO->getOperand(1) == V1) - add(Opcode, ConstantBool::getFalse(), BO->getOperand(0), false); - } - if (CI->isNullValue()) { - if (BO->getOperand(0) == ConstantBool::getTrue()) - add(Opcode, ConstantBool::getTrue(), BO->getOperand(1), false); - if (BO->getOperand(1) == ConstantBool::getTrue()) - add(Opcode, ConstantBool::getTrue(), BO->getOperand(0), false); + if (ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1)) { + const Type *Ty = BO->getType(); + if (CI->isAllOnesValue()) { + if (BO->getOperand(0) == V1) + add(Opcode, Constant::getNullValue(Ty), + BO->getOperand(1), false); + if (BO->getOperand(1) == V1) + add(Opcode, Constant::getNullValue(Ty), + BO->getOperand(0), false); + } + if (CI->isNullValue()) { + ConstantIntegral *Op0 = + dyn_cast<ConstantIntegral>(BO->getOperand(0)); + ConstantIntegral *Op1 = + dyn_cast<ConstantIntegral>(BO->getOperand(1)); + if (Op0 && Op0->isAllOnesValue()) + add(Opcode, ConstantIntegral::getAllOnesValue(Ty), + BO->getOperand(1), false); + if (Op1 && Op1->isAllOnesValue()) + add(Opcode, ConstantIntegral::getAllOnesValue(Ty), + BO->getOperand(0), false); + } } } break; default: |