Fix invalid operand updates & implement post-inc memory operands
[oota-llvm.git] / lib / Target / MSP430 / MSP430ISelDAGToDAG.cpp
index ac01bf81c347d953e4273dd3f2aea902b7bad704..e9e5d34ba510f77ec91c00704f59d31a04040b23 100644 (file)
@@ -43,9 +43,6 @@ ViewRMWDAGs("view-msp430-rmw-dags", cl::Hidden,
 static const bool ViewRMWDAGs = false;
 #endif
 
-static cl::opt<bool>
-EnablePostIncOps("enable-msp430-post-inc-ops", cl::Hidden);
-
 STATISTIC(NumLoadMoved, "Number of loads moved below TokenFactor");
 
 
@@ -675,7 +672,10 @@ SDNode *MSP430DAGToDAGISel::SelectIndexedBinOp(SDValue Op,
                            VT, MVT::i16, MVT::Other,
                            Ops0, 3);
     cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1);
-    ReplaceUses(SDValue(N1.getNode(), 2), SDValue(ResNode, 3));
+    // Transfer chain.
+    ReplaceUses(SDValue(N1.getNode(), 2), SDValue(ResNode, 2));
+    // Transfer writeback.
+    ReplaceUses(SDValue(N1.getNode(), 1), SDValue(ResNode, 1));
     return ResNode;
   }
 
@@ -745,18 +745,64 @@ SDNode *MSP430DAGToDAGISel::Select(SDValue Op) {
       return ResNode;
     // Other cases are autogenerated.
     break;
-    case ISD::ADD:
-     if (EnablePostIncOps) {
-      if (SDNode *ResNode =
-           SelectIndexedBinOp(Op,
-                              Op.getOperand(0), Op.getOperand(1),
-                              MSP430::ADD8rm_POST, MSP430::ADD16rm_POST))
-        return ResNode;
-      else if (SDNode *ResNode =
-                SelectIndexedBinOp(Op, Op.getOperand(1), Op.getOperand(0),
-                                   MSP430::ADD8rm_POST, MSP430::ADD16rm_POST))
-        return ResNode;
-     }
+  case ISD::ADD:
+    if (SDNode *ResNode =
+        SelectIndexedBinOp(Op,
+                           Op.getOperand(0), Op.getOperand(1),
+                           MSP430::ADD8rm_POST, MSP430::ADD16rm_POST))
+      return ResNode;
+    else if (SDNode *ResNode =
+             SelectIndexedBinOp(Op, Op.getOperand(1), Op.getOperand(0),
+                                MSP430::ADD8rm_POST, MSP430::ADD16rm_POST))
+      return ResNode;
+
+    // Other cases are autogenerated.
+    break;
+  case ISD::SUB:
+    if (SDNode *ResNode =
+        SelectIndexedBinOp(Op,
+                           Op.getOperand(0), Op.getOperand(1),
+                           MSP430::SUB8rm_POST, MSP430::SUB16rm_POST))
+      return ResNode;
+
+    // Other cases are autogenerated.
+    break;
+  case ISD::AND:
+    if (SDNode *ResNode =
+        SelectIndexedBinOp(Op,
+                           Op.getOperand(0), Op.getOperand(1),
+                           MSP430::AND8rm_POST, MSP430::AND16rm_POST))
+      return ResNode;
+    else if (SDNode *ResNode =
+             SelectIndexedBinOp(Op, Op.getOperand(1), Op.getOperand(0),
+                                MSP430::AND8rm_POST, MSP430::AND16rm_POST))
+      return ResNode;
+
+    // Other cases are autogenerated.
+    break;
+  case ISD::OR:
+    if (SDNode *ResNode =
+        SelectIndexedBinOp(Op,
+                           Op.getOperand(0), Op.getOperand(1),
+                           MSP430::OR8rm_POST, MSP430::OR16rm_POST))
+      return ResNode;
+    else if (SDNode *ResNode =
+             SelectIndexedBinOp(Op, Op.getOperand(1), Op.getOperand(0),
+                                MSP430::OR8rm_POST, MSP430::OR16rm_POST))
+      return ResNode;
+
+    // Other cases are autogenerated.
+    break;
+  case ISD::XOR:
+    if (SDNode *ResNode =
+        SelectIndexedBinOp(Op,
+                           Op.getOperand(0), Op.getOperand(1),
+                           MSP430::XOR8rm_POST, MSP430::XOR16rm_POST))
+      return ResNode;
+    else if (SDNode *ResNode =
+             SelectIndexedBinOp(Op, Op.getOperand(1), Op.getOperand(0),
+                                MSP430::XOR8rm_POST, MSP430::XOR16rm_POST))
+      return ResNode;
 
     // Other cases are autogenerated.
     break;