From: Jessica Paquette Date: Mon, 1 Apr 2019 22:19:13 +0000 (+0000) Subject: [AArch64][GlobalISe] Select STRQui for stores into v264s instead of scalarizing X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89c3e78e374a528def20208ee6fc6c1d4b5bd5ed;p=llvm [AArch64][GlobalISe] Select STRQui for stores into v264s instead of scalarizing This improves selection for vector stores into v2s64s. Before we just scalarized them, but we can just use a STRQui instead. Differential Revision: https://reviews.llvm.org/D60083 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357432 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/lib/Target/AArch64/AArch64LegalizerInfo.cpp index 854355c619c..3c4d86acd03 100644 --- a/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ b/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -234,7 +234,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) { {s32, p0, 32, 8}, {s64, p0, 64, 8}, {p0, p0, 64, 8}, - {v2s32, p0, 64, 8}}) + {v2s32, p0, 64, 8}, + {v2s64, p0, 128, 8}}) .clampScalar(0, s8, s64) .widenScalarToNextPow2(0) // TODO: We could support sum-of-pow2's but the lowering code doesn't know diff --git a/test/CodeGen/AArch64/GlobalISel/legalize-load-store-fewerElts.mir b/test/CodeGen/AArch64/GlobalISel/legalize-load-store-fewerElts.mir index 33ec198d37e..5a5cfb9c048 100644 --- a/test/CodeGen/AArch64/GlobalISel/legalize-load-store-fewerElts.mir +++ b/test/CodeGen/AArch64/GlobalISel/legalize-load-store-fewerElts.mir @@ -42,10 +42,8 @@ body: | ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8 ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[C]](s64) ; CHECK: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[GEP]](p0) :: (load 8) - ; CHECK: G_STORE [[LOAD]](s64), [[COPY1]](p0) :: (store 8, align 16) - ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 8 - ; CHECK: [[GEP1:%[0-9]+]]:_(p0) = G_GEP [[COPY1]], [[C1]](s64) - ; CHECK: G_STORE [[LOAD1]](s64), [[GEP1]](p0) :: (store 8) + ; CHECK: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[LOAD]](s64), [[LOAD1]](s64) + ; CHECK: G_STORE [[BUILD_VECTOR]](<2 x s64>), [[COPY1]](p0) :: (store 16) %0:_(p0) = COPY $x0 %1:_(p0) = COPY $x1 %2:_(<2 x s64>) = G_LOAD %0(p0) :: (load 16) diff --git a/test/CodeGen/AArch64/GlobalISel/select-store.mir b/test/CodeGen/AArch64/GlobalISel/select-store.mir index c4e93af1c85..0e16aa72187 100644 --- a/test/CodeGen/AArch64/GlobalISel/select-store.mir +++ b/test/CodeGen/AArch64/GlobalISel/select-store.mir @@ -29,6 +29,7 @@ define void @store_gep_8_s32_fpr(i32* %addr) { ret void } define void @store_v2s32(i64 *%addr) { ret void } + define void @store_v2s64(i64 *%addr) { ret void } ... --- @@ -418,3 +419,24 @@ body: | G_STORE %1, %0 :: (store 8 into %ir.addr) ... +--- +name: store_v2s64 +legalized: true +regBankSelected: true + +registers: + - { id: 0, class: gpr } + - { id: 1, class: fpr } + +body: | + bb.0: + liveins: $x0, $d1 + ; CHECK-LABEL: name: store_v2s64 + ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 + ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1 + ; CHECK: STRQui [[COPY1]], [[COPY]], 0 :: (store 16 into %ir.addr, align 8) + %0(p0) = COPY $x0 + %1(<2 x s64>) = COPY $q1 + G_STORE %1, %0 :: (store 16 into %ir.addr, align 8) + +...