; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -mattr=+sve,+bf16 < %s -passes=msan -S | FileCheck %s ; ; Forked from llvm/test/CodeGen/AArch64/sve-intrinsics-bfloat.ll ; ; Strictly handled: ; - llvm.aarch64.sve.bfdot ; - llvm.aarch64.sve.bfdot.lane.v2 ; - llvm.aarch64.sve.bfmlalb ; - llvm.aarch64.sve.bfmlalb.lane.v2 ; - llvm.aarch64.sve.bfmlalt ; - llvm.aarch64.sve.bfmlalt.lane.v2 ; - llvm.aarch64.sve.fmmla.nxv4f32.nxv8bf16 ; - llvm.aarch64.sve.convert.from.svbool.nxv4i1 ; - llvm.aarch64.sve.convert.to.svbool.nxv8i1 ; - llvm.aarch64.sve.fcvt.bf16f32.v2 ; - llvm.aarch64.sve.fcvtnt.bf16f32.v2 ; ; Heuristically handled: (none) target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" target triple = "aarch64--linux-android9001" define @bfdot_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfdot_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfdot( [[A]], [[B]], [[C]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfdot( %a, %b, %c) ret %out } define @bfdot_lane_0_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfdot_lane_0_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfdot.lane.v2( [[A]], [[B]], [[C]], i32 0) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfdot.lane.v2( %a, %b, %c, i32 0) ret %out } define @bfdot_lane_1_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfdot_lane_1_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfdot.lane.v2( [[A]], [[B]], [[C]], i32 1) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfdot.lane.v2( %a, %b, %c, i32 1) ret %out } define @bfdot_lane_2_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfdot_lane_2_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfdot.lane.v2( [[A]], [[B]], [[C]], i32 2) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfdot.lane.v2( %a, %b, %c, i32 2) ret %out } define @bfdot_lane_3_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfdot_lane_3_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfdot.lane.v2( [[A]], [[B]], [[C]], i32 3) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfdot.lane.v2( %a, %b, %c, i32 3) ret %out } define @bfmlalb_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb( [[A]], [[B]], [[C]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb( %a, %b, %c) ret %out } define @bfmlalb_lane_0_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_0_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 0) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 0) ret %out } define @bfmlalb_lane_1_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_1_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 1) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 1) ret %out } define @bfmlalb_lane_2_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_2_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 2) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 2) ret %out } define @bfmlalb_lane_3_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_3_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 3) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 3) ret %out } define @bfmlalb_lane_4_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_4_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 4) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 4) ret %out } define @bfmlalb_lane_5_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_5_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 5) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 5) ret %out } define @bfmlalb_lane_6_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_6_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 6) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 6) ret %out } define @bfmlalb_lane_7_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalb_lane_7_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalb.lane.v2( [[A]], [[B]], [[C]], i32 7) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalb.lane.v2( %a, %b, %c, i32 7) ret %out } define @bfmlalt_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt( [[A]], [[B]], [[C]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt( %a, %b, %c) ret %out } define @bfmlalt_lane_0_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_0_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 0) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 0) ret %out } define @bfmlalt_lane_1_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_1_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 1) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 1) ret %out } define @bfmlalt_lane_2_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_2_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 2) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 2) ret %out } define @bfmlalt_lane_3_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_3_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 3) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 3) ret %out } define @bfmlalt_lane_4_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_4_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 4) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 4) ret %out } define @bfmlalt_lane_5_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_5_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 5) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 5) ret %out } define @bfmlalt_lane_6_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_6_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 6) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 6) ret %out } define @bfmlalt_lane_7_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmlalt_lane_7_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.bfmlalt.lane.v2( [[A]], [[B]], [[C]], i32 7) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.bfmlalt.lane.v2( %a, %b, %c, i32 7) ret %out } define @bfmmla_f32( %a, %b, %c) nounwind sanitize_memory { ; CHECK-LABEL: define @bfmmla_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.fmmla.nxv4f32.nxv8bf16( [[A]], [[B]], [[C]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.fmmla.nxv4f32.nxv8bf16( %a, %b, %c) ret %out } define @fcvt_bf16_f32( %a, %pg, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @fcvt_bf16_f32( ; CHECK-SAME: [[A:%.*]], [[PG:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.fcvt.bf16f32.v2( [[A]], [[PG]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.fcvt.bf16f32.v2( %a, %pg, %b) ret %out } define @fcvt_bf16_f32_deprecated( %a, %pg, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @fcvt_bf16_f32_deprecated( ; CHECK-SAME: [[A:%.*]], [[PG:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.convert.to.svbool.nxv8i1( [[PG]]) ; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( [[TMP1]]) ; CHECK-NEXT: [[OUT1:%.*]] = call @llvm.aarch64.sve.fcvt.bf16f32.v2( [[A]], [[TMP2]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT1]] ; %out = call @llvm.aarch64.sve.fcvt.bf16f32( %a, %pg, %b) ret %out } define @fcvtnt_bf16_f32( %a, %pg, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @fcvtnt_bf16_f32( ; CHECK-SAME: [[A:%.*]], [[PG:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.fcvtnt.bf16f32.v2( [[A]], [[PG]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.fcvtnt.bf16f32.v2( %a, %pg, %b) ret %out } define @fcvtnt_bf16_f32_deprecated( %a, %pg, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @fcvtnt_bf16_f32_deprecated( ; CHECK-SAME: [[A:%.*]], [[PG:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.convert.to.svbool.nxv8i1( [[PG]]) ; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( [[TMP1]]) ; CHECK-NEXT: [[OUT1:%.*]] = call @llvm.aarch64.sve.fcvtnt.bf16f32.v2( [[A]], [[TMP2]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[OUT1]] ; %out = call @llvm.aarch64.sve.fcvtnt.bf16f32( %a, %pg, %b) ret %out } declare @llvm.aarch64.sve.bfdot(, , ) declare @llvm.aarch64.sve.bfdot.lane.v2(, , , i32) declare @llvm.aarch64.sve.bfmlalb(, , ) declare @llvm.aarch64.sve.bfmlalb.lane.v2(, , , i32) declare @llvm.aarch64.sve.bfmlalt(, , ) declare @llvm.aarch64.sve.bfmlalt.lane.v2(, , , i32) declare @llvm.aarch64.sve.fmmla.nxv4f32.nxv8bf16(, , ) declare @llvm.aarch64.sve.fcvt.bf16f32(, , ) declare @llvm.aarch64.sve.fcvt.bf16f32.v2(, , ) declare @llvm.aarch64.sve.fcvtnt.bf16f32(, , ) declare @llvm.aarch64.sve.fcvtnt.bf16f32.v2(, , )