Support for legalizing MEMBARRIER.
authorDuncan Sands <baldrick@free.fr>
Wed, 27 Feb 2008 08:53:44 +0000 (08:53 +0000)
committerDuncan Sands <baldrick@free.fr>
Wed, 27 Feb 2008 08:53:44 +0000 (08:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47667 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/LegalizeTypes.h
lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp

index 32b210114a01f0f4035d3a78bb990dcf78638484..d34d209ce3f368e729b34ddd43da18216d06f0a6 100644 (file)
@@ -1140,8 +1140,11 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     case TargetLowering::Legal: {
       SDOperand Ops[6];
       Ops[0] = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
-      for (int x = 1; x < 6; ++x)
-        Ops[x] = PromoteOp(Node->getOperand(x));
+      for (int x = 1; x < 6; ++x) {
+        Ops[x] = Node->getOperand(x);
+        if (!isTypeLegal(Ops[x].getValueType()))
+          Ops[x] = PromoteOp(Ops[x]);
+      }
       Result = DAG.UpdateNodeOperands(Result, &Ops[0], 6);
       break;
     }
index 7e8ea6640dae1e02cbb95ad2b80c9681685bb716..1947673dd8c1105d29c84992a9ce115b1faca099 100644 (file)
@@ -190,6 +190,7 @@ private:
   SDOperand PromoteOperand_FP_EXTEND(SDNode *N);
   SDOperand PromoteOperand_FP_ROUND(SDNode *N);
   SDOperand PromoteOperand_INT_TO_FP(SDNode *N);
+  SDOperand PromoteOperand_MEMBARRIER(SDNode *N);
   SDOperand PromoteOperand_RET(SDNode *N, unsigned OpNo);
   SDOperand PromoteOperand_SELECT(SDNode *N, unsigned OpNo);
   SDOperand PromoteOperand_SETCC(SDNode *N, unsigned OpNo);
index 2ff1693e89a0b39db6795b4eba593569a20f86a1..41501398f2e08dddf176d17b8e3de5c0bd47dd00 100644 (file)
@@ -359,6 +359,8 @@ bool DAGTypeLegalizer::PromoteOperand(SDNode *N, unsigned OpNo) {
   case ISD::BUILD_VECTOR: Res = PromoteOperand_BUILD_VECTOR(N); break;
 
   case ISD::RET:         Res = PromoteOperand_RET(N, OpNo); break;
+
+  case ISD::MEMBARRIER:  Res = PromoteOperand_MEMBARRIER(N); break;
   }
 
   // If the result is null, the sub-method took care of registering results etc.
@@ -612,3 +614,14 @@ SDOperand DAGTypeLegalizer::PromoteOperand_RET(SDNode *N, unsigned OpNo) {
   return DAG.UpdateNodeOperands(SDOperand (N, 0),
                                 &NewValues[0], NewValues.size());
 }
+
+SDOperand DAGTypeLegalizer::PromoteOperand_MEMBARRIER(SDNode *N) {
+  SDOperand NewOps[6];
+  NewOps[0] = N->getOperand(0);
+  for (unsigned i = 1; i < array_lengthof(NewOps); ++i) {
+    SDOperand Flag = GetPromotedOp(N->getOperand(i));
+    NewOps[i] = DAG.getZeroExtendInReg(Flag, MVT::i1);
+  }
+  return DAG.UpdateNodeOperands(SDOperand (N, 0), NewOps,
+                                array_lengthof(NewOps));
+}