mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +00:00
IC: (X & C1) | C2 --> (X | C2) & (C1|C2)
IC: (X ^ C1) | C2 --> (X | C2) ^ (C1&~C2) We are now guaranteed that all 'or's will be inside of 'and's, and all 'and's will be inside of 'xor's, if the second operands are constants. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7264 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
31a7f85346
commit
ad44ebfff0
@ -538,10 +538,35 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {
|
||||
return ReplaceInstUsesWith(I, Op0);
|
||||
|
||||
// or X, -1 == -1
|
||||
if (ConstantIntegral *RHS = dyn_cast<ConstantIntegral>(Op1))
|
||||
if (ConstantIntegral *RHS = dyn_cast<ConstantIntegral>(Op1)) {
|
||||
if (RHS->isAllOnesValue())
|
||||
return ReplaceInstUsesWith(I, Op1);
|
||||
|
||||
if (Instruction *Op0I = dyn_cast<Instruction>(Op0)) {
|
||||
// (X & C1) | C2 --> (X | C2) & (C1|C2)
|
||||
if (Op0I->getOpcode() == Instruction::And && isOnlyUse(Op0))
|
||||
if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) {
|
||||
std::string Op0Name = Op0I->getName(); Op0I->setName("");
|
||||
Instruction *Or = BinaryOperator::create(Instruction::Or,
|
||||
Op0I->getOperand(0), RHS,
|
||||
Op0Name);
|
||||
InsertNewInstBefore(Or, I);
|
||||
return BinaryOperator::create(Instruction::And, Or, *RHS | *Op0CI);
|
||||
}
|
||||
|
||||
// (X ^ C1) | C2 --> (X | C2) ^ (C1&~C2)
|
||||
if (Op0I->getOpcode() == Instruction::Xor && isOnlyUse(Op0))
|
||||
if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) {
|
||||
std::string Op0Name = Op0I->getName(); Op0I->setName("");
|
||||
Instruction *Or = BinaryOperator::create(Instruction::Or,
|
||||
Op0I->getOperand(0), RHS,
|
||||
Op0Name);
|
||||
InsertNewInstBefore(Or, I);
|
||||
return BinaryOperator::create(Instruction::Xor, Or, *Op0CI & *~*RHS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Value *Op0NotVal = dyn_castNotVal(Op0);
|
||||
Value *Op1NotVal = dyn_castNotVal(Op1);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user