1; RUN: opt -S -aarch64-sve-intrinsic-opts < %s | FileCheck %s 2 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 %addr 8; CHECK-NEXT: ret void 9 %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 4 12 ret void 13} 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 %addr 18; CHECK-NEXT: ret void 19 %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 4 22 ret void 23} 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 %addr 28; CHECK-NEXT: ret void 29 %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 4 32 ret void 33} 34 35 36; Check that too small of a vscale prevents optimization 37define 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.extract 40 %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 4 43 ret void 44} 45 46; Check that too large of a vscale prevents optimization 47define 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.extract 50 %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 4 53 ret void 54} 55 56; Check that a non-zero index prevents optimization 57define 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.extract 60 %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 4 63 ret void 64} 65 66; Check that differing vscale min/max prevents optimization 67define 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.extract 70 %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 4 73 ret void 74} 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