; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -mattr=+sve,+i8mm < %s -passes=msan -S | FileCheck %s ; ; Forked from llvm/test/CodeGen/AArch64/sve-intrinsics-matmul-int8.ll ; ; Strictly handled: ; - llvm.aarch64.sve.smmla.nxv4i32 ; - llvm.aarch64.sve.ummla.nxv4i32 ; - llvm.aarch64.sve.usmmla.nxv4i32 ; - llvm.aarch64.sve.usdot.nxv4i32 ; - llvm.aarch64.sve.usdot.lane.nxv4i32 ; - llvm.aarch64.sve.sudot.lane.nxv4i32 ; ; 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 @smmla( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @smmla( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.smmla.nxv4i32( [[R]], [[A]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.smmla.nxv4i32( %r, %a, %b) ret %val } define @ummla( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @ummla( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.ummla.nxv4i32( [[R]], [[A]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.ummla.nxv4i32( %r, %a, %b) ret %val } define @usmmla( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @usmmla( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.usmmla.nxv4i32( [[R]], [[A]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.usmmla.nxv4i32( %r, %a, %b) ret %val } define @usdot( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @usdot( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.usdot.nxv4i32( [[R]], [[A]], [[B]]) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.usdot.nxv4i32( %r, %a, %b) ret %val } define @usdot_lane_0( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @usdot_lane_0( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 0) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( %r, %a, %b, i32 0) ret %val } define @usdot_lane_1( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @usdot_lane_1( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 1) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( %r, %a, %b, i32 1) ret %val } define @usdot_lane_2( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @usdot_lane_2( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 2) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( %r, %a, %b, i32 2) ret %val } define @usdot_lane_3( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @usdot_lane_3( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 3) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.usdot.lane.nxv4i32( %r, %a, %b, i32 3) ret %val } define @sudot_lane_0( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @sudot_lane_0( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 0) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( %r, %a, %b, i32 0) ret %val } define @sudot_lane_1( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @sudot_lane_1( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 1) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( %r, %a, %b, i32 1) ret %val } define @sudot_lane_2( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @sudot_lane_2( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 2) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( %r, %a, %b, i32 2) ret %val } define @sudot_lane_3( %r, %a, %b) nounwind sanitize_memory { ; CHECK-LABEL: define @sudot_lane_3( ; CHECK-SAME: [[R:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: call void @llvm.donothing() ; CHECK-NEXT: [[VAL:%.*]] = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( [[R]], [[A]], [[B]], i32 3) ; CHECK-NEXT: store zeroinitializer, ptr @__msan_retval_tls, align 8 ; CHECK-NEXT: ret [[VAL]] ; entry: %val = tail call @llvm.aarch64.sve.sudot.lane.nxv4i32( %r, %a, %b, i32 3) ret %val } declare @llvm.aarch64.sve.smmla.nxv4i32(, , ) declare @llvm.aarch64.sve.ummla.nxv4i32(, , ) declare @llvm.aarch64.sve.usmmla.nxv4i32(, , ) declare @llvm.aarch64.sve.usdot.nxv4i32(, , ) declare @llvm.aarch64.sve.usdot.lane.nxv4i32(, , , i32) declare @llvm.aarch64.sve.sudot.lane.nxv4i32(, , , i32)