forked from OSchip/llvm-project
[InstCombine] Cleanup using commutable matchers. Make a couple helper methods standalone static functions. Put 'if' around variable declaration instead of after. NFC
llvm-svn: 305941
This commit is contained in:
parent
d750e1c491
commit
a074c101e5
|
@ -1922,8 +1922,9 @@ Value *InstCombiner::foldOrOfFCmps(FCmpInst *LHS, FCmpInst *RHS) {
|
|||
/// (A & C1) | B
|
||||
///
|
||||
/// when the XOR of the two constants is "all ones" (-1).
|
||||
Instruction *InstCombiner::FoldOrWithConstants(BinaryOperator &I, Value *Op,
|
||||
Value *A, Value *B, Value *C) {
|
||||
static Instruction *FoldOrWithConstants(BinaryOperator &I, Value *Op,
|
||||
Value *A, Value *B, Value *C,
|
||||
InstCombiner::BuilderTy *Builder) {
|
||||
ConstantInt *CI1 = dyn_cast<ConstantInt>(C);
|
||||
if (!CI1) return nullptr;
|
||||
|
||||
|
@ -1944,15 +1945,16 @@ Instruction *InstCombiner::FoldOrWithConstants(BinaryOperator &I, Value *Op,
|
|||
|
||||
/// \brief This helper function folds:
|
||||
///
|
||||
/// ((A | B) & C1) ^ (B & C2)
|
||||
/// ((A ^ B) & C1) | (B & C2)
|
||||
///
|
||||
/// into:
|
||||
///
|
||||
/// (A & C1) ^ B
|
||||
///
|
||||
/// when the XOR of the two constants is "all ones" (-1).
|
||||
Instruction *InstCombiner::FoldXorWithConstants(BinaryOperator &I, Value *Op,
|
||||
Value *A, Value *B, Value *C) {
|
||||
static Instruction *FoldXorWithConstants(BinaryOperator &I, Value *Op,
|
||||
Value *A, Value *B, Value *C,
|
||||
InstCombiner::BuilderTy *Builder) {
|
||||
ConstantInt *CI1 = dyn_cast<ConstantInt>(C);
|
||||
if (!CI1)
|
||||
return nullptr;
|
||||
|
@ -2112,28 +2114,24 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {
|
|||
}
|
||||
|
||||
// ((A|B)&1)|(B&-2) -> (A&1) | B
|
||||
if (match(A, m_Or(m_Value(V1), m_Specific(B))) ||
|
||||
match(A, m_Or(m_Specific(B), m_Value(V1)))) {
|
||||
Instruction *Ret = FoldOrWithConstants(I, Op1, V1, B, C);
|
||||
if (Ret) return Ret;
|
||||
if (match(A, m_c_Or(m_Value(V1), m_Specific(B)))) {
|
||||
if (Instruction *Ret = FoldOrWithConstants(I, Op1, V1, B, C, Builder))
|
||||
return Ret;
|
||||
}
|
||||
// (B&-2)|((A|B)&1) -> (A&1) | B
|
||||
if (match(B, m_Or(m_Specific(A), m_Value(V1))) ||
|
||||
match(B, m_Or(m_Value(V1), m_Specific(A)))) {
|
||||
Instruction *Ret = FoldOrWithConstants(I, Op0, A, V1, D);
|
||||
if (Ret) return Ret;
|
||||
if (match(B, m_c_Or(m_Specific(A), m_Value(V1)))) {
|
||||
if (Instruction *Ret = FoldOrWithConstants(I, Op0, A, V1, D, Builder))
|
||||
return Ret;
|
||||
}
|
||||
// ((A^B)&1)|(B&-2) -> (A&1) ^ B
|
||||
if (match(A, m_Xor(m_Value(V1), m_Specific(B))) ||
|
||||
match(A, m_Xor(m_Specific(B), m_Value(V1)))) {
|
||||
Instruction *Ret = FoldXorWithConstants(I, Op1, V1, B, C);
|
||||
if (Ret) return Ret;
|
||||
if (match(A, m_c_Xor(m_Value(V1), m_Specific(B)))) {
|
||||
if (Instruction *Ret = FoldXorWithConstants(I, Op1, V1, B, C, Builder))
|
||||
return Ret;
|
||||
}
|
||||
// (B&-2)|((A^B)&1) -> (A&1) ^ B
|
||||
if (match(B, m_Xor(m_Specific(A), m_Value(V1))) ||
|
||||
match(B, m_Xor(m_Value(V1), m_Specific(A)))) {
|
||||
Instruction *Ret = FoldXorWithConstants(I, Op0, A, V1, D);
|
||||
if (Ret) return Ret;
|
||||
if (match(B, m_c_Xor(m_Specific(A), m_Value(V1)))) {
|
||||
if (Instruction *Ret = FoldXorWithConstants(I, Op0, A, V1, D, Builder))
|
||||
return Ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -276,10 +276,6 @@ public:
|
|||
Instruction *visitFDiv(BinaryOperator &I);
|
||||
Value *simplifyRangeCheck(ICmpInst *Cmp0, ICmpInst *Cmp1, bool Inverted);
|
||||
Instruction *visitAnd(BinaryOperator &I);
|
||||
Instruction *FoldOrWithConstants(BinaryOperator &I, Value *Op, Value *A,
|
||||
Value *B, Value *C);
|
||||
Instruction *FoldXorWithConstants(BinaryOperator &I, Value *Op, Value *A,
|
||||
Value *B, Value *C);
|
||||
Instruction *visitOr(BinaryOperator &I);
|
||||
Instruction *visitXor(BinaryOperator &I);
|
||||
Instruction *visitShl(BinaryOperator &I);
|
||||
|
|
Loading…
Reference in New Issue