[X86] Do not custom lower UINT_TO_FP when the target type does not
authorQuentin Colombet <qcolombet@apple.com>
Fri, 21 Nov 2014 00:47:19 +0000 (00:47 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Fri, 21 Nov 2014 00:47:19 +0000 (00:47 +0000)
match the custom lowering.

<rdar://problem/19026326>

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

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/vec_uint_to_fp.ll

index 9355187074b5606d4d11adeca595205f182636d7..f05b6c61ca0981927fd3f5fb69ba1d9e7950e989 100644 (file)
@@ -13610,6 +13610,11 @@ static SDValue lowerUINT_TO_FP_vXi32(SDValue Op, SelectionDAG &DAG,
   EVT VecIntVT = V.getValueType();
   bool Is128 = VecIntVT == MVT::v4i32;
   EVT VecFloatVT = Is128 ? MVT::v4f32 : MVT::v8f32;
   EVT VecIntVT = V.getValueType();
   bool Is128 = VecIntVT == MVT::v4i32;
   EVT VecFloatVT = Is128 ? MVT::v4f32 : MVT::v8f32;
+  // If we convert to something else than the supported type, e.g., to v4f64,
+  // abort early.
+  if (VecFloatVT != Op->getValueType(0))
+    return SDValue();
+
   unsigned NumElts = VecIntVT.getVectorNumElements();
   assert((VecIntVT == MVT::v4i32 || VecIntVT == MVT::v8i32) &&
          "Unsupported custom type");
   unsigned NumElts = VecIntVT.getVectorNumElements();
   assert((VecIntVT == MVT::v4i32 || VecIntVT == MVT::v8i32) &&
          "Unsupported custom type");
index 607be9a8549463dbf96e5f1b44270eb8f1deb452..46cfcd9a9a12ab28fc1adc2920764e0c814f0027 100644 (file)
@@ -154,3 +154,14 @@ define <8 x float> @test2(<8 x i32> %A) nounwind {
   %C = uitofp <8 x i32> %A to <8 x float>
   ret <8 x float> %C
 }
   %C = uitofp <8 x i32> %A to <8 x float>
   ret <8 x float> %C
 }
+
+define <4 x double> @test3(<4 x i32> %arg) {
+; CHECK-LABEL: test3:
+; This test used to crash because we were custom lowering it as if it was
+; a conversion between <4 x i32> and <4 x float>.
+; AVX: vcvtdq2pd
+; AVX2: vcvtdq2pd
+; CHECK: retq
+  %tmp = uitofp <4 x i32> %arg to <4 x double>
+  ret <4 x double> %tmp
+}