84 lines · plain
1; RUN: opt -S -aarch64-sve-intrinsic-opts < %s | FileCheck %s2 3target triple = "aarch64-unknown-linux-gnu"4 5define void @pred_store_v2i8(<vscale x 16 x i1> %pred, ptr %addr) #0 {6; CHECK-LABEL: @pred_store_v2i8(7; CHECK-NEXT: store <vscale x 16 x i1> %pred, ptr %addr8; CHECK-NEXT: ret void9 %bitcast = bitcast <vscale x 16 x i1> %pred to <vscale x 2 x i8>10 %extract = tail call <2 x i8> @llvm.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %bitcast, i64 0)11 store <2 x i8> %extract, ptr %addr, align 412 ret void13}14 15define void @pred_store_v4i8(<vscale x 16 x i1> %pred, ptr %addr) #1 {16; CHECK-LABEL: @pred_store_v4i8(17; CHECK-NEXT: store <vscale x 16 x i1> %pred, ptr %addr18; CHECK-NEXT: ret void19 %bitcast = bitcast <vscale x 16 x i1> %pred to <vscale x 2 x i8>20 %extract = tail call <4 x i8> @llvm.vector.extract.v4i8.nxv2i8(<vscale x 2 x i8> %bitcast, i64 0)21 store <4 x i8> %extract, ptr %addr, align 422 ret void23}24 25define void @pred_store_v8i8(<vscale x 16 x i1> %pred, ptr %addr) #2 {26; CHECK-LABEL: @pred_store_v8i8(27; CHECK-NEXT: store <vscale x 16 x i1> %pred, ptr %addr28; CHECK-NEXT: ret void29 %bitcast = bitcast <vscale x 16 x i1> %pred to <vscale x 2 x i8>30 %extract = tail call <8 x i8> @llvm.vector.extract.v8i8.nxv2i8(<vscale x 2 x i8> %bitcast, i64 0)31 store <8 x i8> %extract, ptr %addr, align 432 ret void33}34 35 36; Check that too small of a vscale prevents optimization37define void @pred_store_neg1(<vscale x 16 x i1> %pred, ptr %addr) #0 {38; CHECK-LABEL: @pred_store_neg1(39; CHECK: call <4 x i8> @llvm.vector.extract40 %bitcast = bitcast <vscale x 16 x i1> %pred to <vscale x 2 x i8>41 %extract = tail call <4 x i8> @llvm.vector.extract.v4i8.nxv2i8(<vscale x 2 x i8> %bitcast, i64 0)42 store <4 x i8> %extract, ptr %addr, align 443 ret void44}45 46; Check that too large of a vscale prevents optimization47define void @pred_store_neg2(<vscale x 16 x i1> %pred, ptr %addr) #2 {48; CHECK-LABEL: @pred_store_neg2(49; CHECK: call <4 x i8> @llvm.vector.extract50 %bitcast = bitcast <vscale x 16 x i1> %pred to <vscale x 2 x i8>51 %extract = tail call <4 x i8> @llvm.vector.extract.v4i8.nxv2i8(<vscale x 2 x i8> %bitcast, i64 0)52 store <4 x i8> %extract, ptr %addr, align 453 ret void54}55 56; Check that a non-zero index prevents optimization57define void @pred_store_neg3(<vscale x 16 x i1> %pred, ptr %addr) #1 {58; CHECK-LABEL: @pred_store_neg3(59; CHECK: call <4 x i8> @llvm.vector.extract60 %bitcast = bitcast <vscale x 16 x i1> %pred to <vscale x 2 x i8>61 %extract = tail call <4 x i8> @llvm.vector.extract.v4i8.nxv2i8(<vscale x 2 x i8> %bitcast, i64 4)62 store <4 x i8> %extract, ptr %addr, align 463 ret void64}65 66; Check that differing vscale min/max prevents optimization67define void @pred_store_neg4(<vscale x 16 x i1> %pred, ptr %addr) #3 {68; CHECK-LABEL: @pred_store_neg4(69; CHECK: call <4 x i8> @llvm.vector.extract70 %bitcast = bitcast <vscale x 16 x i1> %pred to <vscale x 2 x i8>71 %extract = tail call <4 x i8> @llvm.vector.extract.v4i8.nxv2i8(<vscale x 2 x i8> %bitcast, i64 0)72 store <4 x i8> %extract, ptr %addr, align 473 ret void74}75 76declare <2 x i8> @llvm.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8>, i64)77declare <4 x i8> @llvm.vector.extract.v4i8.nxv2i8(<vscale x 2 x i8>, i64)78declare <8 x i8> @llvm.vector.extract.v8i8.nxv2i8(<vscale x 2 x i8>, i64)79 80attributes #0 = { "target-features"="+sve" vscale_range(1,1) }81attributes #1 = { "target-features"="+sve" vscale_range(2,2) }82attributes #2 = { "target-features"="+sve" vscale_range(4,4) }83attributes #3 = { "target-features"="+sve" vscale_range(2,4) }84