blob: dc2a00c7d3d375ec50e511f775b414445f915880 [file] [log] [blame]
# RUN: llc -mtriple=aarch64 -mattr=+mte -run-pass=prologepilog %s -o - | FileCheck %s
--- |
declare void @llvm.aarch64.settag(i8* nocapture writeonly, i64) argmemonly nounwind writeonly "target-features"="+mte"
define i32 @stg16_16_16_16_ret() "target-features"="+mte" {
entry:
%a = alloca i8, i32 16, align 16
%b = alloca i8, i32 16, align 16
%c = alloca i8, i32 16, align 16
%d = alloca i8, i32 16, align 16
call void @llvm.aarch64.settag(i8* %a, i64 16)
call void @llvm.aarch64.settag(i8* %b, i64 16)
call void @llvm.aarch64.settag(i8* %c, i64 16)
call void @llvm.aarch64.settag(i8* %d, i64 16)
ret i32 0
}
define void @stg16_store_128() "target-features"="+mte" {
entry:
%a = alloca i8, i32 16, align 16
%b = alloca i8, i32 128, align 16
call void @llvm.aarch64.settag(i8* %a, i64 16)
store i8 42, i8* %a
call void @llvm.aarch64.settag(i8* %b, i64 128)
ret void
}
...
---
# A sequence of STG with a register copy in the middle.
# Can be merged into ST2G + ST2G.
# CHECK-LABEL: name:{{.*}}stg16_16_16_16_ret
# CHECK-DAG: ST2GOffset $sp, $sp, 2
# CHECK-DAG: ST2GOffset $sp, $sp, 0
# CHECK-DAG: $w0 = COPY $wzr
# CHECK-DAG: RET_ReallyLR implicit killed $w0
name: stg16_16_16_16_ret
tracksRegLiveness: true
stack:
- { id: 0, name: a, size: 16, alignment: 16 }
- { id: 1, name: b, size: 16, alignment: 16 }
- { id: 2, name: c, size: 16, alignment: 16 }
- { id: 3, name: d, size: 16, alignment: 16 }
body: |
bb.0.entry:
STGOffset $sp, %stack.0.a, 0 :: (store 16 into %ir.a)
STGOffset $sp, %stack.1.b, 0 :: (store 16 into %ir.b)
STGOffset $sp, %stack.2.c, 0 :: (store 16 into %ir.c)
$w0 = COPY $wzr
STGOffset $sp, %stack.3.d, 0 :: (store 16 into %ir.d)
RET_ReallyLR implicit killed $w0
...
---
# A store in the middle prevents merging.
# CHECK-LABEL: name:{{.*}}stg16_store_128
# CHECK: ST2GOffset $sp, $sp, 2
# CHECK: ST2GOffset $sp, $sp, 4
# CHECK: ST2GOffset $sp, $sp, 6
# CHECK: STGOffset $sp, $sp, 8
# CHECK: STRBBui
# CHECK: ST2GOffset $sp, $sp, 0
# CHECK: RET_ReallyLR
name: stg16_store_128
tracksRegLiveness: true
stack:
- { id: 0, name: a, size: 16, alignment: 16 }
- { id: 1, name: b, size: 128, alignment: 16 }
body: |
bb.0.entry:
STGOffset $sp, %stack.0.a, 0 :: (store 16 into %ir.a)
renamable $w8 = MOVi32imm 42
ST2GOffset $sp, %stack.1.b, 6 :: (store 32 into %ir.b + 96, align 16)
ST2GOffset $sp, %stack.1.b, 4 :: (store 32 into %ir.b + 64, align 16)
ST2GOffset $sp, %stack.1.b, 2 :: (store 32 into %ir.b + 32, align 16)
STRBBui killed renamable $w8, %stack.0.a, 0 :: (store 1 into %ir.a, align 16)
ST2GOffset $sp, %stack.1.b, 0 :: (store 32 into %ir.b, align 16)
RET_ReallyLR
...