; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc %s -o - -mtriple=aarch64-arm-none-eabi -O0 -global-isel=1 -global-isel-abort=1 -mattr=+mops,+mte | FileCheck %s --check-prefix=GISel-O0 ; RUN: llc %s -o - -mtriple=aarch64-arm-none-eabi -global-isel=1 -global-isel-abort=1 -mattr=+mops,+mte | FileCheck %s --check-prefix=GISel ; RUN: llc %s -o - -mtriple=aarch64-arm-none-eabi -O2 -mattr=+mops,+mte | FileCheck %s --check-prefix=SDAG declare i8* @llvm.aarch64.mops.memset.tag(i8*, i8, i64) define i8* @memset_tagged_0_zeroval(i8* %dst, i64 %size) { ; GISel-O0-LABEL: memset_tagged_0_zeroval: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: mov x8, xzr ; GISel-O0-NEXT: setgp [x0]!, x8!, x8 ; GISel-O0-NEXT: setgm [x0]!, x8!, x8 ; GISel-O0-NEXT: setge [x0]!, x8!, x8 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_0_zeroval: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov x8, xzr ; GISel-NEXT: setgp [x0]!, x8!, xzr ; GISel-NEXT: setgm [x0]!, x8!, xzr ; GISel-NEXT: setge [x0]!, x8!, xzr ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_0_zeroval: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov x8, xzr ; SDAG-NEXT: setgp [x0]!, x8!, xzr ; SDAG-NEXT: setgm [x0]!, x8!, xzr ; SDAG-NEXT: setge [x0]!, x8!, xzr ; SDAG-NEXT: ret entry: %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 0, i64 0) ret i8* %r } define i8* @memset_tagged_1_zeroval(i8* %dst, i64 %size) { ; GISel-O0-LABEL: memset_tagged_1_zeroval: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: mov x9, xzr ; GISel-O0-NEXT: mov w8, #1 ; GISel-O0-NEXT: // kill: def $x8 killed $w8 ; GISel-O0-NEXT: setgp [x0]!, x8!, x9 ; GISel-O0-NEXT: setgm [x0]!, x8!, x9 ; GISel-O0-NEXT: setge [x0]!, x8!, x9 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_1_zeroval: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov w8, #1 ; GISel-NEXT: setgp [x0]!, x8!, xzr ; GISel-NEXT: setgm [x0]!, x8!, xzr ; GISel-NEXT: setge [x0]!, x8!, xzr ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_1_zeroval: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov w8, #1 ; SDAG-NEXT: setgp [x0]!, x8!, xzr ; SDAG-NEXT: setgm [x0]!, x8!, xzr ; SDAG-NEXT: setge [x0]!, x8!, xzr ; SDAG-NEXT: ret entry: %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 0, i64 1) ret i8* %r } define i8* @memset_tagged_10_zeroval(i8* %dst, i64 %size) { ; GISel-O0-LABEL: memset_tagged_10_zeroval: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: mov x9, xzr ; GISel-O0-NEXT: mov w8, #10 ; GISel-O0-NEXT: // kill: def $x8 killed $w8 ; GISel-O0-NEXT: setgp [x0]!, x8!, x9 ; GISel-O0-NEXT: setgm [x0]!, x8!, x9 ; GISel-O0-NEXT: setge [x0]!, x8!, x9 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_10_zeroval: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov w8, #10 ; GISel-NEXT: setgp [x0]!, x8!, xzr ; GISel-NEXT: setgm [x0]!, x8!, xzr ; GISel-NEXT: setge [x0]!, x8!, xzr ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_10_zeroval: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov w8, #10 ; SDAG-NEXT: setgp [x0]!, x8!, xzr ; SDAG-NEXT: setgm [x0]!, x8!, xzr ; SDAG-NEXT: setge [x0]!, x8!, xzr ; SDAG-NEXT: ret entry: %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 0, i64 10) ret i8* %r } define i8* @memset_tagged_10000_zeroval(i8* %dst, i64 %size) { ; GISel-O0-LABEL: memset_tagged_10000_zeroval: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: mov x9, xzr ; GISel-O0-NEXT: mov w8, #10000 ; GISel-O0-NEXT: // kill: def $x8 killed $w8 ; GISel-O0-NEXT: setgp [x0]!, x8!, x9 ; GISel-O0-NEXT: setgm [x0]!, x8!, x9 ; GISel-O0-NEXT: setge [x0]!, x8!, x9 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_10000_zeroval: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov w8, #10000 ; GISel-NEXT: setgp [x0]!, x8!, xzr ; GISel-NEXT: setgm [x0]!, x8!, xzr ; GISel-NEXT: setge [x0]!, x8!, xzr ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_10000_zeroval: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov w8, #10000 ; SDAG-NEXT: setgp [x0]!, x8!, xzr ; SDAG-NEXT: setgm [x0]!, x8!, xzr ; SDAG-NEXT: setge [x0]!, x8!, xzr ; SDAG-NEXT: ret entry: %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 0, i64 10000) ret i8* %r } define i8* @memset_tagged_size_zeroval(i8* %dst, i64 %size) { ; GISel-O0-LABEL: memset_tagged_size_zeroval: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: mov x8, xzr ; GISel-O0-NEXT: setgp [x0]!, x1!, x8 ; GISel-O0-NEXT: setgm [x0]!, x1!, x8 ; GISel-O0-NEXT: setge [x0]!, x1!, x8 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_size_zeroval: ; GISel: // %bb.0: // %entry ; GISel-NEXT: setgp [x0]!, x1!, xzr ; GISel-NEXT: setgm [x0]!, x1!, xzr ; GISel-NEXT: setge [x0]!, x1!, xzr ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_size_zeroval: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: setgp [x0]!, x1!, xzr ; SDAG-NEXT: setgm [x0]!, x1!, xzr ; SDAG-NEXT: setge [x0]!, x1!, xzr ; SDAG-NEXT: ret entry: %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 0, i64 %size) ret i8* %r } define i8* @memset_tagged_0(i8* %dst, i64 %size, i32 %value) { ; GISel-O0-LABEL: memset_tagged_0: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: // implicit-def: $x9 ; GISel-O0-NEXT: mov w9, w2 ; GISel-O0-NEXT: mov x8, xzr ; GISel-O0-NEXT: setgp [x0]!, x8!, x9 ; GISel-O0-NEXT: setgm [x0]!, x8!, x9 ; GISel-O0-NEXT: setge [x0]!, x8!, x9 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_0: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov x8, xzr ; GISel-NEXT: // kill: def $w2 killed $w2 def $x2 ; GISel-NEXT: setgp [x0]!, x8!, x2 ; GISel-NEXT: setgm [x0]!, x8!, x2 ; GISel-NEXT: setge [x0]!, x8!, x2 ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_0: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov x8, xzr ; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2 ; SDAG-NEXT: setgp [x0]!, x8!, x2 ; SDAG-NEXT: setgm [x0]!, x8!, x2 ; SDAG-NEXT: setge [x0]!, x8!, x2 ; SDAG-NEXT: ret entry: %value_trunc = trunc i32 %value to i8 %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 %value_trunc, i64 0) ret i8* %r } define i8* @memset_tagged_1(i8* %dst, i64 %size, i32 %value) { ; GISel-O0-LABEL: memset_tagged_1: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: // implicit-def: $x9 ; GISel-O0-NEXT: mov w9, w2 ; GISel-O0-NEXT: mov w8, #1 ; GISel-O0-NEXT: // kill: def $x8 killed $w8 ; GISel-O0-NEXT: setgp [x0]!, x8!, x9 ; GISel-O0-NEXT: setgm [x0]!, x8!, x9 ; GISel-O0-NEXT: setge [x0]!, x8!, x9 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_1: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov w8, #1 ; GISel-NEXT: // kill: def $w2 killed $w2 def $x2 ; GISel-NEXT: setgp [x0]!, x8!, x2 ; GISel-NEXT: setgm [x0]!, x8!, x2 ; GISel-NEXT: setge [x0]!, x8!, x2 ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_1: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov w8, #1 ; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2 ; SDAG-NEXT: setgp [x0]!, x8!, x2 ; SDAG-NEXT: setgm [x0]!, x8!, x2 ; SDAG-NEXT: setge [x0]!, x8!, x2 ; SDAG-NEXT: ret entry: %value_trunc = trunc i32 %value to i8 %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 %value_trunc, i64 1) ret i8* %r } define i8* @memset_tagged_10(i8* %dst, i64 %size, i32 %value) { ; GISel-O0-LABEL: memset_tagged_10: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: // implicit-def: $x9 ; GISel-O0-NEXT: mov w9, w2 ; GISel-O0-NEXT: mov w8, #10 ; GISel-O0-NEXT: // kill: def $x8 killed $w8 ; GISel-O0-NEXT: setgp [x0]!, x8!, x9 ; GISel-O0-NEXT: setgm [x0]!, x8!, x9 ; GISel-O0-NEXT: setge [x0]!, x8!, x9 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_10: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov w8, #10 ; GISel-NEXT: // kill: def $w2 killed $w2 def $x2 ; GISel-NEXT: setgp [x0]!, x8!, x2 ; GISel-NEXT: setgm [x0]!, x8!, x2 ; GISel-NEXT: setge [x0]!, x8!, x2 ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_10: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov w8, #10 ; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2 ; SDAG-NEXT: setgp [x0]!, x8!, x2 ; SDAG-NEXT: setgm [x0]!, x8!, x2 ; SDAG-NEXT: setge [x0]!, x8!, x2 ; SDAG-NEXT: ret entry: %value_trunc = trunc i32 %value to i8 %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 %value_trunc, i64 10) ret i8* %r } define i8* @memset_tagged_10000(i8* %dst, i64 %size, i32 %value) { ; GISel-O0-LABEL: memset_tagged_10000: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: // implicit-def: $x9 ; GISel-O0-NEXT: mov w9, w2 ; GISel-O0-NEXT: mov w8, #10000 ; GISel-O0-NEXT: // kill: def $x8 killed $w8 ; GISel-O0-NEXT: setgp [x0]!, x8!, x9 ; GISel-O0-NEXT: setgm [x0]!, x8!, x9 ; GISel-O0-NEXT: setge [x0]!, x8!, x9 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_10000: ; GISel: // %bb.0: // %entry ; GISel-NEXT: mov w8, #10000 ; GISel-NEXT: // kill: def $w2 killed $w2 def $x2 ; GISel-NEXT: setgp [x0]!, x8!, x2 ; GISel-NEXT: setgm [x0]!, x8!, x2 ; GISel-NEXT: setge [x0]!, x8!, x2 ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_10000: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: mov w8, #10000 ; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2 ; SDAG-NEXT: setgp [x0]!, x8!, x2 ; SDAG-NEXT: setgm [x0]!, x8!, x2 ; SDAG-NEXT: setge [x0]!, x8!, x2 ; SDAG-NEXT: ret entry: %value_trunc = trunc i32 %value to i8 %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 %value_trunc, i64 10000) ret i8* %r } define i8* @memset_tagged_size(i8* %dst, i64 %size, i32 %value) { ; GISel-O0-LABEL: memset_tagged_size: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: // implicit-def: $x8 ; GISel-O0-NEXT: mov w8, w2 ; GISel-O0-NEXT: setgp [x0]!, x1!, x8 ; GISel-O0-NEXT: setgm [x0]!, x1!, x8 ; GISel-O0-NEXT: setge [x0]!, x1!, x8 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_size: ; GISel: // %bb.0: // %entry ; GISel-NEXT: // kill: def $w2 killed $w2 def $x2 ; GISel-NEXT: setgp [x0]!, x1!, x2 ; GISel-NEXT: setgm [x0]!, x1!, x2 ; GISel-NEXT: setge [x0]!, x1!, x2 ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_size: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2 ; SDAG-NEXT: setgp [x0]!, x1!, x2 ; SDAG-NEXT: setgm [x0]!, x1!, x2 ; SDAG-NEXT: setge [x0]!, x1!, x2 ; SDAG-NEXT: ret entry: %value_trunc = trunc i32 %value to i8 %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* %dst, i8 %value_trunc, i64 %size) ret i8* %r } define i8* @memset_tagged_size_aligned(i8* %dst, i64 %size, i32 %value) { ; GISel-O0-LABEL: memset_tagged_size_aligned: ; GISel-O0: // %bb.0: // %entry ; GISel-O0-NEXT: // implicit-def: $x8 ; GISel-O0-NEXT: mov w8, w2 ; GISel-O0-NEXT: setgp [x0]!, x1!, x8 ; GISel-O0-NEXT: setgm [x0]!, x1!, x8 ; GISel-O0-NEXT: setge [x0]!, x1!, x8 ; GISel-O0-NEXT: ret ; ; GISel-LABEL: memset_tagged_size_aligned: ; GISel: // %bb.0: // %entry ; GISel-NEXT: // kill: def $w2 killed $w2 def $x2 ; GISel-NEXT: setgp [x0]!, x1!, x2 ; GISel-NEXT: setgm [x0]!, x1!, x2 ; GISel-NEXT: setge [x0]!, x1!, x2 ; GISel-NEXT: ret ; ; SDAG-LABEL: memset_tagged_size_aligned: ; SDAG: // %bb.0: // %entry ; SDAG-NEXT: // kill: def $w2 killed $w2 def $x2 ; SDAG-NEXT: setgp [x0]!, x1!, x2 ; SDAG-NEXT: setgm [x0]!, x1!, x2 ; SDAG-NEXT: setge [x0]!, x1!, x2 ; SDAG-NEXT: ret entry: %value_trunc = trunc i32 %value to i8 %r = tail call i8* @llvm.aarch64.mops.memset.tag(i8* align 16 %dst, i8 %value_trunc, i64 %size) ret i8* %r }