diff options
| author | Vladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com> | 2023-09-01 18:37:36 +0200 |
|---|---|---|
| committer | Vladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com> | 2023-09-07 12:03:04 +0200 |
| commit | 1d0d2dfce7c8967fe58f28ec14a75b9186a3fc55 (patch) | |
| tree | 6d5914afee626ffcadf03e9b8a6f0f7505c0d725 /llvm | |
| parent | cd80cd3d14c6140e5383eb2b6157f1e85c6620aa (diff) | |
| download | llvm-1d0d2dfce7c8967fe58f28ec14a75b9186a3fc55.zip llvm-1d0d2dfce7c8967fe58f28ec14a75b9186a3fc55.tar.gz llvm-1d0d2dfce7c8967fe58f28ec14a75b9186a3fc55.tar.bz2 | |
[GlobalISel] Fold G_SHUFFLE_VECTOR with a single element mask to G_EXTRACT_VECTOR_ELT
It introduces minor regression in arm64-vcvt_f.ll, which will be fixed
later.
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h | 2 | ||||
| -rw-r--r-- | llvm/include/llvm/Target/GlobalISel/Combine.td | 7 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp | 33 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64Combine.td | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-shuffle-vector.mir | 51 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/arm64-vcvt_f.ll | 9 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/ext-narrow-index.ll | 196 |
7 files changed, 227 insertions, 74 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h index 75799e5..9b464c7 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CombinerHelper.h @@ -255,6 +255,8 @@ public: /// Replace \p MI with a concat_vectors with \p Ops. void applyCombineShuffleVector(MachineInstr &MI, const ArrayRef<Register> Ops); + bool matchShuffleToExtract(MachineInstr &MI); + void applyShuffleToExtract(MachineInstr &MI); /// Optimize memcpy intrinsics et al, e.g. constant len calls. /// /p MaxLen if non-zero specifies the max length of a mem libcall to inline. diff --git a/llvm/include/llvm/Target/GlobalISel/Combine.td b/llvm/include/llvm/Target/GlobalISel/Combine.td index 977d5cb..fd73a59 100644 --- a/llvm/include/llvm/Target/GlobalISel/Combine.td +++ b/llvm/include/llvm/Target/GlobalISel/Combine.td @@ -353,6 +353,13 @@ def propagate_undef_shuffle_mask: GICombineRule< [{ return Helper.matchUndefShuffleVectorMask(*${root}); }]), (apply [{ Helper.replaceInstWithUndef(*${root}); }])>; +// Replace a G_SHUFFLE_VECTOR with a G_EXTRACT_VECTOR_ELT. +def shuffle_to_extract: GICombineRule< + (defs root:$root), + (match (wip_match_opcode G_SHUFFLE_VECTOR):$root, + [{ return Helper.matchShuffleToExtract(*${root}); }]), + (apply [{ Helper.applyShuffleToExtract(*${root}); }])>; + // Replace an insert/extract element of an out of bounds index with undef. def insert_extract_vec_elt_out_of_bounds : GICombineRule< (defs root:$root), diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp index 17f030c..836a796 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -395,6 +395,39 @@ void CombinerHelper::applyCombineShuffleVector(MachineInstr &MI, replaceRegWith(MRI, DstReg, NewDstReg); } +bool CombinerHelper::matchShuffleToExtract(MachineInstr &MI) { + assert(MI.getOpcode() == TargetOpcode::G_SHUFFLE_VECTOR && + "Invalid instruction kind"); + + ArrayRef<int> Mask = MI.getOperand(3).getShuffleMask(); + return Mask.size() == 1; +} + +void CombinerHelper::applyShuffleToExtract(MachineInstr &MI) { + Register DstReg = MI.getOperand(0).getReg(); + Builder.setInsertPt(*MI.getParent(), MI); + + int I = MI.getOperand(3).getShuffleMask()[0]; + Register Src1 = MI.getOperand(1).getReg(); + LLT Src1Ty = MRI.getType(Src1); + int Src1NumElts = Src1Ty.isVector() ? Src1Ty.getNumElements() : 1; + Register SrcReg; + if (I >= Src1NumElts) { + SrcReg = MI.getOperand(2).getReg(); + I -= Src1NumElts; + } else if (I >= 0) + SrcReg = Src1; + + if (I < 0) + Builder.buildUndef(DstReg); + else if (!MRI.getType(SrcReg).isVector()) + Builder.buildCopy(DstReg, SrcReg); + else + Builder.buildExtractVectorElementConstant(DstReg, SrcReg, I); + + MI.eraseFromParent(); +} + namespace { /// Select a preference between two uses. CurrentUse is the current preference diff --git a/llvm/lib/Target/AArch64/AArch64Combine.td b/llvm/lib/Target/AArch64/AArch64Combine.td index 699310d..7e6d280 100644 --- a/llvm/lib/Target/AArch64/AArch64Combine.td +++ b/llvm/lib/Target/AArch64/AArch64Combine.td @@ -37,7 +37,8 @@ def AArch64PreLegalizerCombiner: GICombiner< "AArch64PreLegalizerCombinerImpl", [all_combines, fconstant_to_constant, icmp_redundant_trunc, - fold_global_offset]> { + fold_global_offset, + shuffle_to_extract]> { let CombineAllMethodName = "tryCombineAllImpl"; } diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-shuffle-vector.mir b/llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-shuffle-vector.mir index 7ca6a2d..2c9ae5b 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-shuffle-vector.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-shuffle-vector.mir @@ -454,27 +454,58 @@ body: | %6:_(p0) = G_SHUFFLE_VECTOR %0, %0, shufflemask(0) RET_ReallyLR implicit %6 ... - -# Check that shuffle_vector on vector doesn't get combined -# when the resulting type is a scalar. -# We should be able to replace this by an extract vector element, -# but that's not implemented yet. --- -name: shuffle_vector_to_copy_neg +name: shuffle_vector_to_copy_lhs tracksRegLiveness: true body: | bb.1: liveins: $x0, $x1 - ; CHECK-LABEL: name: shuffle_vector_to_copy_neg + ; CHECK-LABEL: name: shuffle_vector_to_copy_lhs ; CHECK: liveins: $x0, $x1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x0 - ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $x1 - ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(s32) = G_SHUFFLE_VECTOR [[COPY]](<2 x s32>), [[COPY1]], shufflemask(1) - ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](s32) + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 + ; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[COPY]](<2 x s32>), [[C]](s64) + ; CHECK-NEXT: RET_ReallyLR implicit [[EVEC]](s32) %0:_(<2 x s32>) = COPY $x0 %1:_(<2 x s32>) = COPY $x1 %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(1) RET_ReallyLR implicit %6 ... +--- +name: shuffle_vector_to_copy_rhs +tracksRegLiveness: true +body: | + bb.1: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: shuffle_vector_to_copy_rhs + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x1 + ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 + ; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[COPY]](<2 x s32>), [[C]](s64) + ; CHECK-NEXT: RET_ReallyLR implicit [[EVEC]](s32) + %0:_(<2 x s32>) = COPY $x0 + %1:_(<2 x s32>) = COPY $x1 + %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(2) + RET_ReallyLR implicit %6 +... +--- +name: shuffle_vector_to_copy_undef +tracksRegLiveness: true +body: | + bb.1: + liveins: $x0, $x1 + + ; CHECK-LABEL: name: shuffle_vector_to_copy_undef + ; CHECK: liveins: $x0, $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF + ; CHECK-NEXT: RET_ReallyLR implicit [[DEF]](s32) + %0:_(<2 x s32>) = COPY $x0 + %1:_(<2 x s32>) = COPY $x1 + %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(-1) + RET_ReallyLR implicit %6 +... diff --git a/llvm/test/CodeGen/AArch64/arm64-vcvt_f.ll b/llvm/test/CodeGen/AArch64/arm64-vcvt_f.ll index e94aac3b..eacb773 100644 --- a/llvm/test/CodeGen/AArch64/arm64-vcvt_f.ll +++ b/llvm/test/CodeGen/AArch64/arm64-vcvt_f.ll @@ -46,7 +46,8 @@ define <2 x double> @test_vcvt_high_v1f64_f32_bitcast(<4 x float> %x) nounwind r ; ; GISEL-LABEL: test_vcvt_high_v1f64_f32_bitcast: ; GISEL: // %bb.0: -; GISEL-NEXT: fcvtl2 v0.2d, v0.4s +; GISEL-NEXT: mov d0, v0[1] +; GISEL-NEXT: fcvtl v0.2d, v0.2s ; GISEL-NEXT: ret %bc1 = bitcast <4 x float> %x to <2 x double> %ext = shufflevector <2 x double> %bc1, <2 x double> undef, <1 x i32> <i32 1> @@ -63,7 +64,8 @@ define <2 x double> @test_vcvt_high_v1i64_f32_bitcast(<2 x i64> %x) nounwind rea ; ; GISEL-LABEL: test_vcvt_high_v1i64_f32_bitcast: ; GISEL: // %bb.0: -; GISEL-NEXT: fcvtl2 v0.2d, v0.4s +; GISEL-NEXT: mov d0, v0[1] +; GISEL-NEXT: fcvtl v0.2d, v0.2s ; GISEL-NEXT: ret %ext = shufflevector <2 x i64> %x, <2 x i64> undef, <1 x i32> <i32 1> %bc2 = bitcast <1 x i64> %ext to <2 x float> @@ -129,7 +131,8 @@ define <4 x float> @test_vcvt_high_v1i64_f16_bitcast(<2 x i64> %x) nounwind read ; ; GISEL-LABEL: test_vcvt_high_v1i64_f16_bitcast: ; GISEL: // %bb.0: -; GISEL-NEXT: fcvtl2 v0.4s, v0.8h +; GISEL-NEXT: mov d0, v0[1] +; GISEL-NEXT: fcvtl v0.4s, v0.4h ; GISEL-NEXT: ret %ext = shufflevector <2 x i64> %x, <2 x i64> undef, <1 x i32> <i32 1> %bc2 = bitcast <1 x i64> %ext to <4 x half> diff --git a/llvm/test/CodeGen/AArch64/ext-narrow-index.ll b/llvm/test/CodeGen/AArch64/ext-narrow-index.ll index b296a79..2c5d33d 100644 --- a/llvm/test/CodeGen/AArch64/ext-narrow-index.ll +++ b/llvm/test/CodeGen/AArch64/ext-narrow-index.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc < %s -mtriple=aarch64 | FileCheck %s +; RUN: llc < %s -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-SD +; RUN: llc < %s -global-isel -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-GISEL ; Tests of shufflevector where the index operand is half the width of the vector ; operands. We should get one ext instruction and not two. @@ -16,22 +17,34 @@ entry: } define <8 x i8> @i8_off1(<16 x i8> %arg1, <16 x i8> %arg2) { -; CHECK-LABEL: i8_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #1 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i8_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #1 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i8_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #1 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8> ret <8 x i8> %shuffle } define <8 x i8> @i8_off8(<16 x i8> %arg1, <16 x i8> %arg2) { -; CHECK-LABEL: i8_off8: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i8_off8: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i8_off8: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #8 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> ret <8 x i8> %shuffle @@ -49,11 +62,17 @@ entry: } define <8 x i8> @i8_off22(<16 x i8> %arg1, <16 x i8> %arg2) { -; CHECK-LABEL: i8_off22: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v1.16b, v1.16b, #6 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i8_off22: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v1.16b, v1.16b, #6 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i8_off22: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: ext v0.16b, v1.16b, v0.16b, #6 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> %arg2, <8 x i32> <i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29> ret <8 x i8> %shuffle @@ -71,11 +90,17 @@ entry: } define <4 x i16> @i16_off1(<8 x i16> %arg1, <8 x i16> %arg2) { -; CHECK-LABEL: i16_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #2 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i16_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #2 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i16_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #2 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> %arg2, <4 x i32> <i32 1, i32 2, i32 3, i32 4> ret <4 x i16> %shuffle @@ -115,11 +140,17 @@ entry: } define <2 x i32> @i32_off1(<4 x i32> %arg1, <4 x i32> %arg2) { -; CHECK-LABEL: i32_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #4 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i32_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #4 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i32_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #4 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> %arg2, <2 x i32> <i32 1, i32 2> ret <2 x i32> %shuffle @@ -159,11 +190,16 @@ entry: } define <1 x i64> @i64_off1(<2 x i64> %arg1, <2 x i64> %arg2) { -; CHECK-LABEL: i64_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i64_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i64_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: mov d0, v0.d[1] +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> %arg2, <1 x i32> <i32 1> ret <1 x i64> %shuffle @@ -192,22 +228,36 @@ entry: } define <8 x i8> @i8_zero_off1(<16 x i8> %arg1) { -; CHECK-LABEL: i8_zero_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #1 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i8_zero_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #1 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i8_zero_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: movi v1.2d, #0000000000000000 +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #1 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8> ret <8 x i8> %shuffle } define <8 x i8> @i8_zero_off8(<16 x i8> %arg1) { -; CHECK-LABEL: i8_zero_off8: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i8_zero_off8: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i8_zero_off8: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: movi v1.2d, #0000000000000000 +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #8 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> ret <8 x i8> %shuffle @@ -226,10 +276,17 @@ entry: } define <8 x i8> @i8_zero_off22(<16 x i8> %arg1) { -; CHECK-LABEL: i8_zero_off22: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: movi v0.2d, #0000000000000000 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i8_zero_off22: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: movi v0.2d, #0000000000000000 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i8_zero_off22: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: movi v1.2d, #0000000000000000 +; CHECK-GISEL-NEXT: ext v0.16b, v1.16b, v0.16b, #6 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <16 x i8> %arg1, <16 x i8> zeroinitializer, <8 x i32> <i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29> ret <8 x i8> %shuffle @@ -247,11 +304,18 @@ entry: } define <4 x i16> @i16_zero_off1(<8 x i16> %arg1) { -; CHECK-LABEL: i16_zero_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #2 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i16_zero_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #2 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i16_zero_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: movi v1.2d, #0000000000000000 +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #2 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <8 x i16> %arg1, <8 x i16> zeroinitializer, <4 x i32> <i32 1, i32 2, i32 3, i32 4> ret <4 x i16> %shuffle @@ -291,11 +355,18 @@ entry: } define <2 x i32> @i32_zero_off1(<4 x i32> %arg1) { -; CHECK-LABEL: i32_zero_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #4 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i32_zero_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #4 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i32_zero_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: movi v1.2d, #0000000000000000 +; CHECK-GISEL-NEXT: ext v0.16b, v0.16b, v1.16b, #4 +; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <4 x i32> %arg1, <4 x i32> zeroinitializer, <2 x i32> <i32 1, i32 2> ret <2 x i32> %shuffle @@ -335,11 +406,16 @@ entry: } define <1 x i64> @i64_zero_off1(<2 x i64> %arg1) { -; CHECK-LABEL: i64_zero_off1: -; CHECK: // %bb.0: // %entry -; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8 -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 -; CHECK-NEXT: ret +; CHECK-SD-LABEL: i64_zero_off1: +; CHECK-SD: // %bb.0: // %entry +; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8 +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 +; CHECK-SD-NEXT: ret +; +; CHECK-GISEL-LABEL: i64_zero_off1: +; CHECK-GISEL: // %bb.0: // %entry +; CHECK-GISEL-NEXT: mov d0, v0.d[1] +; CHECK-GISEL-NEXT: ret entry: %shuffle = shufflevector <2 x i64> %arg1, <2 x i64> zeroinitializer, <1 x i32> <i32 1> ret <1 x i64> %shuffle |
