aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/PredicateSimplifier.cpp23
-rw-r--r--test/Transforms/PredicateSimplifier/2006-10-22-IntOr.ll21
2 files changed, 34 insertions, 10 deletions
diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp
index 4d86f6a..ca0d056 100644
--- a/lib/Transforms/Scalar/PredicateSimplifier.cpp
+++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp
@@ -334,32 +334,35 @@ namespace {
if (V1 == ConstantBool::getFalse())
add(Opcode, BO->getOperand(0), BO->getOperand(1), true);
break;
- case Instruction::And:
- if (V1 == ConstantBool::getTrue()) {
+ case Instruction::And: {
+ ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1);
+ if (CI && CI->isAllOnesValue()) {
add(Opcode, V1, BO->getOperand(0), false);
add(Opcode, V1, BO->getOperand(1), false);
}
- break;
- case Instruction::Or:
- if (V1 == ConstantBool::getFalse()) {
+ } break;
+ case Instruction::Or: {
+ ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1);
+ if (CI && CI->isNullValue()) {
add(Opcode, V1, BO->getOperand(0), false);
add(Opcode, V1, BO->getOperand(1), false);
}
- break;
- case Instruction::Xor:
- if (V1 == ConstantBool::getTrue()) {
+ } break;
+ case Instruction::Xor: {
+ ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1);
+ 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 (V1 == ConstantBool::getFalse()) {
+ 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);
}
- break;
+ } break;
default:
break;
}
diff --git a/test/Transforms/PredicateSimplifier/2006-10-22-IntOr.ll b/test/Transforms/PredicateSimplifier/2006-10-22-IntOr.ll
new file mode 100644
index 0000000..181952b
--- /dev/null
+++ b/test/Transforms/PredicateSimplifier/2006-10-22-IntOr.ll
@@ -0,0 +1,21 @@
+; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | not grep fail
+
+int %f(int %x, int %y) {
+entry:
+ %tmp2 = or int %x, %y ; <int> [#uses=1]
+ %tmp = setne int %tmp2, 0 ; <bool> [#uses=1]
+ br bool %tmp, label %cond_true, label %return
+
+cond_true: ; preds = %entry
+ %tmp4 = seteq int %x, 0 ; <bool> [#uses=1]
+ br bool %tmp4, label %cond_true5, label %return
+
+cond_true5: ; preds = %cond_true
+ %tmp6 = call int %fail( ) ; <int> [#uses=0]
+ ret int %tmp6
+
+return: ; preds = %cond_next7
+ ret int 0
+}
+
+declare int %fail()