Skip to content

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

MacDue added a commit that referenced this pull request Jul 29, 2025
…0917)

This is handled by the instcombine added in #147930; there is no need
for any clang-specific folding. NFC as all clang tests for
`__arm_in_streaming_mode()` used -O1, which applies the LLVM
instcombines.
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