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