mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Move optimization of some cases of (A & C1)|(B & C2) from instcombine to instsimplify. Patch by Rahul Jain, plus some last minute changes by me -- you can blame me for any bugs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211252 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1625,6 +1625,38 @@ static Value *SimplifyOrInst(Value *Op0, Value *Op1, const Query &Q,
|
||||
MaxRecurse))
|
||||
return V;
|
||||
|
||||
// (A & C)|(B & D)
|
||||
Value *C = nullptr, *D = nullptr;
|
||||
if (match(Op0, m_And(m_Value(A), m_Value(C))) &&
|
||||
match(Op1, m_And(m_Value(B), m_Value(D)))) {
|
||||
ConstantInt *C1 = dyn_cast<ConstantInt>(C);
|
||||
ConstantInt *C2 = dyn_cast<ConstantInt>(D);
|
||||
if (C1 && C2 && (C1->getValue() == ~C2->getValue())) {
|
||||
// (A & C1)|(B & C2)
|
||||
// If we have: ((V + N) & C1) | (V & C2)
|
||||
// .. and C2 = ~C1 and C2 is 0+1+ and (N & C2) == 0
|
||||
// replace with V+N.
|
||||
Value *V1, *V2;
|
||||
if ((C2->getValue() & (C2->getValue() + 1)) == 0 && // C2 == 0+1+
|
||||
match(A, m_Add(m_Value(V1), m_Value(V2)))) {
|
||||
// Add commutes, try both ways.
|
||||
if (V1 == B && MaskedValueIsZero(V2, C2->getValue()))
|
||||
return A;
|
||||
if (V2 == B && MaskedValueIsZero(V1, C2->getValue()))
|
||||
return A;
|
||||
}
|
||||
// Or commutes, try both ways.
|
||||
if ((C1->getValue() & (C1->getValue() + 1)) == 0 &&
|
||||
match(B, m_Add(m_Value(V1), m_Value(V2)))) {
|
||||
// Add commutes, try both ways.
|
||||
if (V1 == A && MaskedValueIsZero(V2, C1->getValue()))
|
||||
return B;
|
||||
if (V2 == A && MaskedValueIsZero(V1, C1->getValue()))
|
||||
return B;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If the operation is with the result of a phi instruction, check whether
|
||||
// operating on all incoming values of the phi always yields the same value.
|
||||
if (isa<PHINode>(Op0) || isa<PHINode>(Op1))
|
||||
|
Reference in New Issue
Block a user