1# RUN: llc -mtriple=aarch64 -mattr=+mte -run-pass=prologepilog %s -o - | FileCheck %s
2
3--- |
4  declare void @llvm.aarch64.settag(i8* nocapture writeonly, i64) argmemonly nounwind writeonly "target-features"="+mte"
5  define i32 @stg16_16_16_16_ret() "target-features"="+mte" {
6  entry:
7    %a = alloca i8, i32 16, align 16
8    %b = alloca i8, i32 16, align 16
9    %c = alloca i8, i32 16, align 16
10    %d = alloca i8, i32 16, align 16
11    call void @llvm.aarch64.settag(i8* %a, i64 16)
12    call void @llvm.aarch64.settag(i8* %b, i64 16)
13    call void @llvm.aarch64.settag(i8* %c, i64 16)
14    call void @llvm.aarch64.settag(i8* %d, i64 16)
15    ret i32 0
16  }
17
18  define void @stg16_store_128() "target-features"="+mte" {
19  entry:
20    %a = alloca i8, i32 16, align 16
21    %b = alloca i8, i32 128, align 16
22    call void @llvm.aarch64.settag(i8* %a, i64 16)
23    store i8 42, i8* %a
24    call void @llvm.aarch64.settag(i8* %b, i64 128)
25    ret void
26  }
27
28...
29---
30# A sequence of STG with a register copy in the middle.
31# Can be merged into ST2G + ST2G.
32# CHECK-LABEL: name:{{.*}}stg16_16_16_16_ret
33# CHECK-DAG: ST2GOffset $sp, $sp, 2
34# CHECK-DAG: ST2GOffset $sp, $sp, 0
35# CHECK-DAG: $w0 = COPY $wzr
36# CHECK-DAG: RET_ReallyLR implicit killed $w0
37
38name:            stg16_16_16_16_ret
39tracksRegLiveness: true
40stack:
41  - { id: 0, name: a, size: 16, alignment: 16 }
42  - { id: 1, name: b, size: 16, alignment: 16 }
43  - { id: 2, name: c, size: 16, alignment: 16 }
44  - { id: 3, name: d, size: 16, alignment: 16 }
45body:             |
46  bb.0.entry:
47    STGOffset $sp, %stack.0.a, 0 :: (store 16 into %ir.a)
48    STGOffset $sp, %stack.1.b, 0 :: (store 16 into %ir.b)
49    STGOffset $sp, %stack.2.c, 0 :: (store 16 into %ir.c)
50    $w0 = COPY $wzr
51    STGOffset $sp, %stack.3.d, 0 :: (store 16 into %ir.d)
52    RET_ReallyLR implicit killed $w0
53
54...
55
56---
57# A store in the middle prevents merging.
58# CHECK-LABEL: name:{{.*}}stg16_store_128
59# CHECK: ST2GOffset $sp, $sp, 2
60# CHECK: ST2GOffset $sp, $sp, 4
61# CHECK: ST2GOffset $sp, $sp, 6
62# CHECK: STGOffset  $sp, $sp, 8
63# CHECK: STRBBui
64# CHECK: ST2GOffset $sp, $sp, 0
65# CHECK: RET_ReallyLR
66
67name:            stg16_store_128
68tracksRegLiveness: true
69stack:
70  - { id: 0, name: a, size: 16, alignment: 16 }
71  - { id: 1, name: b, size: 128, alignment: 16 }
72body:             |
73  bb.0.entry:
74    STGOffset $sp, %stack.0.a, 0 :: (store 16 into %ir.a)
75    renamable $w8 = MOVi32imm 42
76    ST2GOffset $sp, %stack.1.b, 6 :: (store 32 into %ir.b + 96, align 16)
77    ST2GOffset $sp, %stack.1.b, 4 :: (store 32 into %ir.b + 64, align 16)
78    ST2GOffset $sp, %stack.1.b, 2 :: (store 32 into %ir.b + 32, align 16)
79    STRBBui killed renamable $w8, %stack.0.a, 0 :: (store 1 into %ir.a, align 16)
80    ST2GOffset $sp, %stack.1.b, 0 :: (store 32 into %ir.b, align 16)
81    RET_ReallyLR
82
83...
84