From 791949afe56027404a4c0bc605f7e72cc272b41a Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Wed, 4 Sep 2019 13:38:49 +0000 Subject: [PATCH] [InstCombine] add tests for insert/extract with identity shuffles; NFC llvm-svn: 370901 --- .../InstCombine/insert-extract-shuffle.ll | 92 ++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll index 3a17acd..f6a837f 100644 --- a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll +++ b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll @@ -572,3 +572,95 @@ define <4 x float> @insert_in_nonsplat2(float %x, <4 x float> %y) { %r = insertelement <4 x float> %splat, float %x, i32 3 ret <4 x float> %r } + +define <4 x i8> @shuf_identity_padding(<2 x i8> %x, i8 %y) { +; CHECK-LABEL: @shuf_identity_padding( +; CHECK-NEXT: [[V0:%.*]] = shufflevector <2 x i8> [[X:%.*]], <2 x i8> undef, <4 x i32> +; CHECK-NEXT: [[X1:%.*]] = extractelement <2 x i8> [[X]], i32 1 +; CHECK-NEXT: [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i32 1 +; CHECK-NEXT: [[V2:%.*]] = insertelement <4 x i8> [[V1]], i8 [[Y:%.*]], i32 2 +; CHECK-NEXT: ret <4 x i8> [[V2]] +; + %v0 = shufflevector <2 x i8> %x, <2 x i8> undef, <4 x i32> + %x1 = extractelement <2 x i8> %x, i32 1 + %v1 = insertelement <4 x i8> %v0, i8 %x1, i32 1 + %v2 = insertelement <4 x i8> %v1, i8 %y, i32 2 + ret <4 x i8> %v2 +} + +define <3 x i8> @shuf_identity_extract(<4 x i8> %x, i8 %y) { +; CHECK-LABEL: @shuf_identity_extract( +; CHECK-NEXT: [[V0:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> undef, <3 x i32> +; CHECK-NEXT: [[X1:%.*]] = extractelement <4 x i8> [[X]], i32 1 +; CHECK-NEXT: [[V1:%.*]] = insertelement <3 x i8> [[V0]], i8 [[X1]], i32 1 +; CHECK-NEXT: [[V2:%.*]] = insertelement <3 x i8> [[V1]], i8 [[Y:%.*]], i32 2 +; CHECK-NEXT: ret <3 x i8> [[V2]] +; + %v0 = shufflevector <4 x i8> %x, <4 x i8> undef, <3 x i32> + %x1 = extractelement <4 x i8> %x, i32 1 + %v1 = insertelement <3 x i8> %v0, i8 %x1, i32 1 + %v2 = insertelement <3 x i8> %v1, i8 %y, i32 2 + ret <3 x i8> %v2 +} + +define <4 x float> @shuf_identity_extract_extra_use(<6 x float> %x, float %y) { +; CHECK-LABEL: @shuf_identity_extract_extra_use( +; CHECK-NEXT: [[V0:%.*]] = shufflevector <6 x float> [[X:%.*]], <6 x float> undef, <4 x i32> +; CHECK-NEXT: call void @use(<4 x float> [[V0]]) +; CHECK-NEXT: [[X1:%.*]] = extractelement <6 x float> [[X]], i32 2 +; CHECK-NEXT: [[V1:%.*]] = insertelement <4 x float> [[V0]], float [[X1]], i32 2 +; CHECK-NEXT: [[V2:%.*]] = insertelement <4 x float> [[V1]], float [[Y:%.*]], i32 1 +; CHECK-NEXT: ret <4 x float> [[V2]] +; + %v0 = shufflevector <6 x float> %x, <6 x float> undef, <4 x i32> + call void @use(<4 x float> %v0) + %x1 = extractelement <6 x float> %x, i32 2 + %v1 = insertelement <4 x float> %v0, float %x1, i32 2 + %v2 = insertelement <4 x float> %v1, float %y, i32 1 + ret <4 x float> %v2 +} + +define <4 x i8> @shuf_identity_padding_variable_index(<2 x i8> %x, i8 %y, i32 %index) { +; CHECK-LABEL: @shuf_identity_padding_variable_index( +; CHECK-NEXT: [[V0:%.*]] = shufflevector <2 x i8> [[X:%.*]], <2 x i8> undef, <4 x i32> +; CHECK-NEXT: [[X1:%.*]] = extractelement <2 x i8> [[X]], i32 [[INDEX:%.*]] +; CHECK-NEXT: [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i32 [[INDEX]] +; CHECK-NEXT: [[V2:%.*]] = insertelement <4 x i8> [[V1]], i8 [[Y:%.*]], i32 2 +; CHECK-NEXT: ret <4 x i8> [[V2]] +; + %v0 = shufflevector <2 x i8> %x, <2 x i8> undef, <4 x i32> + %x1 = extractelement <2 x i8> %x, i32 %index + %v1 = insertelement <4 x i8> %v0, i8 %x1, i32 %index + %v2 = insertelement <4 x i8> %v1, i8 %y, i32 2 + ret <4 x i8> %v2 +} + +define <4 x i8> @shuf_identity_padding_wrong_source_vec(<2 x i8> %x, i8 %y, <2 x i8> %other) { +; CHECK-LABEL: @shuf_identity_padding_wrong_source_vec( +; CHECK-NEXT: [[V0:%.*]] = shufflevector <2 x i8> [[X:%.*]], <2 x i8> undef, <4 x i32> +; CHECK-NEXT: [[X1:%.*]] = extractelement <2 x i8> [[OTHER:%.*]], i32 1 +; CHECK-NEXT: [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i32 1 +; CHECK-NEXT: [[V2:%.*]] = insertelement <4 x i8> [[V1]], i8 [[Y:%.*]], i32 2 +; CHECK-NEXT: ret <4 x i8> [[V2]] +; + %v0 = shufflevector <2 x i8> %x, <2 x i8> undef, <4 x i32> + %x1 = extractelement <2 x i8> %other, i32 1 + %v1 = insertelement <4 x i8> %v0, i8 %x1, i32 1 + %v2 = insertelement <4 x i8> %v1, i8 %y, i32 2 + ret <4 x i8> %v2 +} + +define <4 x i8> @shuf_identity_padding_wrong_index(<2 x i8> %x, i8 %y) { +; CHECK-LABEL: @shuf_identity_padding_wrong_index( +; CHECK-NEXT: [[V0:%.*]] = shufflevector <2 x i8> [[X:%.*]], <2 x i8> undef, <4 x i32> +; CHECK-NEXT: [[X1:%.*]] = extractelement <2 x i8> [[X]], i32 1 +; CHECK-NEXT: [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i32 2 +; CHECK-NEXT: [[V2:%.*]] = insertelement <4 x i8> [[V1]], i8 [[Y:%.*]], i32 3 +; CHECK-NEXT: ret <4 x i8> [[V2]] +; + %v0 = shufflevector <2 x i8> %x, <2 x i8> undef, <4 x i32> + %x1 = extractelement <2 x i8> %x, i32 1 + %v1 = insertelement <4 x i8> %v0, i8 %x1, i32 2 + %v2 = insertelement <4 x i8> %v1, i8 %y, i32 3 + ret <4 x i8> %v2 +} -- 2.7.4