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

Chris Lattner lattner at cs.uiuc.edu
Wed Apr 19 22:39:24 PDT 2006



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAG.cpp updated: 1.300 -> 1.301
---
Log message:

Implement folding of a bunch of binops with undef


---
Diffs of the changes:  (+46 -0)

 SelectionDAG.cpp |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 46 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.300 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.301
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.300	Sat Apr 15 18:38:00 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Thu Apr 20 00:39:12 2006
@@ -1367,6 +1367,52 @@
       }
     }
   }
+  
+  // Canonicalize an UNDEF to the RHS, even over a constant.
+  if (N1.getOpcode() == ISD::UNDEF) {
+    if (isCommutativeBinOp(Opcode)) {
+      std::swap(N1, N2);
+    } else {
+      switch (Opcode) {
+      case ISD::FP_ROUND_INREG:
+      case ISD::SIGN_EXTEND_INREG:
+      case ISD::SUB:
+      case ISD::FSUB:
+      case ISD::FDIV:
+      case ISD::FREM:
+        return N1;     // fold op(undef, arg2) -> undef
+      case ISD::UDIV:
+      case ISD::SDIV:
+      case ISD::UREM:
+      case ISD::SREM:
+        return getConstant(0, VT);    // fold op(undef, arg2) -> 0
+      }
+    }
+  }
+  
+  // Fold a bunch of operators that 
+  if (N2.getOpcode() == ISD::UNDEF) {
+    switch (Opcode) {
+    case ISD::ADD:
+    case ISD::SUB:
+    case ISD::FADD:
+    case ISD::FSUB:
+    case ISD::FMUL:
+    case ISD::FDIV:
+    case ISD::FREM:
+    case ISD::UDIV:
+    case ISD::SDIV:
+    case ISD::UREM:
+    case ISD::SREM:
+    case ISD::XOR:
+      return N2;       // fold op(arg1, undef) -> undef
+    case ISD::MUL: 
+    case ISD::AND:
+      return getConstant(0, VT);  // fold op(arg1, undef) -> 0
+    case ISD::OR:
+      return getConstant(MVT::getIntVTBitMask(VT), VT);
+    }
+  }
 
   // Finally, fold operations that do not require constants.
   switch (Opcode) {






More information about the llvm-commits mailing list