mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-24 13:18:17 +00:00
Move "A | ~(A & ?) -> -1" from InstCombine to InstructionSimplify.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126082 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1919,24 +1919,16 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {
|
||||
|
||||
// A | ~(A | B) -> A | ~B
|
||||
// A | ~(A ^ B) -> A | ~B
|
||||
// A | ~(A & B) -> -1
|
||||
if (match(Op1, m_Not(m_Value(A))))
|
||||
if (BinaryOperator *B = dyn_cast<BinaryOperator>(A))
|
||||
if (Op0 == B->getOperand(0) || Op0 == B->getOperand(1))
|
||||
switch (B->getOpcode()) {
|
||||
default: break;
|
||||
case Instruction::Or:
|
||||
case Instruction::Xor:
|
||||
if (Op1->hasOneUse()) {
|
||||
Value *NotOp = Op0 == B->getOperand(0) ? B->getOperand(1) :
|
||||
B->getOperand(0);
|
||||
Value *Not = Builder->CreateNot(NotOp, NotOp->getName()+".not");
|
||||
return BinaryOperator::CreateOr(Not, Op0);
|
||||
}
|
||||
break;
|
||||
case Instruction::And:
|
||||
return ReplaceInstUsesWith(I, Constant::getAllOnesValue(I.getType()));
|
||||
}
|
||||
if ((Op0 == B->getOperand(0) || Op0 == B->getOperand(1)) &&
|
||||
Op1->hasOneUse() && (B->getOpcode() == Instruction::Or ||
|
||||
B->getOpcode() == Instruction::Xor)) {
|
||||
Value *NotOp = Op0 == B->getOperand(0) ? B->getOperand(1) :
|
||||
B->getOperand(0);
|
||||
Value *Not = Builder->CreateNot(NotOp, NotOp->getName()+".not");
|
||||
return BinaryOperator::CreateOr(Not, Op0);
|
||||
}
|
||||
|
||||
if (ICmpInst *RHS = dyn_cast<ICmpInst>(I.getOperand(1)))
|
||||
if (ICmpInst *LHS = dyn_cast<ICmpInst>(I.getOperand(0)))
|
||||
|
||||
Reference in New Issue
Block a user