; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=msan -mattr=+sme2 -mattr=+sme-i16i64 -mattr=+sme-f64f64 -o - %s | FileCheck %s ; Forked from llvm/test/CodeGen/AArch64/sme2-intrinsics-add.ll target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" target triple = "aarch64--linux-android9001" define void @multi_vector_add_write_single_za_vg1x2_i32(i32 %slice, %zn0, %zn1, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_write_single_za_vg1x2_i32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1:![0-9]+]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7:[0-9]+]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv4i32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv4i32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZM]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv4i32(i32 %slice, %zn0, %zn1, %zm) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv4i32(i32 %slice.7, %zn0, %zn1, %zm) ret void } define void @multi_vector_add_write_single_za_vg1x2_i64(i32 %slice, %zn0, %zn1, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_write_single_za_vg1x2_i64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv2i64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv2i64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZM]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv2i64(i32 %slice, %zn0, %zn1, %zm) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.single.za.vg1x2.nxv2i64(i32 %slice.7, %zn0, %zn1, %zm) ret void } define void @multi_vector_add_write_single_za_vg1x4_i32(i32 %slice, %zn0, %zn1, ; CHECK-LABEL: @multi_vector_add_write_single_za_vg1x4_i32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv4i32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv4i32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]], [[ZM]]) ; CHECK-NEXT: ret void ; %zn2, %zn3, %zm) sanitize_memory { call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv4i32(i32 %slice, %zn0, %zn1, %zn2, %zn3, %zm) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv4i32(i32 %slice.7, %zn0, %zn1, %zn2, %zn3, %zm) ret void } define void @multi_vector_add_write_single_za_vg1x4_i64(i32 %slice, ; CHECK-LABEL: @multi_vector_add_write_single_za_vg1x4_i64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv2i64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv2i64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]], [[ZM]]) ; CHECK-NEXT: ret void ; %zn0, %zn1, %zn2, %zn3, %zm) sanitize_memory { call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv2i64(i32 %slice, %zn0, %zn1, %zn2, %zn3, %zm) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.single.za.vg1x4.nxv2i64(i32 %slice.7, %zn0, %zn1, %zn2, %zn3, %zm) ret void } define void @multi_vector_add_write_za_vg1x2_i32(i32 %slice, %zn0, %zn1, ; CHECK-LABEL: @multi_vector_add_write_za_vg1x2_i32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv4i32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZM1:%.*]], [[ZM2:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv4i32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZM1]], [[ZM2]]) ; CHECK-NEXT: ret void ; %zm1, %zm2) sanitize_memory { call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv4i32(i32 %slice, %zn0, %zn1, %zm1, %zm2) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv4i32(i32 %slice.7, %zn0, %zn1, %zm1, %zm2) ret void } define void @multi_vector_add_write_za_vg1x2_i64(i32 %slice, %zn0, %zn1, ; CHECK-LABEL: @multi_vector_add_write_za_vg1x2_i64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv2i64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZM1:%.*]], [[ZM2:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv2i64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZM1]], [[ZM2]]) ; CHECK-NEXT: ret void ; %zm1, %zm2) sanitize_memory { call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv2i64(i32 %slice, %zn0, %zn1, %zm1, %zm2) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.za.vg1x2.nxv2i64(i32 %slice.7, %zn0, %zn1, %zm1, %zm2) ret void } define void @multi_vector_add_write_za_vg1x4_i32(i32 %slice, %zn0, %zn1, ; CHECK-LABEL: @multi_vector_add_write_za_vg1x4_i32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv4i32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]], [[ZM0:%.*]], [[ZM1:%.*]], [[ZM2:%.*]], [[ZM3:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv4i32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]], [[ZM0]], [[ZM1]], [[ZM2]], [[ZM3]]) ; CHECK-NEXT: ret void ; %zn2, %zn3, %zm0, %zm1, %zm2, %zm3) sanitize_memory { call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv4i32(i32 %slice, %zn0, %zn1, %zn2, %zn3, %zm0, %zm1, %zm2, %zm3) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv4i32(i32 %slice.7, %zn0, %zn1, %zn2, %zn3, %zm0, %zm1, %zm2, %zm3) ret void } define void @multi_vector_add_write_za_vg1x4_i64(i32 %slice, %zn0, %zn1, ; CHECK-LABEL: @multi_vector_add_write_za_vg1x4_i64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv2i64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]], [[ZM0:%.*]], [[ZM1:%.*]], [[ZM2:%.*]], [[ZM3:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv2i64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]], [[ZM0]], [[ZM1]], [[ZM2]], [[ZM3]]) ; CHECK-NEXT: ret void ; %zn2, %zn3, %zm0, %zm1, %zm2, %zm3) sanitize_memory { call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv2i64(i32 %slice, %zn0, %zn1, %zn2, %zn3, %zm0, %zm1, %zm2, %zm3) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.write.za.vg1x4.nxv2i64(i32 %slice.7, %zn0, %zn1, %zn2, %zn3, %zm0, %zm1, %zm2, %zm3) ret void } define void @multi_vector_add_za_vg1x2_i32(i32 %slice, %zn0, %zn1) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x2_i32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4i32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4i32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4i32(i32 %slice, %zn0, %zn1) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4i32(i32 %slice.7, %zn0, %zn1) ret void } define void @multi_vector_add_za_vg1x2_i64(i32 %slice, %zn0, %zn1) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x2_i64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2i64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2i64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2i64(i32 %slice, %zn0, %zn1) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2i64(i32 %slice.7, %zn0, %zn1) ret void } define void @multi_vector_add_za_vg1x2_f32(i32 %slice, %zn0, %zn1) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x2_f32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4f32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4f32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4f32(i32 %slice, %zn0, %zn1) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za32.vg1x2.nxv4f32(i32 %slice.7, %zn0, %zn1) ret void } define void @multi_vector_add_za_vg1x2_f64(i32 %slice, %zn0, %zn1) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x2_f64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 %slice, %zn0, %zn1) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 %slice.7, %zn0, %zn1) ret void } define void @multi_vector_add_za_vg1x2_f64_tuple(i64 %stride, ptr %ptr) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x2_f64_tuple( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 8 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[TMP2:%.*]] = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP0]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]] ; CHECK: 3: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 4: ; CHECK-NEXT: [[TMP5:%.*]] = tail call { , } @llvm.aarch64.sve.ld1.pn.x2.nxv2f64.p0(target("aarch64.svcount") [[TMP2]], ptr [[PTR:%.*]]) ; CHECK-NEXT: [[TMP6:%.*]] = extractvalue { , } [[TMP5]], 0 ; CHECK-NEXT: [[TMP7:%.*]] = extractvalue { , } [[TMP5]], 1 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP0]], [[TMP1]] ; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[STRIDE:%.*]] ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF1]] ; CHECK: 8: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 9: ; CHECK-NEXT: [[TMP10:%.*]] = tail call { , } @llvm.aarch64.sve.ld1.pn.x2.nxv2f64.p0(target("aarch64.svcount") [[TMP2]], ptr [[ARRAYIDX2]]) ; CHECK-NEXT: [[TMP11:%.*]] = extractvalue { , } [[TMP10]], 0 ; CHECK-NEXT: [[TMP12:%.*]] = extractvalue { , } [[TMP10]], 1 ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 0, [[TMP6]], [[TMP11]]) ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 0, [[TMP7]], [[TMP12]]) ; CHECK-NEXT: ret void ; entry: %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8() %1 = tail call { , } @llvm.aarch64.sve.ld1.pn.x2.nxv2f64(target("aarch64.svcount") %0, ptr %ptr) %2 = extractvalue { , } %1, 0 %3 = extractvalue { , } %1, 1 %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride %4 = tail call { , } @llvm.aarch64.sve.ld1.pn.x2.nxv2f64(target("aarch64.svcount") %0, ptr %arrayidx2) %5 = extractvalue { , } %4, 0 %6 = extractvalue { , } %4, 1 call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 0, %2, %5) call void @llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32 0, %3, %6) ret void } define void @multi_vector_add_za_vg1x4_i32(i32 %slice, %zn0, %zn1, %zn2, %zn3) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x4_i32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4i32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4i32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4i32(i32 %slice, %zn0, %zn1, %zn2, %zn3) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4i32(i32 %slice.7, %zn0, %zn1, %zn2, %zn3) ret void } define void @multi_vector_add_za_vg1x4_i64(i32 %slice, %zn0, %zn1, %zn2, %zn3) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x4_i64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2i64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2i64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2i64(i32 %slice, %zn0, %zn1, %zn2, %zn3) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2i64(i32 %slice.7, %zn0, %zn1, %zn2, %zn3) ret void } define void @multi_vector_add_za_vg1x4_f32(i32 %slice, %zn0, %zn1, %zn2, %zn3) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x4_f32( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 %slice, %zn0, %zn1, %zn2, %zn3) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 %slice.7, %zn0, %zn1, %zn2, %zn3) ret void } define void @multi_vector_add_za_vg1x4_f32_tuple(i64 %stride, ptr %ptr) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x4_f32_tuple( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 8 ; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[TMP2:%.*]] = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP0]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]] ; CHECK: 3: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 4: ; CHECK-NEXT: [[TMP5:%.*]] = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32.p0(target("aarch64.svcount") [[TMP2]], ptr [[PTR:%.*]]) ; CHECK-NEXT: [[TMP6:%.*]] = extractvalue { , , , } [[TMP5]], 0 ; CHECK-NEXT: [[TMP7:%.*]] = extractvalue { , , , } [[TMP5]], 1 ; CHECK-NEXT: [[TMP8:%.*]] = extractvalue { , , , } [[TMP5]], 2 ; CHECK-NEXT: [[TMP9:%.*]] = extractvalue { , , , } [[TMP5]], 3 ; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP0]], [[TMP1]] ; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[STRIDE:%.*]] ; CHECK-NEXT: [[_MSCMP3:%.*]] = icmp ne i64 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP3]], label [[TMP10:%.*]], label [[TMP11:%.*]], !prof [[PROF1]] ; CHECK: 10: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 11: ; CHECK-NEXT: [[TMP12:%.*]] = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32.p0(target("aarch64.svcount") [[TMP2]], ptr [[ARRAYIDX2]]) ; CHECK-NEXT: [[TMP13:%.*]] = extractvalue { , , , } [[TMP12]], 0 ; CHECK-NEXT: [[TMP14:%.*]] = extractvalue { , , , } [[TMP12]], 1 ; CHECK-NEXT: [[TMP15:%.*]] = extractvalue { , , , } [[TMP12]], 2 ; CHECK-NEXT: [[TMP16:%.*]] = extractvalue { , , , } [[TMP12]], 3 ; CHECK-NEXT: [[TMP17:%.*]] = shl i64 [[TMP1]], 1 ; CHECK-NEXT: [[TMP18:%.*]] = or i64 [[TMP17]], 0 ; CHECK-NEXT: [[MUL3:%.*]] = shl i64 [[STRIDE]], 1 ; CHECK-NEXT: [[_MSPROP1:%.*]] = or i64 [[TMP0]], [[TMP18]] ; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[MUL3]] ; CHECK-NEXT: [[_MSCMP4:%.*]] = icmp ne i64 [[_MSPROP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP4]], label [[TMP19:%.*]], label [[TMP20:%.*]], !prof [[PROF1]] ; CHECK: 19: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 20: ; CHECK-NEXT: [[TMP21:%.*]] = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32.p0(target("aarch64.svcount") [[TMP2]], ptr [[ARRAYIDX4]]) ; CHECK-NEXT: [[TMP22:%.*]] = extractvalue { , , , } [[TMP21]], 0 ; CHECK-NEXT: [[TMP23:%.*]] = extractvalue { , , , } [[TMP21]], 1 ; CHECK-NEXT: [[TMP24:%.*]] = extractvalue { , , , } [[TMP21]], 2 ; CHECK-NEXT: [[TMP25:%.*]] = extractvalue { , , , } [[TMP21]], 3 ; CHECK-NEXT: [[MSPROP_MUL_CST:%.*]] = mul i64 [[TMP1]], 1 ; CHECK-NEXT: [[MUL5:%.*]] = mul i64 [[STRIDE]], 3 ; CHECK-NEXT: [[_MSPROP2:%.*]] = or i64 [[TMP0]], [[MSPROP_MUL_CST]] ; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[MUL5]] ; CHECK-NEXT: [[_MSCMP5:%.*]] = icmp ne i64 [[_MSPROP2]], 0 ; CHECK-NEXT: br i1 [[_MSCMP5]], label [[TMP26:%.*]], label [[TMP27:%.*]], !prof [[PROF1]] ; CHECK: 26: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 27: ; CHECK-NEXT: [[TMP28:%.*]] = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32.p0(target("aarch64.svcount") [[TMP2]], ptr [[ARRAYIDX6]]) ; CHECK-NEXT: [[TMP29:%.*]] = extractvalue { , , , } [[TMP28]], 0 ; CHECK-NEXT: [[TMP30:%.*]] = extractvalue { , , , } [[TMP28]], 1 ; CHECK-NEXT: [[TMP31:%.*]] = extractvalue { , , , } [[TMP28]], 2 ; CHECK-NEXT: [[TMP32:%.*]] = extractvalue { , , , } [[TMP28]], 3 ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, [[TMP6]], [[TMP13]], [[TMP22]], [[TMP29]]) ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, [[TMP7]], [[TMP14]], [[TMP23]], [[TMP30]]) ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, [[TMP8]], [[TMP15]], [[TMP24]], [[TMP31]]) ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, [[TMP9]], [[TMP16]], [[TMP25]], [[TMP32]]) ; CHECK-NEXT: ret void ; entry: %0 = tail call target("aarch64.svcount") @llvm.aarch64.sve.ptrue.c8() %1 = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32(target("aarch64.svcount") %0, ptr %ptr) %2 = extractvalue { , , , } %1, 0 %3 = extractvalue { , , , } %1, 1 %4 = extractvalue { , , , } %1, 2 %5 = extractvalue { , , , } %1, 3 %arrayidx2 = getelementptr inbounds i8, ptr %ptr, i64 %stride %6 = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32(target("aarch64.svcount") %0, ptr %arrayidx2) %7 = extractvalue { , , , } %6, 0 %8 = extractvalue { , , , } %6, 1 %9 = extractvalue { , , , } %6, 2 %10 = extractvalue { , , , } %6, 3 %mul3 = shl i64 %stride, 1 %arrayidx4 = getelementptr inbounds i8, ptr %ptr, i64 %mul3 %11 = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32(target("aarch64.svcount") %0, ptr %arrayidx4) %12 = extractvalue { , , , } %11, 0 %13 = extractvalue { , , , } %11, 1 %14 = extractvalue { , , , } %11, 2 %15 = extractvalue { , , , } %11, 3 %mul5 = mul i64 %stride, 3 %arrayidx6 = getelementptr inbounds i8, ptr %ptr, i64 %mul5 %16 = tail call { , , , } @llvm.aarch64.sve.ld1.pn.x4.nxv4f32(target("aarch64.svcount") %0, ptr %arrayidx6) %17 = extractvalue { , , , } %16, 0 %18 = extractvalue { , , , } %16, 1 %19 = extractvalue { , , , } %16, 2 %20 = extractvalue { , , , } %16, 3 call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, %2, %7, %12, %17) call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, %3, %8, %13, %18) call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, %4, %9, %14, %19) call void @llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32 0, %5, %10, %15, %20) ret void } define void @multi_vector_add_za_vg1x4_f64(i32 %slice, %zn0, %zn1, %zn2, %zn3) sanitize_memory { ; CHECK-LABEL: @multi_vector_add_za_vg1x4_f64( ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8 ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP2:%.*]], label [[TMP3:%.*]], !prof [[PROF1]] ; CHECK: 2: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 3: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2f64(i32 [[SLICE:%.*]], [[ZN0:%.*]], [[ZN1:%.*]], [[ZN2:%.*]], [[ZN3:%.*]]) ; CHECK-NEXT: [[_MSPROP:%.*]] = or i32 [[TMP1]], 0 ; CHECK-NEXT: [[SLICE_7:%.*]] = add i32 [[SLICE]], 7 ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i32 [[_MSPROP]], 0 ; CHECK-NEXT: br i1 [[_MSCMP1]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]] ; CHECK: 4: ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR7]] ; CHECK-NEXT: unreachable ; CHECK: 5: ; CHECK-NEXT: call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2f64(i32 [[SLICE_7]], [[ZN0]], [[ZN1]], [[ZN2]], [[ZN3]]) ; CHECK-NEXT: ret void ; call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2f64(i32 %slice, %zn0, %zn1, %zn2, %zn3) %slice.7 = add i32 %slice, 7 call void @llvm.aarch64.sme.add.za64.vg1x4.nxv2f64(i32 %slice.7, %zn0, %zn1, %zn2, %zn3) ret void } define { , } @multi_vec_add_single_x2_s8( %unused, %zdn1, %zdn2, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_single_x2_s8( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , } @llvm.aarch64.sve.add.single.x2.nxv16i8( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , } [[RES]] ; %res = call { , } @llvm.aarch64.sve.add.single.x2.nxv16i8( %zdn1, %zdn2, %zm) ret { , } %res } define { , } @multi_vec_add_single_x2_s16( %unused, %zdn1, %zdn2, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_single_x2_s16( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , } @llvm.aarch64.sve.add.single.x2.nxv8i16( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , } [[RES]] ; %res = call { , } @llvm.aarch64.sve.add.single.x2.nxv8i16( %zdn1, %zdn2, %zm) ret { , } %res } define { , } @multi_vec_add_single_x2_s32( %unused, %zdn1, %zdn2, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_single_x2_s32( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , } @llvm.aarch64.sve.add.single.x2.nxv4i32( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , } [[RES]] ; %res = call { , } @llvm.aarch64.sve.add.single.x2.nxv4i32( %zdn1, %zdn2, %zm) ret { , } %res } define { , } @multi_vec_add_single_x2_s64( %unused, %zdn1, %zdn2, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_single_x2_s64( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , } @llvm.aarch64.sve.add.single.x2.nxv2i64( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , } [[RES]] ; %res = call { , } @llvm.aarch64.sve.add.single.x2.nxv2i64( %zdn1, %zdn2, %zm) ret { , } %res } define { , , , } @multi_vec_add_single_x4_s8( %unused, %zdn1, %zdn2, %zdn3, %zdn4, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_single_x4_s8( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv16i8( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZDN3:%.*]], [[ZDN4:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , , , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , , , } [[RES]] ; %res = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv16i8( %zdn1, %zdn2, %zdn3, %zdn4, %zm) ret { , , , } %res } define { , , , } @multi_vec_add_x4_single_s16( %unused, %zdn1, %zdn2, %zdn3, %zdn4, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_x4_single_s16( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv8i16( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZDN3:%.*]], [[ZDN4:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , , , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , , , } [[RES]] ; %res = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv8i16( %zdn1, %zdn2, %zdn3, %zdn4, %zm) ret { , , , } %res } define { , , , } @multi_vec_add_x4_single_s32( %unused, %zdn1, %zdn2, %zdn3, %zdn4, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_x4_single_s32( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv4i32( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZDN3:%.*]], [[ZDN4:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , , , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , , , } [[RES]] ; %res = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv4i32( %zdn1, %zdn2, %zdn3, %zdn4, %zm) ret { , , , } %res } define { , , , } @multi_vec_add_x4_single_s64( %unused, %zdn1, %zdn2, %zdn3, %zdn4, %zm) sanitize_memory { ; CHECK-LABEL: @multi_vec_add_x4_single_s64( ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[RES:%.*]] = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv2i64( [[ZDN1:%.*]], [[ZDN2:%.*]], [[ZDN3:%.*]], [[ZDN4:%.*]], [[ZM:%.*]]) ; CHECK-NEXT: store { , , , } zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret { , , , } [[RES]] ; %res = call { , , , } @llvm.aarch64.sve.add.single.x4.nxv2i64( %zdn1, %zdn2, %zdn3, %zdn4, %zm) ret { , , , } %res } declare void@llvm.aarch64.sme.add.write.single.za.vg1x2.nxv4i32(i32, , , ) declare void@llvm.aarch64.sme.add.write.single.za.vg1x2.nxv2i64(i32, , , ) declare void@llvm.aarch64.sme.add.write.single.za.vg1x4.nxv4i32(i32, , , , , ) declare void@llvm.aarch64.sme.add.write.single.za.vg1x4.nxv2i64(i32, , , , , ) declare void@llvm.aarch64.sme.add.write.za.vg1x2.nxv4i32(i32, , , , ) declare void@llvm.aarch64.sme.add.write.za.vg1x2.nxv2i64(i32, , , , ) declare void@llvm.aarch64.sme.add.write.za.vg1x4.nxv4i32(i32, , , , , , , , ) declare void@llvm.aarch64.sme.add.write.za.vg1x4.nxv2i64(i32, , , , , , , , ) declare void@llvm.aarch64.sme.add.za32.vg1x2.nxv4i32(i32, ,) declare void@llvm.aarch64.sme.add.za64.vg1x2.nxv2i64(i32, ,) declare void@llvm.aarch64.sme.add.za32.vg1x4.nxv4i32(i32, ,,,) declare void@llvm.aarch64.sme.add.za64.vg1x4.nxv2i64(i32, ,,, ) declare void@llvm.aarch64.sme.add.za32.vg1x2.nxv4f32(i32, , ) declare void@llvm.aarch64.sme.add.za64.vg1x2.nxv2f64(i32, , ) declare void@llvm.aarch64.sme.add.za32.vg1x4.nxv4f32(i32, , ,, ) declare void@llvm.aarch64.sme.add.za64.vg1x4.nxv2f64(i32, , ,, ) declare { , } @llvm.aarch64.sve.add.single.x2.nxv16i8(, , ) declare { , } @llvm.aarch64.sve.add.single.x2.nxv8i16(, , ) declare { , } @llvm.aarch64.sve.add.single.x2.nxv4i32(, , ) declare { , } @llvm.aarch64.sve.add.single.x2.nxv2i64(, , ) declare { , , , } @llvm.aarch64.sve.add.single.x4.nxv16i8(, , , , ) declare { , , , } @llvm.aarch64.sve.add.single.x4.nxv8i16(, , , , ) declare { , , , } @llvm.aarch64.sve.add.single.x4.nxv4i32(, , , , ) declare { , , , } @llvm.aarch64.sve.add.single.x4.nxv2i64(, , , , )