[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu May 4 22:52:02 PDT 2006



Changes in directory llvm/lib/CodeGen/SelectionDAG:

DAGCombiner.cpp updated: 1.151 -> 1.152
---
Log message:

Factor some code, add these transformations:

  // fold (and (trunc x), (trunc y)) -> (trunc (and x, y))
  // fold (or  (trunc x), (trunc y)) -> (trunc (or  x, y))
  // fold (xor (trunc x), (trunc y)) -> (trunc (xor x, y))



---
Diffs of the changes:  (+66 -55)

 DAGCombiner.cpp |  121 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 66 insertions(+), 55 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.151 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.152
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.151	Fri Apr 28 18:33:20 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp	Fri May  5 00:51:50 2006
@@ -222,6 +222,7 @@
     SDOperand ReassociateOps(unsigned Opc, SDOperand LHS, SDOperand RHS);
     
     bool SimplifySelectOps(SDNode *SELECT, SDOperand LHS, SDOperand RHS);
+    SDOperand SimplifyBinOpWithSameOpcodeHands(SDNode *N);
     SDOperand SimplifySelect(SDOperand N0, SDOperand N1, SDOperand N2);
     SDOperand SimplifySelectCC(SDOperand N0, SDOperand N1, SDOperand N2, 
                                SDOperand N3, ISD::CondCode CC);
@@ -1035,6 +1036,53 @@
   return SDOperand();
 }
 
+/// SimplifyBinOpWithSameOpcodeHands - If this is a binary operator with
+/// two operands of the same opcode, try to simplify it.
+SDOperand DAGCombiner::SimplifyBinOpWithSameOpcodeHands(SDNode *N) {
+  SDOperand N0 = N->getOperand(0), N1 = N->getOperand(1);
+  MVT::ValueType VT = N0.getValueType();
+  assert(N0.getOpcode() == N1.getOpcode() && "Bad input!");
+  
+  // fold (and (zext x), (zext y)) -> (zext (and x, y))
+  // fold (or  (zext x), (zext y)) -> (zext (or  x, y))
+  // fold (xor (zext x), (zext y)) -> (zext (xor x, y))
+  if (N0.getOpcode() == ISD::ZERO_EXTEND &&
+      N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType()) {
+    SDOperand ORNode = DAG.getNode(N->getOpcode(), 
+                                   N0.getOperand(0).getValueType(),
+                                   N0.getOperand(0), N1.getOperand(0));
+    AddToWorkList(ORNode.Val);
+    return DAG.getNode(ISD::ZERO_EXTEND, VT, ORNode);
+  }
+  
+  // fold (and (trunc x), (trunc y)) -> (trunc (and x, y))
+  // fold (or  (trunc x), (trunc y)) -> (trunc (or  x, y))
+  // fold (xor (trunc x), (trunc y)) -> (trunc (xor x, y))
+  if (N0.getOpcode() == ISD::TRUNCATE &&
+      N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType()) {
+    SDOperand ORNode = DAG.getNode(N->getOpcode(),
+                                   N0.getOperand(0).getValueType(),
+                                   N0.getOperand(0), N1.getOperand(0));
+    AddToWorkList(ORNode.Val);
+    return DAG.getNode(ISD::TRUNCATE, VT, ORNode);
+  }
+  
+  // fold (and (shl/srl/sra x), (shl/srl/sra y)) -> (shl/srl/sra (and x, y))
+  // fold (or  (shl/srl/sra x), (shl/srl/sra y)) -> (shl/srl/sra (or  x, y))
+  // fold (xor (shl/srl/sra x), (shl/srl/sra y)) -> (shl/srl/sra (xor x, y))
+  if ((N0.getOpcode() == ISD::SHL || N0.getOpcode() == ISD::SRL ||
+       N0.getOpcode() == ISD::SRA) &&
+      N0.getOperand(1) == N1.getOperand(1)) {
+    SDOperand ORNode = DAG.getNode(N->getOpcode(),
+                                   N0.getOperand(0).getValueType(),
+                                   N0.getOperand(0), N1.getOperand(0));
+    AddToWorkList(ORNode.Val);
+    return DAG.getNode(N0.getOpcode(), VT, ORNode, N0.getOperand(1));
+  }
+  
+  return SDOperand();
+}
+
 SDOperand DAGCombiner::visitAND(SDNode *N) {
   SDOperand N0 = N->getOperand(0);
   SDOperand N1 = N->getOperand(1);
@@ -1121,25 +1169,13 @@
         return DAG.getSetCC(N0.getValueType(), LL, LR, Result);
     }
   }
-  // fold (and (zext x), (zext y)) -> (zext (and x, y))
-  if (N0.getOpcode() == ISD::ZERO_EXTEND && 
-      N1.getOpcode() == ISD::ZERO_EXTEND &&
-      N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType()) {
-    SDOperand ANDNode = DAG.getNode(ISD::AND, N0.getOperand(0).getValueType(),
-                                    N0.getOperand(0), N1.getOperand(0));
-    AddToWorkList(ANDNode.Val);
-    return DAG.getNode(ISD::ZERO_EXTEND, VT, ANDNode);
-  }
-  // fold (and (shl/srl/sra x), (shl/srl/sra y)) -> (shl/srl/sra (and x, y))
-  if (((N0.getOpcode() == ISD::SHL && N1.getOpcode() == ISD::SHL) ||
-       (N0.getOpcode() == ISD::SRL && N1.getOpcode() == ISD::SRL) ||
-       (N0.getOpcode() == ISD::SRA && N1.getOpcode() == ISD::SRA)) &&
-      N0.getOperand(1) == N1.getOperand(1)) {
-    SDOperand ANDNode = DAG.getNode(ISD::AND, N0.getOperand(0).getValueType(),
-                                    N0.getOperand(0), N1.getOperand(0));
-    AddToWorkList(ANDNode.Val);
-    return DAG.getNode(N0.getOpcode(), VT, ANDNode, N0.getOperand(1));
+
+  // Simplify: and (op x...), (op y...)  -> (op (and x, y))
+  if (N0.getOpcode() == N1.getOpcode()) {
+    SDOperand Tmp = SimplifyBinOpWithSameOpcodeHands(N);
+    if (Tmp.Val) return Tmp;
   }
+  
   // fold (and (sign_extend_inreg x, i16 to i32), 1) -> (and x, 1)
   // fold (and (sra)) -> (and (srl)) when possible.
   if (!MVT::isVector(VT) &&
@@ -1292,25 +1328,13 @@
         return DAG.getSetCC(N0.getValueType(), LL, LR, Result);
     }
   }
-  // fold (or (zext x), (zext y)) -> (zext (or x, y))
-  if (N0.getOpcode() == ISD::ZERO_EXTEND && 
-      N1.getOpcode() == ISD::ZERO_EXTEND &&
-      N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType()) {
-    SDOperand ORNode = DAG.getNode(ISD::OR, N0.getOperand(0).getValueType(),
-                                   N0.getOperand(0), N1.getOperand(0));
-    AddToWorkList(ORNode.Val);
-    return DAG.getNode(ISD::ZERO_EXTEND, VT, ORNode);
-  }
-  // fold (or (shl/srl/sra x), (shl/srl/sra y)) -> (shl/srl/sra (or x, y))
-  if (((N0.getOpcode() == ISD::SHL && N1.getOpcode() == ISD::SHL) ||
-       (N0.getOpcode() == ISD::SRL && N1.getOpcode() == ISD::SRL) ||
-       (N0.getOpcode() == ISD::SRA && N1.getOpcode() == ISD::SRA)) &&
-      N0.getOperand(1) == N1.getOperand(1)) {
-    SDOperand ORNode = DAG.getNode(ISD::OR, N0.getOperand(0).getValueType(),
-                                   N0.getOperand(0), N1.getOperand(0));
-    AddToWorkList(ORNode.Val);
-    return DAG.getNode(N0.getOpcode(), VT, ORNode, N0.getOperand(1));
+  
+  // Simplify: or (op x...), (op y...)  -> (op (or x, y))
+  if (N0.getOpcode() == N1.getOpcode()) {
+    SDOperand Tmp = SimplifyBinOpWithSameOpcodeHands(N);
+    if (Tmp.Val) return Tmp;
   }
+
   // canonicalize shl to left side in a shl/srl pair, to match rotate
   if (N0.getOpcode() == ISD::SRL && N1.getOpcode() == ISD::SHL)
     std::swap(N0, N1);
@@ -1429,26 +1453,13 @@
       return DAG.getNode(ISD::BUILD_VECTOR, VT, Ops);
     }
   }
-  // fold (xor (zext x), (zext y)) -> (zext (xor x, y))
-  if (N0.getOpcode() == ISD::ZERO_EXTEND && 
-      N1.getOpcode() == ISD::ZERO_EXTEND &&
-      N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType()) {
-    SDOperand XORNode = DAG.getNode(ISD::XOR, N0.getOperand(0).getValueType(),
-                                   N0.getOperand(0), N1.getOperand(0));
-    AddToWorkList(XORNode.Val);
-    return DAG.getNode(ISD::ZERO_EXTEND, VT, XORNode);
-  }
-  // fold (xor (shl/srl/sra x), (shl/srl/sra y)) -> (shl/srl/sra (xor x, y))
-  if (((N0.getOpcode() == ISD::SHL && N1.getOpcode() == ISD::SHL) ||
-       (N0.getOpcode() == ISD::SRL && N1.getOpcode() == ISD::SRL) ||
-       (N0.getOpcode() == ISD::SRA && N1.getOpcode() == ISD::SRA)) &&
-      N0.getOperand(1) == N1.getOperand(1)) {
-    SDOperand XORNode = DAG.getNode(ISD::XOR, N0.getOperand(0).getValueType(),
-                                    N0.getOperand(0), N1.getOperand(0));
-    AddToWorkList(XORNode.Val);
-    return DAG.getNode(N0.getOpcode(), VT, XORNode, N0.getOperand(1));
+  
+  // Simplify: xor (op x...), (op y...)  -> (op (xor x, y))
+  if (N0.getOpcode() == N1.getOpcode()) {
+    SDOperand Tmp = SimplifyBinOpWithSameOpcodeHands(N);
+    if (Tmp.Val) return Tmp;
   }
-
+  
   // Simplify the expression using non-local knowledge.
   if (!MVT::isVector(VT) &&
       SimplifyDemandedBits(SDOperand(N, 0)))






More information about the llvm-commits mailing list