Allow targets to say they don't support truncstore i1 (which includes a mask
authorChris Lattner <sabre@nondot.org>
Sat, 10 Sep 2005 00:20:18 +0000 (00:20 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 10 Sep 2005 00:20:18 +0000 (00:20 +0000)
when storing to an 8-bit memory location), as most don't.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23303 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 55dcbd9ffdddfbe9dc40a4adf5ddf4d1ed529cc2..277f696dcbf1d8344bc5a0261c816c3081ee8247 100644 (file)
@@ -1043,10 +1043,23 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     switch (getTypeAction(Node->getOperand(1).getValueType())) {
     case Legal:
       Tmp2 = LegalizeOp(Node->getOperand(1));
-      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
-          Tmp3 != Node->getOperand(2))
+      
+      // The only promote case we handle is TRUNCSTORE:i1 X into
+      //   -> TRUNCSTORE:i8 (and X, 1)
+      if (cast<VTSDNode>(Node->getOperand(4))->getVT() == MVT::i1 &&
+          TLI.getOperationAction(ISD::TRUNCSTORE, MVT::i1) == 
+                TargetLowering::Promote) {
+        // Promote the bool to a mask then store.
+        Tmp2 = DAG.getNode(ISD::AND, Tmp2.getValueType(), Tmp2,
+                           DAG.getConstant(1, Tmp2.getValueType()));
+        Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp2, Tmp3,
+                             Node->getOperand(3), DAG.getValueType(MVT::i8));
+
+      } else if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
+                 Tmp3 != Node->getOperand(2)) {
         Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp2, Tmp3,
                              Node->getOperand(3), Node->getOperand(4));
+      }
       break;
     case Promote:
     case Expand: