-
Notifications
You must be signed in to change notification settings - Fork 12.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PR for llvm/llvm-project#80137 #80138
Conversation
@kmclaughlin-arm What do you think about merging this PR to the release branch? |
@llvm/pr-subscribers-backend-aarch64 @llvm/pr-subscribers-llvm-transforms Author: None (llvmbot) Changesresolves llvm/llvm-project#80137 Patch is 26.14 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/80138.diff 2 Files Affected:
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
index d611338fc268f..992b11da7eeee 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -233,15 +233,20 @@ static bool hasPossibleIncompatibleOps(const Function *F) {
bool AArch64TTIImpl::areInlineCompatible(const Function *Caller,
const Function *Callee) const {
- SMEAttrs CallerAttrs(*Caller);
- SMEAttrs CalleeAttrs(*Callee);
+ SMEAttrs CallerAttrs(*Caller), CalleeAttrs(*Callee);
+
+ // When inlining, we should consider the body of the function, not the
+ // interface.
+ if (CalleeAttrs.hasStreamingBody()) {
+ CalleeAttrs.set(SMEAttrs::SM_Compatible, false);
+ CalleeAttrs.set(SMEAttrs::SM_Enabled, true);
+ }
+
if (CalleeAttrs.hasNewZABody())
return false;
if (CallerAttrs.requiresLazySave(CalleeAttrs) ||
- (CallerAttrs.requiresSMChange(CalleeAttrs) &&
- (!CallerAttrs.hasStreamingInterfaceOrBody() ||
- !CalleeAttrs.hasStreamingBody()))) {
+ CallerAttrs.requiresSMChange(CalleeAttrs)) {
if (hasPossibleIncompatibleOps(Callee))
return false;
}
@@ -4062,4 +4067,4 @@ bool AArch64TTIImpl::shouldTreatInstructionLikeSelect(const Instruction *I) {
cast<BranchInst>(I->getNextNode())->isUnconditional())
return true;
return BaseT::shouldTreatInstructionLikeSelect(I);
-}
\ No newline at end of file
+}
diff --git a/llvm/test/Transforms/Inline/AArch64/sme-pstatesm-attrs.ll b/llvm/test/Transforms/Inline/AArch64/sme-pstatesm-attrs.ll
index d6b1f3ef45e76..7723e6c664c3d 100644
--- a/llvm/test/Transforms/Inline/AArch64/sme-pstatesm-attrs.ll
+++ b/llvm/test/Transforms/Inline/AArch64/sme-pstatesm-attrs.ll
@@ -1,71 +1,70 @@
; 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";
+declare i32 @llvm.vscale.i32()
-; 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 some functions that merely call llvm.vscale.i32(), which will be called
+; by the other functions below. If we see the call to one of these functions
+; being replaced by 'llvm.vscale()', then we know it has been inlined.
-define void @normal_callee() {
-; CHECK-LABEL: define void @normal_callee
+define i32 @normal_callee() {
+; CHECK-LABEL: define i32 @normal_callee
; CHECK-SAME: () #[[ATTR1:[0-9]+]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @inlined_body()
- ret void
+ %res = call i32 @llvm.vscale.i32()
+ ret i32 %res
}
-define void @streaming_callee() "aarch64_pstate_sm_enabled" {
-; CHECK-LABEL: define void @streaming_callee
+define i32 @streaming_callee() "aarch64_pstate_sm_enabled" {
+; CHECK-LABEL: define i32 @streaming_callee
; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @inlined_body()
- ret void
+ %res = call i32 @llvm.vscale.i32()
+ ret i32 %res
}
-define void @locally_streaming_callee() "aarch64_pstate_sm_body" {
-; CHECK-LABEL: define void @locally_streaming_callee
+define i32 @locally_streaming_callee() "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i32 @locally_streaming_callee
; CHECK-SAME: () #[[ATTR3:[0-9]+]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @inlined_body()
- ret void
+ %res = call i32 @llvm.vscale.i32()
+ ret i32 %res
}
-define void @streaming_compatible_callee() "aarch64_pstate_sm_compatible" {
-; CHECK-LABEL: define void @streaming_compatible_callee
+define i32 @streaming_compatible_callee() "aarch64_pstate_sm_compatible" {
+; CHECK-LABEL: define i32 @streaming_compatible_callee
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @inlined_body()
- ret void
+ %res = call i32 @llvm.vscale.i32()
+ ret i32 %res
}
-define void @streaming_compatible_locally_streaming_callee() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
-; CHECK-LABEL: define void @streaming_compatible_locally_streaming_callee
+define i32 @streaming_compatible_locally_streaming_callee() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i32 @streaming_compatible_locally_streaming_callee
; CHECK-SAME: () #[[ATTR4:[0-9]+]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @inlined_body()
- ret void
+ %res = call i32 @llvm.vscale()
+ ret i32 %res
}
; Now test that inlining only happens when their streaming modes match.
@@ -85,16 +84,16 @@ entry:
; [ ] N -> SC
; [ ] N -> N + B
; [ ] N -> SC + B
-define void @normal_caller_normal_callee_inline() {
-; CHECK-LABEL: define void @normal_caller_normal_callee_inline
+define i32 @normal_caller_normal_callee_inline() {
+; CHECK-LABEL: define i32 @normal_caller_normal_callee_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @normal_callee()
- ret void
+ %res = call i32 @normal_callee()
+ ret i32 %res
}
; [ ] N -> N
@@ -102,16 +101,16 @@ entry:
; [ ] N -> SC
; [ ] N -> N + B
; [ ] N -> SC + B
-define void @normal_caller_streaming_callee_inline() {
-; CHECK-LABEL: define void @normal_caller_streaming_callee_inline
+define i32 @normal_caller_streaming_callee_dont_inline() {
+; CHECK-LABEL: define i32 @normal_caller_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @streaming_callee()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @streaming_callee()
- ret void
+ %res = call i32 @streaming_callee()
+ ret i32 %res
}
; [ ] N -> N
@@ -119,16 +118,16 @@ entry:
; [x] N -> SC
; [ ] N -> N + B
; [ ] N -> SC + B
-define void @normal_caller_streaming_compatible_callee_inline() {
-; CHECK-LABEL: define void @normal_caller_streaming_compatible_callee_inline
+define i32 @normal_caller_streaming_compatible_callee_inline() {
+; CHECK-LABEL: define i32 @normal_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_compatible_callee()
- ret void
+ %res = call i32 @streaming_compatible_callee()
+ ret i32 %res
}
; [ ] N -> N
@@ -136,16 +135,16 @@ entry:
; [ ] N -> SC
; [x] N -> N + B
; [ ] N -> SC + B
-define void @normal_caller_locally_streaming_callee_inline() {
-; CHECK-LABEL: define void @normal_caller_locally_streaming_callee_inline
+define i32 @normal_caller_locally_streaming_callee_dont_inline() {
+; CHECK-LABEL: define i32 @normal_caller_locally_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @locally_streaming_callee()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @locally_streaming_callee()
- ret void
+ %res = call i32 @locally_streaming_callee()
+ ret i32 %res
}
; [ ] N -> N
@@ -153,16 +152,16 @@ entry:
; [ ] N -> SC
; [ ] N -> N + B
; [x] N -> SC + B
-define void @normal_caller_streaming_compatible_locally_streaming_callee_inline() {
-; CHECK-LABEL: define void @normal_caller_streaming_compatible_locally_streaming_callee_inline
+define i32 @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline() {
+; CHECK-LABEL: define i32 @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR1]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @streaming_compatible_locally_streaming_callee()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @streaming_compatible_locally_streaming_callee()
- ret void
+ %res = call i32 @streaming_compatible_locally_streaming_callee()
+ ret i32 %res
}
; [x] S -> N
@@ -170,16 +169,16 @@ entry:
; [ ] S -> SC
; [ ] S -> N + B
; [ ] S -> SC + B
-define void @streaming_caller_normal_callee_inline() "aarch64_pstate_sm_enabled" {
-; CHECK-LABEL: define void @streaming_caller_normal_callee_inline
+define i32 @streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_enabled" {
+; CHECK-LABEL: define i32 @streaming_caller_normal_callee_dont_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @normal_callee()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @normal_callee()
- ret void
+ %res = call i32 @normal_callee()
+ ret i32 %res
}
; [ ] S -> N
@@ -187,16 +186,16 @@ entry:
; [ ] S -> SC
; [ ] S -> N + B
; [ ] S -> SC + B
-define void @streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
-; CHECK-LABEL: define void @streaming_caller_streaming_callee_inline
+define i32 @streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
+; CHECK-LABEL: define i32 @streaming_caller_streaming_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_callee()
- ret void
+ %res = call i32 @streaming_callee()
+ ret i32 %res
}
; [ ] S -> N
@@ -204,16 +203,16 @@ entry:
; [x] S -> SC
; [ ] S -> N + B
; [ ] S -> SC + B
-define void @streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_enabled" {
-; CHECK-LABEL: define void @streaming_caller_streaming_compatible_callee_inline
+define i32 @streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_enabled" {
+; CHECK-LABEL: define i32 @streaming_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_compatible_callee()
- ret void
+ %res = call i32 @streaming_compatible_callee()
+ ret i32 %res
}
; [ ] S -> N
@@ -221,16 +220,16 @@ entry:
; [ ] S -> SC
; [x] S -> N + B
; [ ] S -> SC + B
-define void @streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
-; CHECK-LABEL: define void @streaming_caller_locally_streaming_callee_inline
+define i32 @streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
+; CHECK-LABEL: define i32 @streaming_caller_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @locally_streaming_callee()
- ret void
+ %res = call i32 @locally_streaming_callee()
+ ret i32 %res
}
; [ ] S -> N
@@ -238,16 +237,16 @@ entry:
; [ ] S -> SC
; [ ] S -> N + B
; [x] S -> SC + B
-define void @streaming_caller_streaming_compatible_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
-; CHECK-LABEL: define void @streaming_caller_streaming_compatible_locally_streaming_callee_inline
+define i32 @streaming_caller_streaming_compatible_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
+; CHECK-LABEL: define i32 @streaming_caller_streaming_compatible_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR2]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_compatible_locally_streaming_callee()
- ret void
+ %res = call i32 @streaming_compatible_locally_streaming_callee()
+ ret i32 %res
}
; [x] N + B -> N
@@ -255,16 +254,16 @@ entry:
; [ ] N + B -> SC
; [ ] N + B -> N + B
; [ ] N + B -> SC + B
-define void @locally_streaming_caller_normal_callee_inline() "aarch64_pstate_sm_body" {
-; CHECK-LABEL: define void @locally_streaming_caller_normal_callee_inline
+define i32 @locally_streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i32 @locally_streaming_caller_normal_callee_dont_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @normal_callee()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @normal_callee()
- ret void
+ %res = call i32 @normal_callee()
+ ret i32 %res
}
; [ ] N + B -> N
@@ -272,16 +271,16 @@ entry:
; [ ] N + B -> SC
; [ ] N + B -> N + B
; [ ] N + B -> SC + B
-define void @locally_streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_body" {
-; CHECK-LABEL: define void @locally_streaming_caller_streaming_callee_inline
+define i32 @locally_streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i32 @locally_streaming_caller_streaming_callee_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_callee()
- ret void
+ %res = call i32 @streaming_callee()
+ ret i32 %res
}
; [ ] N + B -> N
@@ -289,16 +288,16 @@ entry:
; [x] N + B -> SC
; [ ] N + B -> N + B
; [ ] N + B -> SC + B
-define void @locally_streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_body" {
-; CHECK-LABEL: define void @locally_streaming_caller_streaming_compatible_callee_inline
+define i32 @locally_streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i32 @locally_streaming_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_compatible_callee()
- ret void
+ %res = call i32 @streaming_compatible_callee()
+ ret i32 %res
}
; [ ] N + B -> N
@@ -306,16 +305,16 @@ entry:
; [ ] N + B -> SC
; [x] N + B -> N + B
; [ ] N + B -> SC + B
-define void @locally_streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_body" {
-; CHECK-LABEL: define void @locally_streaming_caller_locally_streaming_callee_inline
+define i32 @locally_streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i32 @locally_streaming_caller_locally_streaming_callee_inline
; CHECK-SAME: () #[[ATTR3]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @locally_streaming_callee()
- ret void
+ %res = call i32 @locally_streaming_callee()
+ ret i32 %res
}
; [ ] N + B -> N
@@ -323,16 +322,16 @@ entry:
; [ ] N + B -> SC
; [ ] 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: define void @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline
+define i32 @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline() "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i32 @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
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_compatible_locally_streaming_callee()
- ret void
+ %res = call i32 @streaming_compatible_locally_streaming_callee()
+ ret i32 %res
}
; [x] SC -> N
@@ -340,16 +339,16 @@ entry:
; [ ] SC -> SC
; [ ] SC -> N + B
; [ ] SC -> SC + B
-define void @streaming_compatible_caller_normal_callee_inline() "aarch64_pstate_sm_compatible" {
-; CHECK-LABEL: define void @streaming_compatible_caller_normal_callee_inline
+define i32 @streaming_compatible_caller_normal_callee_dont_inline() "aarch64_pstate_sm_compatible" {
+; CHECK-LABEL: define i32 @streaming_compatible_caller_normal_callee_dont_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @normal_callee()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @normal_callee()
- ret void
+ %res = call i32 @normal_callee()
+ ret i32 %res
}
; [ ] SC -> N
@@ -357,16 +356,16 @@ entry:
; [ ] SC -> SC
; [ ] SC -> N + B
; [ ] SC -> SC + B
-define void @streaming_compatible_caller_streaming_callee_inline() "aarch64_pstate_sm_compatible" {
-; CHECK-LABEL: define void @streaming_compatible_caller_streaming_callee_inline
+define i32 @streaming_compatible_caller_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
+; CHECK-LABEL: define i32 @streaming_compatible_caller_streaming_callee_dont_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES:%.*]] = call i32 @streaming_callee()
+; CHECK-NEXT: ret i32 [[RES]]
;
entry:
- call void @streaming_callee()
- ret void
+ %res = call i32 @streaming_callee()
+ ret i32 %res
}
; [ ] SC -> N
@@ -374,16 +373,16 @@ entry:
; [x] SC -> SC
; [ ] SC -> N + B
; [ ] SC -> SC + B
-define void @streaming_compatible_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_compatible" {
-; CHECK-LABEL: define void @streaming_compatible_caller_streaming_compatible_callee_inline
+define i32 @streaming_compatible_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_compatible" {
+; CHECK-LABEL: define i32 @streaming_compatible_caller_streaming_compatible_callee_inline
; CHECK-SAME: () #[[ATTR0]] {
; CHECK-NEXT: entry:
-; CHECK-NEXT: call void @inlined_body()
-; CHECK-NEXT: ret void
+; CHECK-NEXT: [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
+; CHECK-NEXT: ret i32 [[RES_I]]
;
entry:
- call void @streaming_compatible_callee()
- ret void
+ %res = call i32 @streaming_compatible_callee()
+ ret i32 %res
}
; [ ] SC -> N
@@ -391,16 +390,16 @@ entry:
; [ ] SC -> SC
; [x] SC -> N + B
; [ ] SC -> SC + B
-define void @streaming_compatible_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_compatible" {
-; CHECK-LABEL: define void @streaming_compatible_caller_locally_streaming_callee_inline
+define i32 @streaming_compatible_caller_locally_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
+; CHECK-LABEL: define i32 @st...
[truncated]
|
I think this should be merged into the release branch, as it fixes incorrect inlining of |
Calling a `__arm_locally_streaming` function from a function that is not a streaming-SVE function would lead to incorrect inlining. The issue didn't surface because the tests were not testing what they were supposed to test. (cherry picked from commit 3abf55a)
resolves #80137