Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp =================================================================== --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2851,27 +2851,46 @@ // FIXME: Entirely reasonable to perform folding of other unary // operations here as the need arises. break; - case ISD::TRUNCATE: - // Constant build vector truncation can be done with the original scalar - // operands but with a new build vector with the truncated value type. - return getNode(ISD::BUILD_VECTOR, DL, VT, BV->ops()); case ISD::FNEG: case ISD::FABS: case ISD::FCEIL: case ISD::FTRUNC: case ISD::FFLOOR: case ISD::FP_EXTEND: + case ISD::TRUNCATE: case ISD::UINT_TO_FP: case ISD::SINT_TO_FP: { + EVT SVT = VT.getScalarType(); + EVT InVT = BV->getValueType(0); + EVT InSVT = InVT.getScalarType(); + + // Find legal integer scalar type for constant promotion. + EVT LegalSVT = SVT; + if (SVT.isInteger()) { + LegalSVT = TLI->getTypeToTransformTo(*getContext(), SVT); + assert(LegalSVT.bitsGE(SVT) && "Unexpected legal scalar type size"); + } + // Let the above scalar folding handle the folding of each element. SmallVector Ops; for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) { SDValue OpN = BV->getOperand(i); - OpN = getNode(Opcode, DL, VT.getVectorElementType(), OpN); + EVT OpVT = OpN.getValueType(); + + // Build vector (integer) scalar operands may need implicit + // truncation - do this before constant folding. + if (OpVT.isInteger() && OpVT.bitsGT(InSVT)) + OpN = getNode(ISD::TRUNCATE, DL, InSVT, OpN); + + OpN = getNode(Opcode, DL, SVT, OpN); if (OpN.getOpcode() != ISD::UNDEF && OpN.getOpcode() != ISD::Constant && OpN.getOpcode() != ISD::ConstantFP) break; + + // Legalize the (integer) scalar constant if necessary. + if (LegalSVT != SVT) + OpN = getNode(ISD::ANY_EXTEND, DL, LegalSVT, OpN); Ops.push_back(OpN); } if (Ops.size() == VT.getVectorNumElements()) Index: test/CodeGen/X86/fold-vector-bv-crash.ll =================================================================== --- test/CodeGen/X86/fold-vector-bv-crash.ll +++ test/CodeGen/X86/fold-vector-bv-crash.ll @@ -0,0 +1,393 @@ +; RUN: llc < %s -mtriple=i686-unknown -mcpu=corei7 +; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=corei7 + +; +; llvm-stress generated crash case due to build_vector implicit +; truncation bug from constant folding after legalization. +; +define void @autogen_SD14654(i8*, i32*, i64*, i32, i64, i8) { +BB: + %A4 = alloca double + %A3 = alloca float + %A2 = alloca <4 x float> + %A1 = alloca <8 x double> + %A = alloca <2 x double> + %L = load i8, i8* %0 + store double 0.000000e+00, double* %A4 + %E = extractelement <2 x i32> , i32 1 + %Shuff = shufflevector <8 x i64> zeroinitializer, <8 x i64> , <8 x i32> + %I = insertelement <4 x i64> zeroinitializer, i64 15910, i32 0 + %B = udiv i64 15910, 15910 + %Tr = trunc <4 x i64> %I to <4 x i8> + %Sl = select i1 false, float 0xB9A6ECCAC0000000, float 0x41E7B8FB80000000 + %Cmp = icmp uge i64 0, %4 + br label %CF + +CF: ; preds = %CF, %CF247, %BB + %L5 = load i8, i8* %0 + store i8 %L, i8* %0 + %E6 = extractelement <8 x i64> %Shuff, i32 5 + %Shuff7 = shufflevector <8 x i16> zeroinitializer, <8 x i16> zeroinitializer, <8 x i32> + %I8 = insertelement <8 x i16> zeroinitializer, i16 2172, i32 2 + %PC = bitcast <8 x double>* %A1 to float* + %Sl9 = select i1 false, i64 431734, i64 164409 + %Cmp10 = icmp sge i32 %3, 307133 + br i1 %Cmp10, label %CF, label %CF247 + +CF247: ; preds = %CF + %L11 = load float, float* %PC + store <8 x double> , <8 x double>* %A1 + %E12 = extractelement <8 x i64> zeroinitializer, i32 6 + %Shuff13 = shufflevector <8 x i16> zeroinitializer, <8 x i16> %Shuff7, <8 x i32> + %I14 = insertelement <8 x i64> zeroinitializer, i64 %Sl9, i32 3 + %B15 = or i64 431734, -1 + %ZE = zext <8 x i16> %I8 to <8 x i64> + %Sl16 = select i1 false, double 0.000000e+00, double 0.000000e+00 + %Cmp17 = fcmp one float 0xC0ACB20080000000, 0xBFD3FF37C0000000 + br i1 %Cmp17, label %CF, label %CF246 + +CF246: ; preds = %CF246, %CF265, %CF272, %CF268, %CF247 + %L18 = load i8, i8* %0 + store float 0x4218FBBCC0000000, float* %PC + %E19 = extractelement <2 x i64> zeroinitializer, i32 0 + %Shuff20 = shufflevector <8 x i16> zeroinitializer, <8 x i16> zeroinitializer, <8 x i32> + %I21 = insertelement <8 x i64> zeroinitializer, i64 431555, i32 5 + %B22 = and <1 x i16> zeroinitializer, zeroinitializer + %FC = uitofp i1 %Cmp17 to double + %Sl23 = select i1 false, <2 x i64> zeroinitializer, <2 x i64> zeroinitializer + %Cmp24 = icmp sgt i64 %E12, 431734 + br i1 %Cmp24, label %CF246, label %CF265 + +CF265: ; preds = %CF246 + %L25 = load float, float* %PC + store float %Sl, float* %PC + %E26 = extractelement <8 x i16> %Shuff13, i32 0 + %Shuff27 = shufflevector <8 x i16> zeroinitializer, <8 x i16> zeroinitializer, <8 x i32> + %I28 = insertelement <8 x i16> zeroinitializer, i16 %E26, i32 5 + %B29 = or <8 x i16> %Shuff27, %Shuff20 + %Tr30 = trunc i64 0 to i1 + br i1 %Tr30, label %CF246, label %CF250 + +CF250: ; preds = %CF250, %CF265 + %Sl31 = select i1 %Cmp24, i8 %L18, i8 %L18 + %Cmp32 = icmp ugt i64 164409, 0 + br i1 %Cmp32, label %CF250, label %CF272 + +CF272: ; preds = %CF250 + %L33 = load float, float* %PC + store float %L33, float* %PC + %E34 = extractelement <2 x i32> zeroinitializer, i32 0 + %Shuff35 = shufflevector <2 x i32> , <2 x i32> , <2 x i32> + %I36 = insertelement <8 x i16> zeroinitializer, i16 %E26, i32 1 + %B37 = urem <4 x i8> %Tr, %Tr + %Tr38 = trunc i64 -1 to i16 + %Sl39 = select i1 %Cmp24, <4 x float>* %A2, <4 x float>* %A2 + %Cmp40 = icmp eq i64 -1, %4 + br i1 %Cmp40, label %CF246, label %CF249 + +CF249: ; preds = %CF249, %CF257, %CF272 + %L41 = load float, float* %PC + store <4 x float> , <4 x float>* %Sl39 + %E42 = extractelement <8 x i16> %Shuff27, i32 6 + %Shuff43 = shufflevector <8 x i16> %Shuff13, <8 x i16> %Shuff7, <8 x i32> + %I44 = insertelement <4 x i64> zeroinitializer, i64 %4, i32 3 + %B45 = shl i8 %L18, %L + %Tr46 = trunc i8 %L to i1 + br i1 %Tr46, label %CF249, label %CF257 + +CF257: ; preds = %CF249 + %Sl47 = select i1 %Cmp, float %L33, float %L33 + %Cmp48 = fcmp oge float %L33, 0xBFD3FF37C0000000 + br i1 %Cmp48, label %CF249, label %CF251 + +CF251: ; preds = %CF251, %CF257 + %L49 = load float, float* %PC + store <4 x float> , <4 x float>* %Sl39 + %E50 = extractelement <8 x i16> %Shuff13, i32 0 + %Shuff51 = shufflevector <8 x i16> %Shuff43, <8 x i16> %Shuff7, <8 x i32> + %I52 = insertelement <8 x i16> %Shuff27, i16 %Tr38, i32 5 + %B53 = sdiv i8 -101, %L18 + %FC54 = uitofp <8 x i16> %Shuff20 to <8 x double> + %Sl55 = select i1 false, <4 x i64> %I44, <4 x i64> %I44 + %Cmp56 = icmp ne <4 x i8> %Tr, %Tr + %L57 = load i8, i8* %0 + store <4 x float> , <4 x float>* %Sl39 + %E58 = extractelement <2 x i32> , i32 0 + %Shuff59 = shufflevector <8 x i16> %Shuff51, <8 x i16> zeroinitializer, <8 x i32> + %I60 = insertelement <8 x i16> zeroinitializer, i16 %Tr38, i32 5 + %B61 = and i64 0, %4 + %FC62 = uitofp <8 x i16> %I28 to <8 x float> + %Sl63 = select i1 false, i1 %Tr46, i1 %Tr30 + br i1 %Sl63, label %CF251, label %CF254 + +CF254: ; preds = %CF254, %CF267, %CF261, %CF251 + %Cmp64 = fcmp une float 0xBFD3FF37C0000000, 0x41E7B8FB80000000 + br i1 %Cmp64, label %CF254, label %CF267 + +CF267: ; preds = %CF254 + %L65 = load float, float* %PC + store float 0.000000e+00, float* %PC + %E66 = extractelement <2 x i64> zeroinitializer, i32 1 + %Shuff67 = shufflevector <8 x i16> %Shuff51, <8 x i16> zeroinitializer, <8 x i32> + %I68 = insertelement <8 x i16> %Shuff13, i16 %E26, i32 2 + %B69 = mul i32 %3, %E58 + %Sl70 = select i1 false, float* %A3, float* %A3 + %L71 = load float, float* %PC + store <4 x float> , <4 x float>* %Sl39 + %E72 = extractelement <8 x i16> %Shuff20, i32 6 + %Shuff73 = shufflevector <8 x i16> %Shuff27, <8 x i16> %Shuff43, <8 x i32> + %I74 = insertelement <8 x i16> %Shuff67, i16 %E26, i32 3 + %B75 = fmul double 0.000000e+00, 0.000000e+00 + %ZE76 = zext i1 %Cmp17 to i8 + %Sl77 = select i1 false, <8 x i16> %Shuff13, <8 x i16> zeroinitializer + %Cmp78 = icmp sgt i1 %Cmp24, false + br i1 %Cmp78, label %CF254, label %CF259 + +CF259: ; preds = %CF259, %CF267 + %L79 = load i8, i8* %0 + store float %Sl, float* %PC + %E80 = extractelement <2 x i32> %Shuff35, i32 1 + %Shuff81 = shufflevector <2 x i32> %Shuff35, <2 x i32> , <2 x i32> + %I82 = insertelement <8 x i16> %Shuff67, i16 2172, i32 2 + %Se = sext i1 %Cmp32 to i32 + %Sl83 = select i1 %Cmp17, <8 x i64> %Shuff, <8 x i64> %I14 + %Cmp84 = icmp slt i8 %5, -101 + br i1 %Cmp84, label %CF259, label %CF261 + +CF261: ; preds = %CF259 + %L85 = load float, float* %PC + store float %L11, float* %Sl70 + %E86 = extractelement <8 x i64> %Shuff, i32 4 + %Shuff87 = shufflevector <4 x i64> zeroinitializer, <4 x i64> zeroinitializer, <4 x i32> + %I88 = insertelement <8 x i16> %Shuff7, i16 %E26, i32 1 + %B89 = add i32 %Se, %B69 + %Se90 = sext i1 %Cmp17 to i32 + %Sl91 = select i1 %Sl63, i64 431734, i64 %E86 + %Cmp92 = icmp sge i32 %Se90, %E34 + br i1 %Cmp92, label %CF254, label %CF258 + +CF258: ; preds = %CF258, %CF270, %CF271, %CF261 + %L93 = load i8, i8* %0 + store <4 x float> , <4 x float>* %Sl39 + %E94 = extractelement <8 x i16> %Shuff73, i32 1 + %Shuff95 = shufflevector <4 x i64> %Shuff87, <4 x i64> %I44, <4 x i32> + %I96 = insertelement <8 x i16> %Shuff43, i16 %E72, i32 6 + %B97 = mul <2 x i32> %Shuff35, %Shuff35 + %PC98 = bitcast double* %A4 to float* + %Sl99 = select i1 %Cmp40, float %L71, float %L25 + %L100 = load float, float* %PC + store float 0.000000e+00, float* %PC + %E101 = extractelement <8 x i16> zeroinitializer, i32 6 + %Shuff102 = shufflevector <8 x i16> %I82, <8 x i16> %Shuff7, <8 x i32> + %I103 = insertelement <8 x i16> %Shuff51, i16 %E94, i32 3 + %B104 = urem <8 x i16> %Shuff73, %Shuff7 + %Se105 = sext i1 %Cmp92 to i16 + %Sl106 = select i1 %Cmp92, i64 %Sl91, i64 %E6 + %Cmp107 = fcmp false float %Sl, 0xBFD3FF37C0000000 + br i1 %Cmp107, label %CF258, label %CF270 + +CF270: ; preds = %CF258 + %L108 = load float, float* %Sl70 + store <4 x float> , <4 x float>* %Sl39 + %E109 = extractelement <8 x i16> %Shuff59, i32 1 + %Shuff110 = shufflevector <4 x i64> %Shuff95, <4 x i64> %Shuff87, <4 x i32> + %I111 = insertelement <8 x i16> %Shuff43, i16 %E50, i32 6 + %B112 = frem float %Sl99, 0x41E7B8FB80000000 + %FC113 = uitofp <4 x i1> %Cmp56 to <4 x float> + %Sl114 = select i1 false, i1 %Cmp10, i1 %Sl63 + br i1 %Sl114, label %CF258, label %CF263 + +CF263: ; preds = %CF263, %CF270 + %Cmp115 = icmp sgt <8 x i64> %Shuff, zeroinitializer + %L116 = load float, float* %PC + store float %L25, float* %PC + %E117 = extractelement <8 x i16> %Shuff27, i32 5 + %Shuff118 = shufflevector <8 x i64> zeroinitializer, <8 x i64> %I14, <8 x i32> + %I119 = insertelement <1 x i16> zeroinitializer, i16 2172, i32 0 + %B120 = ashr <8 x i16> %Shuff7, zeroinitializer + %PC121 = bitcast <2 x double>* %A to i64* + %Sl122 = select i1 %Cmp40, i8 %B45, i8 %ZE76 + %Cmp123 = fcmp ogt double %FC, %B75 + br i1 %Cmp123, label %CF263, label %CF271 + +CF271: ; preds = %CF263 + %L124 = load i64, i64* %PC121 + store float %L25, float* %PC98 + %E125 = extractelement <4 x i64> %Shuff87, i32 0 + %Shuff126 = shufflevector <8 x i16> %Shuff102, <8 x i16> %I111, <8 x i32> + %I127 = insertelement <8 x i16> %Shuff7, i16 %E94, i32 1 + %B128 = srem <8 x i16> %Shuff67, %I68 + %FC129 = uitofp i1 %Cmp123 to double + %Sl130 = select i1 false, i8 %L5, i8 %B45 + %Cmp131 = icmp sgt <4 x i64> zeroinitializer, %I44 + %L132 = load float, float* %PC98 + store float 0.000000e+00, float* %PC98 + %E133 = extractelement <8 x i16> %I28, i32 3 + %Shuff134 = shufflevector <8 x i16> %I88, <8 x i16> %Shuff7, <8 x i32> + %I135 = insertelement <4 x i64> %Shuff87, i64 15910, i32 0 + %B136 = srem i64 %E19, %B61 + %FC137 = sitofp <8 x i16> %I68 to <8 x double> + %Sl138 = select i1 false, i64 %L124, i64 %E19 + %Cmp139 = icmp sge <8 x i64> %Shuff, %Shuff118 + %L140 = load float, float* %Sl70 + store <4 x float> %FC113, <4 x float>* %Sl39 + %E141 = extractelement <2 x i64> %Sl23, i32 0 + %Shuff142 = shufflevector <2 x i64> %Sl23, <2 x i64> zeroinitializer, <2 x i32> + %I143 = insertelement <4 x i64> zeroinitializer, i64 %B61, i32 1 + %B144 = frem float %L71, 0.000000e+00 + %Tr145 = trunc <8 x i64> %Shuff118 to <8 x i16> + %Sl146 = select i1 %Sl114, i64 %B15, i64 %E19 + %Cmp147 = icmp eq i1 %Cmp17, false + br i1 %Cmp147, label %CF258, label %CF262 + +CF262: ; preds = %CF262, %CF271 + %L148 = load float, float* %PC98 + store <4 x float> %FC113, <4 x float>* %Sl39 + %E149 = extractelement <8 x i16> %Shuff59, i32 6 + %Shuff150 = shufflevector <8 x i16> %Shuff51, <8 x i16> zeroinitializer, <8 x i32> + %I151 = insertelement <8 x i16> zeroinitializer, i16 2172, i32 3 + %B152 = frem float %L33, 0xBFD3FF37C0000000 + %FC153 = uitofp i1 %Cmp17 to double + %Sl154 = select i1 false, <8 x i16> %I82, <8 x i16> %Shuff20 + %Cmp155 = icmp ult <8 x i16> %Shuff126, %Shuff102 + %L156 = load <4 x float>, <4 x float>* %Sl39 + store i8 %L57, i8* %0 + %E157 = extractelement <4 x i64> %I143, i32 2 + %Shuff158 = shufflevector <4 x i64> zeroinitializer, <4 x i64> %Shuff87, <4 x i32> + %I159 = insertelement <4 x i64> %I44, i64 %B61, i32 3 + %B160 = shl i64 %B15, %E66 + %Tr161 = trunc i8 %L to i1 + br i1 %Tr161, label %CF262, label %CF268 + +CF268: ; preds = %CF262 + %Sl162 = select i1 %Cmp, float 0xC0ACB20080000000, float %B152 + %Cmp163 = icmp ne <8 x i16> %I28, %B120 + %L164 = load <4 x float>, <4 x float>* %Sl39 + store float 0xBFD3FF37C0000000, float* %PC + %E165 = extractelement <8 x i64> zeroinitializer, i32 4 + %Shuff166 = shufflevector <2 x i32> , <2 x i32> , <2 x i32> + %I167 = insertelement <8 x i16> %Shuff20, i16 2172, i32 5 + %B168 = lshr i8 %Sl122, %Sl122 + %Sl169 = select i1 %Sl114, float %L132, float %B112 + %Cmp170 = fcmp ogt float %L71, %L33 + br i1 %Cmp170, label %CF246, label %CF248 + +CF248: ; preds = %CF248, %CF269, %CF268 + %L171 = load float, float* %Sl70 + store i8 %Sl31, i8* %0 + %E172 = extractelement <4 x i64> %I, i32 1 + %Shuff173 = shufflevector <8 x i16> %Shuff67, <8 x i16> %I111, <8 x i32> + %I174 = insertelement <2 x i64> zeroinitializer, i64 %B61, i32 0 + %B175 = srem i16 %E149, %E149 + %ZE176 = zext i1 %Sl114 to i32 + %Sl177 = select i1 false, double 0.000000e+00, double 0.000000e+00 + %Cmp178 = icmp ugt <8 x i16> %Shuff173, %Tr145 + %L179 = load float, float* %PC98 + store float 0xBFD3FF37C0000000, float* %Sl70 + %E180 = extractelement <4 x i64> %Shuff110, i32 0 + %Shuff181 = shufflevector <8 x i16> %Shuff59, <8 x i16> %I88, <8 x i32> + %I182 = insertelement <2 x i64> zeroinitializer, i64 %B61, i32 1 + %B183 = add i64 431734, %E66 + %Se184 = sext <8 x i16> %Tr145 to <8 x i64> + %Sl185 = select i1 false, <4 x float> %L156, <4 x float> %FC113 + %Cmp186 = icmp sge i1 %Cmp107, false + br i1 %Cmp186, label %CF248, label %CF253 + +CF253: ; preds = %CF253, %CF248 + %L187 = load i8, i8* %0 + store i32 %E, i32* %1 + %E188 = extractelement <4 x i64> %I159, i32 0 + %Shuff189 = shufflevector <8 x i16> %Shuff126, <8 x i16> %Shuff181, <8 x i32> + %I190 = insertelement <8 x i64> zeroinitializer, i64 %E86, i32 1 + %B191 = mul <8 x i16> %Shuff7, %Shuff7 + %Tr192 = trunc i8 %L93 to i1 + br i1 %Tr192, label %CF253, label %CF260 + +CF260: ; preds = %CF260, %CF253 + %Sl193 = select i1 %Sl63, double 0.000000e+00, double %FC153 + %Cmp194 = icmp sgt <8 x i16> %I103, %Tr145 + %L195 = load i8, i8* %0 + store <4 x float> %FC113, <4 x float>* %Sl39 + %E196 = extractelement <2 x i64> %Shuff142, i32 0 + %Shuff197 = shufflevector <8 x i64> %Shuff118, <8 x i64> %Shuff118, <8 x i32> + %I198 = insertelement <4 x i64> zeroinitializer, i64 431734, i32 3 + %B199 = or i16 2172, %E72 + %BC = bitcast i32 307133 to float + %Sl200 = select i1 %Cmp186, i1 %Cmp84, i1 %Cmp186 + br i1 %Sl200, label %CF260, label %CF269 + +CF269: ; preds = %CF260 + %Cmp201 = icmp ule i8 %L195, %ZE76 + br i1 %Cmp201, label %CF248, label %CF252 + +CF252: ; preds = %CF252, %CF266, %CF264, %CF269 + %L202 = load i8, i8* %0 + store float %Sl99, float* %Sl70 + %E203 = extractelement <8 x i16> %I60, i32 0 + %Shuff204 = shufflevector <2 x i32> %Shuff35, <2 x i32> , <2 x i32> + %I205 = insertelement <8 x i16> %Shuff20, i16 %E26, i32 1 + %B206 = xor <4 x i64> %Sl55, %Sl55 + %FC207 = fptosi <8 x float> %FC62 to <8 x i8> + %Sl208 = select i1 %Cmp, <4 x float>* %Sl39, <4 x float>* %A2 + %Cmp209 = icmp ule i8 %L93, %B45 + br i1 %Cmp209, label %CF252, label %CF266 + +CF266: ; preds = %CF252 + %L210 = load <4 x float>, <4 x float>* %Sl208 + store float %L65, float* %PC + %E211 = extractelement <8 x i64> %Shuff118, i32 2 + %Shuff212 = shufflevector <8 x i16> %Shuff7, <8 x i16> %Shuff134, <8 x i32> + %I213 = insertelement <2 x i32> %Shuff204, i32 %ZE176, i32 1 + %ZE214 = zext i1 %Cmp92 to i32 + %Sl215 = select i1 %Sl114, float %B144, float %L71 + %Cmp216 = fcmp ult double %FC, %B75 + br i1 %Cmp216, label %CF252, label %CF264 + +CF264: ; preds = %CF266 + %L217 = load float, float* %PC + store <4 x float> %FC113, <4 x float>* %Sl208 + %E218 = extractelement <4 x i64> %Shuff87, i32 2 + %Shuff219 = shufflevector <8 x i16> %I167, <8 x i16> %Shuff189, <8 x i32> + %I220 = insertelement <4 x i64> zeroinitializer, i64 %B136, i32 3 + %Sl221 = select i1 %Cmp147, <2 x i32> %Shuff81, <2 x i32> %B97 + %Cmp222 = icmp uge i1 %Cmp10, %Cmp170 + br i1 %Cmp222, label %CF252, label %CF255 + +CF255: ; preds = %CF255, %CF264 + %L223 = load <2 x double>, <2 x double>* %A + store <4 x float> %FC113, <4 x float>* %Sl208 + %E224 = extractelement <2 x double> %L223, i32 1 + %Shuff225 = shufflevector <4 x i8> %B37, <4 x i8> %B37, <4 x i32> + %I226 = insertelement <8 x float> %FC62, float %L108, i32 6 + %Se227 = sext i1 %Tr46 to i64 + %Sl228 = select i1 %Sl200, i64 %Sl9, i64 %B136 + %Cmp229 = icmp ule <8 x i16> %Shuff219, %Shuff212 + %L230 = load <4 x float>, <4 x float>* %Sl208 + store <4 x float> %L230, <4 x float>* %Sl208 + %E231 = extractelement <8 x i16> %Shuff20, i32 7 + %Shuff232 = shufflevector <2 x i32> , <2 x i32> %Shuff81, <2 x i32> + %I233 = insertelement <2 x i32> %I213, i32 %ZE176, i32 0 + %B234 = udiv <2 x i32> %I213, %Shuff232 + %ZE235 = fpext float %L33 to double + %Sl236 = select i1 %Cmp92, i1 %Tr46, i1 %Sl63 + br i1 %Sl236, label %CF255, label %CF256 + +CF256: ; preds = %CF255 + %Cmp237 = icmp sge <2 x i32> zeroinitializer, %Shuff204 + %L238 = load double, double* %A4 + store i64 %E125, i64* %PC121 + %E239 = extractelement <8 x i16> %Shuff59, i32 3 + %Shuff240 = shufflevector <4 x i64> %Shuff110, <4 x i64> %I44, <4 x i32> + %I241 = insertelement <8 x i16> %Tr145, i16 %E117, i32 0 + %B242 = sub i64 %B183, %E157 + %FC243 = sitofp <4 x i64> zeroinitializer to <4 x double> + %Sl244 = select i1 %Cmp84, <2 x i64> %I182, <2 x i64> zeroinitializer + %Cmp245 = icmp slt <2 x i64> %Shuff142, %Sl244 + store i64 -1, i64* %PC121 + store <4 x float> %FC113, <4 x float>* %Sl39 + store <2 x double> %L223, <2 x double>* %A + store <4 x float> %FC113, <4 x float>* %Sl39 + store <4 x float> %FC113, <4 x float>* %Sl208 + ret void +} + Index: test/CodeGen/X86/fold-vector-trunc-sitofp.ll =================================================================== --- test/CodeGen/X86/fold-vector-trunc-sitofp.ll +++ test/CodeGen/X86/fold-vector-trunc-sitofp.ll @@ -0,0 +1,13 @@ +; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s + +; Check that constant integer correctly being truncated before float conversion + +define <4 x float> @test1() { +; CHECK-LABEL: test1 +; CHECK: vmovaps {{.*#+}} xmm0 = [-1.000000e+00,0.000000e+00,-1.000000e+00,0.000000e+00] +; CHECK-NEXT: ret + %1 = trunc <4 x i3> to <4 x i1> + %2 = sitofp <4 x i1> %1 to <4 x float> + ret <4 x float> %2 +}