[SDAG] Extract commutative helper from haveNoCommonBitsSet() (NFC)
authorNikita Popov <npopov@redhat.com>
Tue, 3 May 2022 10:20:04 +0000 (12:20 +0200)
committerNikita Popov <npopov@redhat.com>
Tue, 3 May 2022 10:28:35 +0000 (12:28 +0200)
To make it easier to add additional patterns, which will generally
want to handle commuted top-level operands.

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index d667988..83c752b 100644 (file)
@@ -4684,10 +4684,7 @@ bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const {
   return false;
 }
 
-// FIXME: unify with llvm::haveNoCommonBitsSet.
-bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
-  assert(A.getValueType() == B.getValueType() &&
-         "Values must have the same type");
+static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B) {
   // Match masked merge pattern (X & ~M) op (Y & M)
   if (A->getOpcode() == ISD::AND && B->getOpcode() == ISD::AND) {
     auto MatchNoCommonBitsPattern = [&](SDValue NotM, SDValue And) {
@@ -4698,12 +4695,19 @@ bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
       }
       return false;
     };
-    if (MatchNoCommonBitsPattern(A->getOperand(0), B) ||
-        MatchNoCommonBitsPattern(A->getOperand(1), B) ||
-        MatchNoCommonBitsPattern(B->getOperand(0), A) ||
-        MatchNoCommonBitsPattern(B->getOperand(1), A))
-      return true;
+    return MatchNoCommonBitsPattern(A->getOperand(0), B) ||
+           MatchNoCommonBitsPattern(A->getOperand(1), B);
   }
+  return false;
+}
+
+// FIXME: unify with llvm::haveNoCommonBitsSet.
+bool SelectionDAG::haveNoCommonBitsSet(SDValue A, SDValue B) const {
+  assert(A.getValueType() == B.getValueType() &&
+         "Values must have the same type");
+  if (haveNoCommonBitsSetCommutative(A, B) ||
+      haveNoCommonBitsSetCommutative(B, A))
+    return true;
   return KnownBits::haveNoCommonBitsSet(computeKnownBits(A),
                                         computeKnownBits(B));
 }