AVX: fixed a bug in LowerVECTOR_SHUFFLE

llvm-svn: 201140
This commit is contained in:
Elena Demikhovsky 2014-02-11 10:21:53 +00:00
parent 1067ab0a1a
commit 1f32c313f1
2 changed files with 14 additions and 1 deletions

View File

@ -7371,7 +7371,11 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const {
if (V1IsUndef && V2IsUndef)
return DAG.getUNDEF(VT);
assert(!V1IsUndef && "Op 1 of shuffle should not be undef");
// When we create a shuffle node we put the UNDEF node to second operand,
// but in some cases the first operand may be transformed to UNDEF.
// In this case we should just commute the node.
if (V1IsUndef)
return CommuteVectorShuffle(SVOp, DAG);
// Vector shuffle lowering takes 3 steps:
//

View File

@ -297,3 +297,12 @@ entry:
}
declare <2 x double> @llvm.x86.avx.vextractf128.pd.256(<4 x double>, i8) nounwind readnone
declare <4 x double> @llvm.x86.avx.vinsertf128.pd.256(<4 x double>, <2 x double>, i8) nounwind readnone
; this test case just should not fail
define void @test20() {
%a0 = insertelement <3 x double> <double 0.000000e+00, double 0.000000e+00, double undef>, double 0.000000e+00, i32 2
store <3 x double> %a0, <3 x double>* undef, align 1
%a1 = insertelement <3 x double> <double 0.000000e+00, double 0.000000e+00, double undef>, double undef, i32 2
store <3 x double> %a1, <3 x double>* undef, align 1
ret void
}