Use m_Specific() instead of double matching.
authorBill Wendling <isanbard@gmail.com>
Mon, 1 Dec 2008 08:09:47 +0000 (08:09 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 1 Dec 2008 08:09:47 +0000 (08:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60341 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/or-to-xor.ll

index aae1e14f9dbbf38f00fad9fb5c5e0f389bbcf245..47d9c25d5b6915e36106364b67d1b5bfca0f62bf 100644 (file)
@@ -4603,28 +4603,22 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {
     if (Instruction *Match = MatchSelectFromAndOr(D, A, B, C))
       return Match;
 
-    V1 = V2 = 0;
-
     // ((A&~B)|(~A&B)) -> A^B
-    if ((match(C, m_Not(m_Value(V1))) &&
-         match(B, m_Not(m_Value(V2)))))
-      if (V1 == D && V2 == A)
-        return BinaryOperator::CreateXor(V1, V2);
+    if ((match(C, m_Not(m_Specific(D))) &&
+         match(B, m_Not(m_Specific(A)))))
+      return BinaryOperator::CreateXor(A, D);
     // ((~B&A)|(~A&B)) -> A^B
-    if ((match(A, m_Not(m_Value(V1))) &&
-         match(B, m_Not(m_Value(V2)))))
-      if (V1 == D && V2 == C)
-        return BinaryOperator::CreateXor(V1, V2);
+    if ((match(A, m_Not(m_Specific(D))) &&
+         match(B, m_Not(m_Specific(C)))))
+      return BinaryOperator::CreateXor(C, D);
     // ((A&~B)|(B&~A)) -> A^B
-    if ((match(C, m_Not(m_Value(V1))) &&
-         match(D, m_Not(m_Value(V2)))))
-      if (V1 == B && V2 == A)
-        return BinaryOperator::CreateXor(V1, V2);
+    if ((match(C, m_Not(m_Specific(B))) &&
+         match(D, m_Not(m_Specific(A)))))
+      return BinaryOperator::CreateXor(A, B);
     // ((~B&A)|(B&~A)) -> A^B
-    if ((match(A, m_Not(m_Value(V1))) &&
-         match(D, m_Not(m_Value(V2)))))
-      if (V1 == B && V2 == C)
-        return BinaryOperator::CreateXor(V1, V2);
+    if ((match(A, m_Not(m_Specific(B))) &&
+         match(D, m_Not(m_Specific(C)))))
+      return BinaryOperator::CreateXor(C, B);
   }
   
   // (X >> Z) | (Y >> Z)  -> (X|Y) >> Z  for all shifts.
index f403412bd5c862aa19aed0787144459957e35efa..e40417b17d355144b8f48b582f7181f9670602c5 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {xor i32 %b, %a} | count 4
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {xor i32 %a, %b} | count 4
 ; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep {and}
 
 define i32 @func1(i32 %a, i32 %b) nounwind readnone {