mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-25 00:35:30 +00:00
- InstCombine: (X | C1) & C2 --> X & C2 iff C1 & C1 == 0
- InstCombine: (X | C) & C --> C - InstCombine: (X | C1) & C2 --> (X | (C1&C2)) & C2 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7269 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b5cfb6cb1a
commit
5840326ae6
@ -497,16 +497,39 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
|
||||
if (RHS->isAllOnesValue())
|
||||
return ReplaceInstUsesWith(I, Op0);
|
||||
|
||||
// (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
|
||||
if (Instruction *Op0I = dyn_cast<Instruction>(Op0))
|
||||
if (Op0I->getOpcode() == Instruction::Xor && isOnlyUse(Op0))
|
||||
if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) {
|
||||
std::string Op0Name = Op0I->getName(); Op0I->setName("");
|
||||
Instruction *And = BinaryOperator::create(Instruction::And,
|
||||
Op0I->getOperand(0), RHS,
|
||||
Op0Name);
|
||||
InsertNewInstBefore(And, I);
|
||||
return BinaryOperator::create(Instruction::Xor, And, *RHS & *Op0CI);
|
||||
if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0))
|
||||
if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1)))
|
||||
if (Op0I->getOpcode() == Instruction::Xor) {
|
||||
if (isOnlyUse(Op0)) {
|
||||
// (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
|
||||
std::string Op0Name = Op0I->getName(); Op0I->setName("");
|
||||
Instruction *And = BinaryOperator::create(Instruction::And,
|
||||
Op0I->getOperand(0), RHS,
|
||||
Op0Name);
|
||||
InsertNewInstBefore(And, I);
|
||||
return BinaryOperator::create(Instruction::Xor, And, *RHS & *Op0CI);
|
||||
}
|
||||
} else if (Op0I->getOpcode() == Instruction::Or) {
|
||||
// (X | C1) & C2 --> X & C2 iff C1 & C1 == 0
|
||||
if ((*RHS & *Op0CI)->isNullValue())
|
||||
return BinaryOperator::create(Instruction::And, Op0I->getOperand(0),
|
||||
RHS);
|
||||
|
||||
Constant *Together = *RHS & *Op0CI;
|
||||
if (Together == RHS) // (X | C) & C --> C
|
||||
return ReplaceInstUsesWith(I, RHS);
|
||||
|
||||
if (isOnlyUse(Op0)) {
|
||||
if (Together != Op0CI) {
|
||||
// (X | C1) & C2 --> (X | (C1&C2)) & C2
|
||||
std::string Op0Name = Op0I->getName(); Op0I->setName("");
|
||||
Instruction *Or = BinaryOperator::create(Instruction::Or,
|
||||
Op0I->getOperand(0),
|
||||
Together, Op0Name);
|
||||
InsertNewInstBefore(Or, I);
|
||||
return BinaryOperator::create(Instruction::And, Or, RHS);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user