diff options
-rw-r--r-- | llvm/test/Transforms/InstCombine/vec_shuffle.ll | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/llvm/test/Transforms/InstCombine/vec_shuffle.ll b/llvm/test/Transforms/InstCombine/vec_shuffle.ll index 7692fe3e05c..6e500451828 100644 --- a/llvm/test/Transforms/InstCombine/vec_shuffle.ll +++ b/llvm/test/Transforms/InstCombine/vec_shuffle.ll @@ -265,8 +265,8 @@ define <3 x i8> @fold_inselts_with_widening_shuffle(i8 %x, i8 %y) { define <2 x i8> @test13b(i8 %x) { ; CHECK-LABEL: @test13b( -; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i8> undef, i8 [[X:%.*]], i32 1 -; CHECK-NEXT: ret <2 x i8> [[TMP1]] +; CHECK-NEXT: [[B:%.*]] = insertelement <2 x i8> undef, i8 [[X:%.*]], i32 1 +; CHECK-NEXT: ret <2 x i8> [[B]] ; %A = insertelement <2 x i8> undef, i8 %x, i32 0 %B = shufflevector <2 x i8> %A, <2 x i8> undef, <2 x i32> <i32 undef, i32 0> @@ -605,6 +605,62 @@ define <4 x i8> @widening_shuffle_add_invalid_mask(<2 x i8> %x) { ret <4 x i8> %r } +; A binop that produces undef in the high lanes can be moved before the shuffle. +; This is ok because 'shl C, undef --> undef'. + +define <4 x i16> @widening_shuffle_shl_constant_op0(<2 x i16> %v) { +; CHECK-LABEL: @widening_shuffle_shl_constant_op0( +; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i16> <i16 42, i16 -42>, [[V:%.*]] +; CHECK-NEXT: [[BO:%.*]] = shufflevector <2 x i16> [[TMP1]], <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> +; CHECK-NEXT: ret <4 x i16> [[BO]] +; + %shuf = shufflevector <2 x i16> %v, <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> + %bo = shl <4 x i16> <i16 42, i16 -42, i16 -1, i16 -1>, %shuf + ret <4 x i16> %bo +} + +; A binop that produces undef in the high lanes can be moved before the shuffle. +; This is ok because 'shl undef, 0 --> undef'. + +define <4 x i16> @widening_shuffle_shl_constant_op1(<2 x i16> %v) { +; CHECK-LABEL: @widening_shuffle_shl_constant_op1( +; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i16> [[V:%.*]], <i16 2, i16 4> +; CHECK-NEXT: [[BO:%.*]] = shufflevector <2 x i16> [[TMP1]], <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> +; CHECK-NEXT: ret <4 x i16> [[BO]] +; + %shuf = shufflevector <2 x i16> %v, <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> + %bo = shl <4 x i16> %shuf, <i16 2, i16 4, i16 0, i16 0> + ret <4 x i16> %bo +} + +; FIXME: A binop that does not produce undef in the high lanes can not be moved before the shuffle. +; This is not ok because 'shl undef, 1 (or 2)' --> 0' but moving the shuffle results in undef instead. + +define <4 x i16> @widening_shuffle_shl_constant_op1_non0(<2 x i16> %v) { +; CHECK-LABEL: @widening_shuffle_shl_constant_op1_non0( +; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i16> [[V:%.*]], <i16 2, i16 4> +; CHECK-NEXT: [[BO:%.*]] = shufflevector <2 x i16> [[TMP1]], <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> +; CHECK-NEXT: ret <4 x i16> [[BO]] +; + %shuf = shufflevector <2 x i16> %v, <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> + %bo = shl <4 x i16> %shuf, <i16 2, i16 4, i16 1, i16 2> + ret <4 x i16> %bo +} + +; FIXME: A binop that does not produce undef in the high lanes can not be moved before the shuffle. +; This is not ok because 'or -1, undef --> -1' but moving the shuffle results in undef instead. + +define <4 x i16> @widening_shuffle_or(<2 x i16> %v) { +; CHECK-LABEL: @widening_shuffle_or( +; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i16> [[V:%.*]], <i16 42, i16 -42> +; CHECK-NEXT: [[BO:%.*]] = shufflevector <2 x i16> [[TMP1]], <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> +; CHECK-NEXT: ret <4 x i16> [[BO]] +; + %shuf = shufflevector <2 x i16> %v, <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> + %bo = or <4 x i16> %shuf, <i16 42, i16 -42, i16 -1, i16 -1> + ret <4 x i16> %bo +} + define <4 x i32> @shuffle_17add2(<4 x i32> %v) { ; CHECK-LABEL: @shuffle_17add2( ; CHECK-NEXT: [[TMP1:%.*]] = shl <4 x i32> [[V:%.*]], <i32 1, i32 1, i32 1, i32 1> |