[llvm] fcf4bb1 - [AArch64] Relax SDep requirement for AppleSMECompute clustering (#212603)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 30 04:32:58 PDT 2026


Author: Tomer Shafir
Date: 2026-07-30T14:32:53+03:00
New Revision: fcf4bb1af7450f618504201610ef8c3ef52844d7

URL: https://github.com/llvm/llvm-project/commit/fcf4bb1af7450f618504201610ef8c3ef52844d7
DIFF: https://github.com/llvm/llvm-project/commit/fcf4bb1af7450f618504201610ef8c3ef52844d7.diff

LOG: [AArch64] Relax SDep requirement for AppleSMECompute clustering      (#212603)

Do not require RAW dependency for FuseAppleSMECompute.

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/AArch64MacroFusion.cpp
    llvm/test/CodeGen/AArch64/misched-fusion-apple-sme-compute.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp b/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp
index aa742793a0f1a..c367b65cd28f9 100644
--- a/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp
+++ b/llvm/lib/Target/AArch64/AArch64MacroFusion.cpp
@@ -674,12 +674,23 @@ static bool shouldScheduleAdjacent(const TargetInstrInfo &TII,
                                    const MachineInstr *FirstMI,
                                    const MachineInstr &SecondMI,
                                    const SDep *Dep) {
-  if (isNonDataDep(Dep))
-    return false;
   const AArch64Subtarget &ST = static_cast<const AArch64Subtarget&>(TSI);
+  const TargetRegisterInfo *TRI = TSI.getRegisterInfo();
 
   // All checking functions assume that the 1st instr is a wildcard if it is
   // unspecified.
+
+  // FuseAppleSMECompute does not require a specific dependency kind
+  if (ST.hasFuseAppleSMECompute() &&
+      isAppleSMEComputePair(FirstMI, SecondMI, TII, TRI)) {
+    ++NumFusedAppleSMECompute;
+    return true;
+  }
+
+  // All the other fusions require RAW dependency
+  if (isNonDataDep(Dep))
+    return false;
+
   if (ST.hasCmpBccFusion() || ST.hasArithmeticBccFusion()) {
     bool CmpOnly = !ST.hasArithmeticBccFusion();
     if (isArithmeticBccPair(FirstMI, SecondMI, CmpOnly)) {
@@ -732,12 +743,6 @@ static bool shouldScheduleAdjacent(const TargetInstrInfo &TII,
     ++NumFusedAddSub2RegAndConstOne;
     return true;
   }
-  const TargetRegisterInfo *TRI = TSI.getRegisterInfo();
-  if (ST.hasFuseAppleSMECompute() &&
-      isAppleSMEComputePair(FirstMI, SecondMI, TII, TRI)) {
-    ++NumFusedAppleSMECompute;
-    return true;
-  }
   if (ST.hasFuseFMinFMax() && isFMinFMaxPair(FirstMI, SecondMI)) {
     ++NumFusedFMinFMax;
     return true;

diff  --git a/llvm/test/CodeGen/AArch64/misched-fusion-apple-sme-compute.mir b/llvm/test/CodeGen/AArch64/misched-fusion-apple-sme-compute.mir
index 72e5087c71519..15f166eddeebf 100644
--- a/llvm/test/CodeGen/AArch64/misched-fusion-apple-sme-compute.mir
+++ b/llvm/test/CodeGen/AArch64/misched-fusion-apple-sme-compute.mir
@@ -179,3 +179,23 @@ body:             |
     $za = FMLA_VG2_M2ZZ_S $za, $w8, 0, $z0_z1, $z2
     RET undef $lr
 ...
+
+## SME fusion doesnt require RAW dependency. This is a representative test case for Z write
+
+# CHECK-LABEL: fuse_non_raw
+# CHECK: SU({{[0-9]+}}): $z0 = ADD_ZZZ_S $z1, $z2
+# CHECK: Successors:
+# FUSE: SU({{[0-9]+}}): Ord  Latency={{[0-9]+}} Cluster
+# NOFUSE-NOT: SU({{[0-9]+}}): Ord  Latency={{[0-9]+}} Cluster
+# CHECK: SU({{[0-9]+}}): $z0 = ADD_ZZZ_S $z3, $z4
+---
+name:            fuse_non_raw
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $z1, $z2, $z3, $z4, $w2
+    $z0 = ADD_ZZZ_S $z1, $z2
+    $w3 = ORRWri $w2, 4096
+    $z0 = ADD_ZZZ_S $z3, $z4
+    RET undef $lr
+...


        


More information about the llvm-commits mailing list