Skip to content

[AArch64][SME] Instcombine llvm.aarch64.sme.in.streaming.mode() #147930

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

Merged
merged 3 commits into from
Jul 13, 2025

Conversation

MacDue
Copy link
Member

@MacDue MacDue commented Jul 10, 2025

This can fold away in functions with known streaming modes.

This can fold away in non-streaming-compatible functions.
@MacDue MacDue requested a review from sdesmalen-arm July 10, 2025 10:06
@llvmbot llvmbot added backend:AArch64 llvm:instcombine Covers the InstCombine, InstSimplify and AggressiveInstCombine passes llvm:transforms labels Jul 10, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-llvm-transforms

@llvm/pr-subscribers-backend-aarch64

Author: Benjamin Maxwell (MacDue)

Changes

This can fold away in non-streaming-compatible functions.


Full diff: https://github.com/llvm/llvm-project/pull/147930.diff

2 Files Affected:

  • (modified) llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp (+12)
  • (added) llvm/test/Transforms/InstCombine/AArch64/aarch64-sme-in-streaming-mode.ll (+38)
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
index adc905384bf53..9e64e33818781 100644
--- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -2723,6 +2723,16 @@ static std::optional<Instruction *> instCombineSVEUxt(InstCombiner &IC,
   return std::nullopt;
 }
 
+static std::optional<Instruction *>
+instCombineInStreamingMode(InstCombiner &IC, IntrinsicInst &II) {
+  SMEAttrs FnSMEAttrs(*II.getFunction());
+  if (FnSMEAttrs.hasStreamingCompatibleInterface())
+    return std::nullopt;
+  bool IsStreaming = FnSMEAttrs.hasStreamingInterfaceOrBody();
+  return IC.replaceInstUsesWith(
+      II, ConstantInt::getBool(II.getType(), IsStreaming));
+}
+
 std::optional<Instruction *>
 AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC,
                                      IntrinsicInst &II) const {
@@ -2828,6 +2838,8 @@ AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC,
     return instCombineSVEUxt(IC, II, 16);
   case Intrinsic::aarch64_sve_uxtw:
     return instCombineSVEUxt(IC, II, 32);
+  case Intrinsic::aarch64_sme_in_streaming_mode:
+    return instCombineInStreamingMode(IC, II);
   }
 
   return std::nullopt;
diff --git a/llvm/test/Transforms/InstCombine/AArch64/aarch64-sme-in-streaming-mode.ll b/llvm/test/Transforms/InstCombine/AArch64/aarch64-sme-in-streaming-mode.ll
new file mode 100644
index 0000000000000..c46f5c48429d3
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/AArch64/aarch64-sme-in-streaming-mode.ll
@@ -0,0 +1,38 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes=instcombine -mtriple aarch64 -mattr=+sme -S -o - < %s | FileCheck %s
+
+define i1 @test_in_streaming_mode_streaming_compatible() "aarch64_pstate_sm_compatible" {
+; CHECK-LABEL: define i1 @test_in_streaming_mode_streaming_compatible(
+; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:    [[SM:%.*]] = tail call i1 @llvm.aarch64.sme.in.streaming.mode()
+; CHECK-NEXT:    ret i1 [[SM]]
+;
+  %sm = tail call i1 @llvm.aarch64.sme.in.streaming.mode()
+  ret i1 %sm
+}
+
+define i1 @test_in_streaming_mode_streaming() "aarch64_pstate_sm_enabled" {
+; CHECK-LABEL: define i1 @test_in_streaming_mode_streaming(
+; CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
+; CHECK-NEXT:    ret i1 true
+;
+  %sm = tail call i1 @llvm.aarch64.sme.in.streaming.mode()
+  ret i1 %sm
+}
+define i1 @test_in_streaming_mode_streaming_body() "aarch64_pstate_sm_body" {
+; CHECK-LABEL: define i1 @test_in_streaming_mode_streaming_body(
+; CHECK-SAME: ) #[[ATTR2:[0-9]+]] {
+; CHECK-NEXT:    ret i1 true
+;
+  %sm = tail call i1 @llvm.aarch64.sme.in.streaming.mode()
+  ret i1 %sm
+}
+
+define i1 @test_in_streaming_mode_non_streaming() {
+; CHECK-LABEL: define i1 @test_in_streaming_mode_non_streaming(
+; CHECK-SAME: ) #[[ATTR3:[0-9]+]] {
+; CHECK-NEXT:    ret i1 false
+;
+  %sm = tail call i1 @llvm.aarch64.sme.in.streaming.mode()
+  ret i1 %sm
+}

@MacDue MacDue requested a review from efriedma-quic July 11, 2025 19:31
Copy link
Collaborator

@efriedma-quic efriedma-quic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Member Author

@MacDue MacDue left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Realized I missed an edge case of aarch64_pstate_sm_compatible + aarch64_pstate_sm_body:

@MacDue MacDue merged commit 43a9ec2 into llvm:main Jul 13, 2025
9 checks passed
@MacDue MacDue deleted the inst_combine branch July 13, 2025 12:20
@llvm-ci
Copy link
Collaborator

llvm-ci commented Jul 13, 2025

LLVM Buildbot has detected a new failure on builder amdgpu-offload-rhel-9-cmake-build-only running on rocm-docker-rhel-9 while building llvm at step 2 "update-annotated-scripts".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/205/builds/15320

Here is the relevant piece of the build log for the reference
Step 2 (update-annotated-scripts) failure: update (failure)
git version 2.43.5
fatal: unable to access 'https://github.com/llvm/llvm-zorg.git/': Could not resolve host: github.com
fatal: unable to access 'https://github.com/llvm/llvm-zorg.git/': Could not resolve host: github.com

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:AArch64 llvm:instcombine Covers the InstCombine, InstSimplify and AggressiveInstCombine passes llvm:transforms
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants