OSDN Git Service

[X86] Fix a place where we created MOVQ2DQ with a DstVT other than v2i64.
authorCraig Topper <craig.topper@gmail.com>
Sun, 31 May 2020 00:03:53 +0000 (17:03 -0700)
committerCraig Topper <craig.topper@gmail.com>
Sun, 31 May 2020 02:47:07 +0000 (19:47 -0700)
The type profile and isel pattern have this type declared as
being MVT::v2i64. But isel skips the explicit type check due to
the type profile.

llvm/lib/Target/X86/X86ISelLowering.cpp

index 0b114b3..6ebd468 100644 (file)
@@ -30002,10 +30002,14 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
     }
 
     if (DstVT.isVector() && SrcVT == MVT::x86mmx) {
+      // FIXME: Use v4f32 for SSE1?
+      assert(Subtarget.hasSSE2() && "Requires SSE2");
       assert(getTypeAction(*DAG.getContext(), DstVT) == TypeWidenVector &&
              "Unexpected type action!");
       EVT WideVT = getTypeToTransformTo(*DAG.getContext(), DstVT);
-      SDValue Res = DAG.getNode(X86ISD::MOVQ2DQ, dl, WideVT, N->getOperand(0));
+      SDValue Res = DAG.getNode(X86ISD::MOVQ2DQ, dl, MVT::v2i64,
+                                N->getOperand(0));
+      Res = DAG.getBitcast(WideVT, Res);
       Results.push_back(Res);
       return;
     }