@@ -1,45 +1,73 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
; RUN: opt < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+sme -S -passes=inline | FileCheck %s
declare void @inlined_body () "aarch64_pstate_sm_compatible" ;
;
; Define some functions that will be called by the functions below.
; These just call a '...body()' function. If we see the call to one of
; these functions being replaced by '...body()', then we know it has been
; inlined.
;
define void @normal_callee () {
; CHECK-LABEL: define void @normal_callee
; CHECK-SAME: () #[[ATTR1:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @inlined_body ()
ret void
}
define void @streaming_callee () "aarch64_pstate_sm_enabled" {
; CHECK-LABEL: define void @streaming_callee
; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @inlined_body ()
ret void
}
define void @locally_streaming_callee () "aarch64_pstate_sm_body" {
; CHECK-LABEL: define void @locally_streaming_callee
; CHECK-SAME: () #[[ATTR3:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @inlined_body ()
ret void
}
define void @streaming_compatible_callee () "aarch64_pstate_sm_compatible" {
; CHECK-LABEL: define void @streaming_compatible_callee
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @inlined_body ()
ret void
}
define void @streaming_compatible_locally_streaming_callee () "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
; CHECK-LABEL: define void @streaming_compatible_locally_streaming_callee
; CHECK-SAME: () #[[ATTR4:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @inlined_body ()
ret void
}
;
; Now test that inlining only happens when their streaming modes match.
; Test for a number of combinations, where:
; N Normal-interface (PSTATE.SM=0 on entry/exit)
Expand All
@@ -58,8 +86,12 @@ entry:
; [ ] N -> N + B
; [ ] N -> SC + B
define void @normal_caller_normal_callee_inline () {
; CHECK-LABEL: @normal_caller_normal_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @normal_caller_normal_callee_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @normal_callee ()
ret void
Expand All
@@ -71,8 +103,12 @@ entry:
; [ ] N -> N + B
; [ ] N -> SC + B
define void @normal_caller_streaming_callee_dont_inline () {
; CHECK-LABEL: @normal_caller_streaming_callee_dont_inline(
; CHECK: call void @streaming_callee()
; CHECK-LABEL: define void @normal_caller_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @streaming_callee()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_callee ()
ret void
Expand All
@@ -84,8 +120,12 @@ entry:
; [ ] N -> N + B
; [ ] N -> SC + B
define void @normal_caller_streaming_compatible_callee_inline () {
; CHECK-LABEL: @normal_caller_streaming_compatible_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @normal_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_callee ()
ret void
Expand All
@@ -97,8 +137,12 @@ entry:
; [x] N -> N + B
; [ ] N -> SC + B
define void @normal_caller_locally_streaming_callee_dont_inline () {
; CHECK-LABEL: @normal_caller_locally_streaming_callee_dont_inline(
; CHECK: call void @locally_streaming_callee()
; CHECK-LABEL: define void @normal_caller_locally_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @locally_streaming_callee()
; CHECK-NEXT: ret void
;
entry:
call void @locally_streaming_callee ()
ret void
Expand All
@@ -110,8 +154,12 @@ entry:
; [ ] N -> N + B
; [x] N -> SC + B
define void @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline () {
; CHECK-LABEL: @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline(
; CHECK: call void @streaming_compatible_locally_streaming_callee()
; CHECK-LABEL: define void @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @streaming_compatible_locally_streaming_callee()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_locally_streaming_callee ()
ret void
Expand All
@@ -123,8 +171,12 @@ entry:
; [ ] S -> N + B
; [ ] S -> SC + B
define void @streaming_caller_normal_callee_dont_inline () "aarch64_pstate_sm_enabled" {
; CHECK-LABEL: @streaming_caller_normal_callee_dont_inline(
; CHECK: call void @normal_callee()
; CHECK-LABEL: define void @streaming_caller_normal_callee_dont_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @normal_callee()
; CHECK-NEXT: ret void
;
entry:
call void @normal_callee ()
ret void
Expand All
@@ -136,8 +188,12 @@ entry:
; [ ] S -> N + B
; [ ] S -> SC + B
define void @streaming_caller_streaming_callee_inline () "aarch64_pstate_sm_enabled" {
; CHECK-LABEL: @streaming_caller_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_caller_streaming_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_callee ()
ret void
Expand All
@@ -149,8 +205,12 @@ entry:
; [ ] S -> N + B
; [ ] S -> SC + B
define void @streaming_caller_streaming_compatible_callee_inline () "aarch64_pstate_sm_enabled" {
; CHECK-LABEL: @streaming_caller_streaming_compatible_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_callee ()
ret void
Expand All
@@ -162,8 +222,12 @@ entry:
; [x] S -> N + B
; [ ] S -> SC + B
define void @streaming_caller_locally_streaming_callee_inline () "aarch64_pstate_sm_enabled" {
; CHECK-LABEL: @streaming_caller_locally_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_caller_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @locally_streaming_callee ()
ret void
Expand All
@@ -175,8 +239,12 @@ entry:
; [ ] S -> N + B
; [x] S -> SC + B
define void @streaming_caller_streaming_compatible_locally_streaming_callee_inline () "aarch64_pstate_sm_enabled" {
; CHECK-LABEL: @streaming_caller_streaming_compatible_locally_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_caller_streaming_compatible_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_locally_streaming_callee ()
ret void
Expand All
@@ -188,8 +256,12 @@ entry:
; [ ] N + B -> N + B
; [ ] N + B -> SC + B
define void @locally_streaming_caller_normal_callee_dont_inline () "aarch64_pstate_sm_body" {
; CHECK-LABEL: @locally_streaming_caller_normal_callee_dont_inline(
; CHECK: call void @normal_callee()
; CHECK-LABEL: define void @locally_streaming_caller_normal_callee_dont_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @normal_callee()
; CHECK-NEXT: ret void
;
entry:
call void @normal_callee ()
ret void
Expand All
@@ -201,8 +273,12 @@ entry:
; [ ] N + B -> N + B
; [ ] N + B -> SC + B
define void @locally_streaming_caller_streaming_callee_inline () "aarch64_pstate_sm_body" {
; CHECK-LABEL: @locally_streaming_caller_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @locally_streaming_caller_streaming_callee_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_callee ()
ret void
Expand All
@@ -214,8 +290,12 @@ entry:
; [ ] N + B -> N + B
; [ ] N + B -> SC + B
define void @locally_streaming_caller_streaming_compatible_callee_inline () "aarch64_pstate_sm_body" {
; CHECK-LABEL: @locally_streaming_caller_streaming_compatible_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @locally_streaming_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_callee ()
ret void
Expand All
@@ -227,8 +307,12 @@ entry:
; [x] N + B -> N + B
; [ ] N + B -> SC + B
define void @locally_streaming_caller_locally_streaming_callee_inline () "aarch64_pstate_sm_body" {
; CHECK-LABEL: @locally_streaming_caller_locally_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @locally_streaming_caller_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @locally_streaming_callee ()
ret void
Expand All
@@ -240,8 +324,12 @@ entry:
; [ ] N + B -> N + B
; [x] N + B -> SC + B
define void @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline () "aarch64_pstate_sm_body" {
; CHECK-LABEL: @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_locally_streaming_callee ()
ret void
Expand All
@@ -253,8 +341,12 @@ entry:
; [ ] SC -> N + B
; [ ] SC -> SC + B
define void @streaming_compatible_caller_normal_callee_dont_inline () "aarch64_pstate_sm_compatible" {
; CHECK-LABEL: @streaming_compatible_caller_normal_callee_dont_inline(
; CHECK: call void @normal_callee()
; CHECK-LABEL: define void @streaming_compatible_caller_normal_callee_dont_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @normal_callee()
; CHECK-NEXT: ret void
;
entry:
call void @normal_callee ()
ret void
Expand All
@@ -266,8 +358,12 @@ entry:
; [ ] SC -> N + B
; [ ] SC -> SC + B
define void @streaming_compatible_caller_streaming_callee_dont_inline () "aarch64_pstate_sm_compatible" {
; CHECK-LABEL: @streaming_compatible_caller_streaming_callee_dont_inline(
; CHECK: call void @streaming_callee()
; CHECK-LABEL: define void @streaming_compatible_caller_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @streaming_callee()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_callee ()
ret void
Expand All
@@ -279,8 +375,12 @@ entry:
; [ ] SC -> N + B
; [ ] SC -> SC + B
define void @streaming_compatible_caller_streaming_compatible_callee_inline () "aarch64_pstate_sm_compatible" {
; CHECK-LABEL: @streaming_compatible_caller_streaming_compatible_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_compatible_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_callee ()
ret void
Expand All
@@ -292,8 +392,12 @@ entry:
; [x] SC -> N + B
; [ ] SC -> SC + B
define void @streaming_compatible_caller_locally_streaming_callee_dont_inline () "aarch64_pstate_sm_compatible" {
; CHECK-LABEL: @streaming_compatible_caller_locally_streaming_callee_dont_inline(
; CHECK: call void @locally_streaming_callee()
; CHECK-LABEL: define void @streaming_compatible_caller_locally_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @locally_streaming_callee()
; CHECK-NEXT: ret void
;
entry:
call void @locally_streaming_callee ()
ret void
Expand All
@@ -305,8 +409,12 @@ entry:
; [ ] SC -> N + B
; [x] SC -> SC + B
define void @streaming_compatible_caller_streaming_compatible_locally_streaming_callee_dont_inline () "aarch64_pstate_sm_compatible" {
; CHECK-LABEL: @streaming_compatible_caller_streaming_compatible_locally_streaming_callee_dont_inline(
; CHECK: call void @streaming_compatible_locally_streaming_callee()
; CHECK-LABEL: define void @streaming_compatible_caller_streaming_compatible_locally_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @streaming_compatible_locally_streaming_callee()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_locally_streaming_callee ()
ret void
Expand All
@@ -317,8 +425,12 @@ entry:
; [ ] SC + B -> N + B
; [ ] SC + B -> SC + B
define void @streaming_compatible_locally_streaming_caller_normal_callee_dont_inline () "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_normal_callee_dont_inline(
; CHECK: call void @normal_callee()
; CHECK-LABEL: define void @streaming_compatible_locally_streaming_caller_normal_callee_dont_inline
; CHECK-SAME: () #[[ATTR4]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @normal_callee()
; CHECK-NEXT: ret void
;
entry:
call void @normal_callee ()
ret void
Expand All
@@ -330,8 +442,12 @@ entry:
; [ ] SC + B -> N + B
; [ ] SC + B -> SC + B
define void @streaming_compatible_locally_streaming_caller_streaming_callee_inline () "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_compatible_locally_streaming_caller_streaming_callee_inline
; CHECK-SAME: () #[[ATTR4]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_callee ()
ret void
Expand All
@@ -343,8 +459,12 @@ entry:
; [ ] SC + B -> N + B
; [ ] SC + B -> SC + B
define void @streaming_compatible_locally_streaming_caller_streaming_compatible_callee_inline () "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_streaming_compatible_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_compatible_locally_streaming_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR4]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_callee ()
ret void
Expand All
@@ -356,8 +476,12 @@ entry:
; [x] SC + B -> N + B
; [ ] SC + B -> SC + B
define void @streaming_compatible_locally_streaming_caller_locally_streaming_callee_inline () "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_locally_streaming_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_compatible_locally_streaming_caller_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR4]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @locally_streaming_callee ()
ret void
Expand All
@@ -369,8 +493,12 @@ entry:
; [ ] SC + B -> N + B
; [x] SC + B -> SC + B
define void @streaming_compatible_locally_streaming_caller_and_callee_inline () "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_and_callee_inline(
; CHECK: call void @inlined_body()
; CHECK-LABEL: define void @streaming_compatible_locally_streaming_caller_and_callee_inline
; CHECK-SAME: () #[[ATTR4]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @inlined_body()
; CHECK-NEXT: ret void
;
entry:
call void @streaming_compatible_locally_streaming_callee ()
ret void
Expand Down