From: Nick Lewycky Date: Sun, 22 Oct 2006 21:36:41 +0000 (+0000) Subject: Handle "if ((x|y) != 0)" for ints like we do for bools. Fixes missed X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5062250f361999975c6f1ff306dc3a365dc32e1b;p=oota-llvm.git Handle "if ((x|y) != 0)" for ints like we do for bools. Fixes missed optimization opportunity pointed out by Chris Lattner. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31118 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 4d86f6aa46c..ca0d056e58c 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(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(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(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 00000000000..181952bd908 --- /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 ; [#uses=1] + %tmp = setne int %tmp2, 0 ; [#uses=1] + br bool %tmp, label %cond_true, label %return + +cond_true: ; preds = %entry + %tmp4 = seteq int %x, 0 ; [#uses=1] + br bool %tmp4, label %cond_true5, label %return + +cond_true5: ; preds = %cond_true + %tmp6 = call int %fail( ) ; [#uses=0] + ret int %tmp6 + +return: ; preds = %cond_next7 + ret int 0 +} + +declare int %fail()