speculatively teach OPC_CheckValueType and OPC_EmitNode to handle
authorChris Lattner <sabre@nondot.org>
Sun, 21 Feb 2010 20:15:25 +0000 (20:15 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 21 Feb 2010 20:15:25 +0000 (20:15 +0000)
MVT::iPTR.

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

include/llvm/CodeGen/DAGISelHeader.h

index 5d91c2bd8841c10c2694083b790a34b00558b14d..f04fe34c553637e80686f8bd26d98bddd16da135 100644 (file)
@@ -420,11 +420,16 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
       if (cast<CondCodeSDNode>(N)->get() !=
           (ISD::CondCode)MatcherTable[MatcherIndex++]) break;
       continue;
       if (cast<CondCodeSDNode>(N)->get() !=
           (ISD::CondCode)MatcherTable[MatcherIndex++]) break;
       continue;
-    case OPC_CheckValueType:
-      if (cast<VTSDNode>(N)->getVT() !=
-          (MVT::SimpleValueType)MatcherTable[MatcherIndex++]) break;
+    case OPC_CheckValueType: {
+      MVT::SimpleValueType VT =
+        (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
+      if (cast<VTSDNode>(N)->getVT() != VT) {
+        // Handle the case when VT is iPTR.
+        if (VT != MVT::iPTR || cast<VTSDNode>(N)->getVT() != TLI.getPointerTy())
+          break;
+      }
       continue;
       continue;
-
+    }
     case OPC_CheckInteger1:
       if (CheckInteger(N, GetInt1(MatcherTable, MatcherIndex))) break;
       continue;
     case OPC_CheckInteger1:
       if (CheckInteger(N, GetInt1(MatcherTable, MatcherIndex))) break;
       continue;
@@ -643,8 +648,12 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
       unsigned NumVTs = MatcherTable[MatcherIndex++];
       assert(NumVTs != 0 && "Invalid node result");
       SmallVector<EVT, 4> VTs;
       unsigned NumVTs = MatcherTable[MatcherIndex++];
       assert(NumVTs != 0 && "Invalid node result");
       SmallVector<EVT, 4> VTs;
-      for (unsigned i = 0; i != NumVTs; ++i)
-        VTs.push_back((MVT::SimpleValueType)MatcherTable[MatcherIndex++]);
+      for (unsigned i = 0; i != NumVTs; ++i) {
+        MVT::SimpleValueType VT =
+          (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
+        if (VT == MVT::iPTR) VT = TLI.getPointerTy().SimpleTy;
+        VTs.push_back(VT);
+      }
       
       // FIXME: Use faster version for the common 'one VT' case?
       SDVTList VTList = CurDAG->getVTList(VTs.data(), VTs.size());
       
       // FIXME: Use faster version for the common 'one VT' case?
       SDVTList VTList = CurDAG->getVTList(VTs.data(), VTs.size());