forked from OSchip/llvm-project
Handle "if ((x|y) != 0)" for ints like we do for bools. Fixes missed
optimization opportunity pointed out by Chris Lattner. llvm-svn: 31118
This commit is contained in:
parent
76dd3bb34a
commit
2c734f3fc1
|
@ -334,32 +334,35 @@ namespace {
|
||||||
if (V1 == ConstantBool::getFalse())
|
if (V1 == ConstantBool::getFalse())
|
||||||
add(Opcode, BO->getOperand(0), BO->getOperand(1), true);
|
add(Opcode, BO->getOperand(0), BO->getOperand(1), true);
|
||||||
break;
|
break;
|
||||||
case Instruction::And:
|
case Instruction::And: {
|
||||||
if (V1 == ConstantBool::getTrue()) {
|
ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1);
|
||||||
|
if (CI && CI->isAllOnesValue()) {
|
||||||
add(Opcode, V1, BO->getOperand(0), false);
|
add(Opcode, V1, BO->getOperand(0), false);
|
||||||
add(Opcode, V1, BO->getOperand(1), false);
|
add(Opcode, V1, BO->getOperand(1), false);
|
||||||
}
|
}
|
||||||
break;
|
} break;
|
||||||
case Instruction::Or:
|
case Instruction::Or: {
|
||||||
if (V1 == ConstantBool::getFalse()) {
|
ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1);
|
||||||
|
if (CI && CI->isNullValue()) {
|
||||||
add(Opcode, V1, BO->getOperand(0), false);
|
add(Opcode, V1, BO->getOperand(0), false);
|
||||||
add(Opcode, V1, BO->getOperand(1), false);
|
add(Opcode, V1, BO->getOperand(1), false);
|
||||||
}
|
}
|
||||||
break;
|
} break;
|
||||||
case Instruction::Xor:
|
case Instruction::Xor: {
|
||||||
if (V1 == ConstantBool::getTrue()) {
|
ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V1);
|
||||||
|
if (CI->isAllOnesValue()) {
|
||||||
if (BO->getOperand(0) == V1)
|
if (BO->getOperand(0) == V1)
|
||||||
add(Opcode, ConstantBool::getFalse(), BO->getOperand(1), false);
|
add(Opcode, ConstantBool::getFalse(), BO->getOperand(1), false);
|
||||||
if (BO->getOperand(1) == V1)
|
if (BO->getOperand(1) == V1)
|
||||||
add(Opcode, ConstantBool::getFalse(), BO->getOperand(0), false);
|
add(Opcode, ConstantBool::getFalse(), BO->getOperand(0), false);
|
||||||
}
|
}
|
||||||
if (V1 == ConstantBool::getFalse()) {
|
if (CI->isNullValue()) {
|
||||||
if (BO->getOperand(0) == ConstantBool::getTrue())
|
if (BO->getOperand(0) == ConstantBool::getTrue())
|
||||||
add(Opcode, ConstantBool::getTrue(), BO->getOperand(1), false);
|
add(Opcode, ConstantBool::getTrue(), BO->getOperand(1), false);
|
||||||
if (BO->getOperand(1) == ConstantBool::getTrue())
|
if (BO->getOperand(1) == ConstantBool::getTrue())
|
||||||
add(Opcode, ConstantBool::getTrue(), BO->getOperand(0), false);
|
add(Opcode, ConstantBool::getTrue(), BO->getOperand(0), false);
|
||||||
}
|
}
|
||||||
break;
|
} break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
Loading…
Reference in New Issue