diff options
| author | Bill Wendling <isanbard@gmail.com> | 2008-11-09 23:37:53 +0000 | 
|---|---|---|
| committer | Bill Wendling <isanbard@gmail.com> | 2008-11-09 23:37:53 +0000 | 
| commit | 4fb13c051d7a628ae024ba59073221e234b5d4e1 (patch) | |
| tree | 85427cccd3bc2a5d4b39faab9b97d561998dafea /llvm/lib | |
| parent | 1579287550505d49e2cb1adcd696bfbe6f969db0 (diff) | |
| download | bcm5719-llvm-4fb13c051d7a628ae024ba59073221e234b5d4e1.tar.gz bcm5719-llvm-4fb13c051d7a628ae024ba59073221e234b5d4e1.zip  | |
Correction for the last patch. Should match the conditional in the first part
of the select match, not the select instruction itself.
llvm-svn: 58947
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 76 | 
1 files changed, 42 insertions, 34 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index fa0704cc404..94bc3d17133 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -4352,59 +4352,67 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {        }      } -#define SELECT_MATCH(Val) \ -    m_Select(m_Value(Val), m_ConstantInt(0), m_ConstantInt(-1))  #define GET_SELECT_COND(Val) \      cast<User>(Val)->getOperand(0) +#define SELECT_MATCH(Val) \ +    m_Select(m_Value(Val), m_ConstantInt(0), m_ConstantInt(-1))      // (A & (C0?-1:0)) | (B & ~(C0?-1:0)) ->  C0 ? A : B, and commuted variants      if (match(A, m_Select(m_Value(), m_ConstantInt(-1), m_ConstantInt(0)))) { -      if (match(D, m_Not(SELECT_MATCH(A)))) -        return SelectInst::Create(GET_SELECT_COND(D), C, B); -      if (match(B, m_Not(SELECT_MATCH(A)))) -        return SelectInst::Create(GET_SELECT_COND(B), C, D); +      Value *Cond = GET_SELECT_COND(A); +      if (match(D, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, C, B); +      if (match(B, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, C, D);      }      if (match(B, m_Select(m_Value(), m_ConstantInt(-1), m_ConstantInt(0)))) { -      if (match(C, m_Not(SELECT_MATCH(B)))) -        return SelectInst::Create(GET_SELECT_COND(C), A, D); -      if (match(A, m_Not(SELECT_MATCH(B)))) -        return SelectInst::Create(GET_SELECT_COND(A), C, D); +      Value *Cond = GET_SELECT_COND(B); +      if (match(C, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, A, D); +      if (match(A, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, C, D);      }      if (match(C, m_Select(m_Value(), m_ConstantInt(-1), m_ConstantInt(0)))) { -      if (match(D, m_Not(SELECT_MATCH(C)))) -        return SelectInst::Create(GET_SELECT_COND(D), A, B); -      if (match(B, m_Not(SELECT_MATCH(C)))) -        return SelectInst::Create(GET_SELECT_COND(B), A, D); +      Value *Cond = GET_SELECT_COND(C); +      if (match(D, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, A, B); +      if (match(B, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, A, D);      }      if (match(D, m_Select(m_Value(), m_ConstantInt(-1), m_ConstantInt(0)))) { -      if (match(C, m_Not(SELECT_MATCH(D)))) -        return SelectInst::Create(GET_SELECT_COND(C), A, B); -      if (match(A, m_Not(SELECT_MATCH(D)))) -        return SelectInst::Create(GET_SELECT_COND(A), C, B); +      Value *Cond = GET_SELECT_COND(D); +      if (match(C, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, A, B); +      if (match(A, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, C, B);      }      if (match(A, m_Select(m_Value(), m_ConstantInt(0), m_ConstantInt(-1)))) { -      if (match(D, m_Not(SELECT_MATCH(A)))) -        return SelectInst::Create(GET_SELECT_COND(D), B, C); -      if (match(B, m_Not(SELECT_MATCH(A)))) -        return SelectInst::Create(GET_SELECT_COND(B), D, C); +      Value *Cond = GET_SELECT_COND(A); +      if (match(D, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, B, C); +      if (match(B, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, D, C);      }      if (match(B, m_Select(m_Value(), m_ConstantInt(0), m_ConstantInt(-1)))) { -      if (match(C, m_Not(SELECT_MATCH(B)))) -        return SelectInst::Create(GET_SELECT_COND(C), D, A); -      if (match(A, m_Not(SELECT_MATCH(B)))) -        return SelectInst::Create(GET_SELECT_COND(A), D, C); +      Value *Cond = GET_SELECT_COND(B); +      if (match(C, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, D, A); +      if (match(A, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, D, C);      }      if (match(C, m_Select(m_Value(), m_ConstantInt(0), m_ConstantInt(-1)))) { -      if (match(D, m_Not(SELECT_MATCH(C)))) -        return SelectInst::Create(GET_SELECT_COND(D), B, A); -      if (match(B, m_Not(SELECT_MATCH(C)))) -        return SelectInst::Create(GET_SELECT_COND(B), D, A); +      Value *Cond = GET_SELECT_COND(C); +      if (match(D, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, B, A); +      if (match(B, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, D, A);      }      if (match(D, m_Select(m_Value(), m_ConstantInt(0), m_ConstantInt(-1)))) { -      if (match(C, m_Not(SELECT_MATCH(D)))) -        return SelectInst::Create(GET_SELECT_COND(C), B, A); -      if (match(A, m_Not(SELECT_MATCH(D)))) -        return SelectInst::Create(GET_SELECT_COND(A), B, C); +      Value *Cond = GET_SELECT_COND(D); +      if (match(C, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, B, A); +      if (match(A, m_Not(SELECT_MATCH(Cond)))) +        return SelectInst::Create(Cond, B, C);      }  #undef SELECT_MATCH  #undef GET_SELECT_COND  | 

