When emulating vselect using OR/AND/XOR make sure to bitcast the result back to the...
authorNadav Rotem <nadav.rotem@intel.com>
Sun, 15 Apr 2012 15:08:09 +0000 (15:08 +0000)
committerNadav Rotem <nadav.rotem@intel.com>
Sun, 15 Apr 2012 15:08:09 +0000 (15:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154764 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
test/CodeGen/X86/sse41-blend.ll

index 3ae8345bd1983ed119153c56c2ecb2fdabbfcaa5..9fe4480d113a69afdb10745091a078947bfa9e13 100644 (file)
@@ -417,7 +417,8 @@ SDValue VectorLegalizer::ExpandVSELECT(SDValue Op) {
 
   Op1 = DAG.getNode(ISD::AND, DL, VT, Op1, Mask);
   Op2 = DAG.getNode(ISD::AND, DL, VT, Op2, NotMask);
-  return DAG.getNode(ISD::OR, DL, VT, Op1, Op2);
+  SDValue Val = DAG.getNode(ISD::OR, DL, VT, Op1, Op2);
+  return DAG.getNode(ISD::BITCAST, DL, Op.getValueType(), Val);
 }
 
 SDValue VectorLegalizer::ExpandUINT_TO_FLOAT(SDValue Op) {
index 78604a0e96345ce0a5477ab5ec795c986e1885b9..1a1017d2c1762b24a224fe1e6b5fa27f66c171c6 100644 (file)
@@ -80,3 +80,11 @@ define <2 x double> @B(<2 x double> %x, <2 x double> %y) {
   ret <2 x double> %min
 }
 
+; CHECK: float_crash
+define void @float_crash() nounwind {
+entry:
+  %merge205vector_func.i = select <4 x i1> undef, <4 x double> undef, <4 x double> undef
+  %extract214vector_func.i = extractelement <4 x double> %merge205vector_func.i, i32 0
+  store double %extract214vector_func.i, double addrspace(1)* undef, align 8
+  ret void
+}