[llvm] [AArch64] Add A57 schedule model for CAS instructions (PR #211195)
Andrew Savonichev via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 22 01:02:22 PDT 2026
https://github.com/asavonic created https://github.com/llvm/llvm-project/pull/211195
CAS instructions (B, H, W, X variants) are not described in the ARM Cortex-A57 Software Optimization Guide. There used to be no schedule model for them, so `llvm-mca` was unable to analyze code containing these instructions:
llvm-mca -mtriple=aarch64 -mcpu=cortex-a57 -mattr=+lse casb.s
error: found an unsupported instruction in the input assembly
sequence, use -skip-unsupported-instructions=lack-sched to ignore
these on the input.
note: instruction: casb w0, w1, [sp]
The patch adds a basic schedule model of 14 cycles (as measured on Cortex-A78 with llvm-exegesis) and L/S utilized pipelines (this is a guess, the reality is likely more complicated).
>From 431bdbecabdc8ca18e80f7832a249d3f4b9c82aa Mon Sep 17 00:00:00 2001
From: Andrew Savonichev <andrew.savonichev at gmail.com>
Date: Wed, 22 Jul 2026 16:51:05 +0900
Subject: [PATCH] [AArch64] Add A57 schedule model for CAS instructions
CAS instructions (B, H, W, X variants) are not described in the ARM
Cortex-A57 Software Optimization Guide. There used to be no schedule
model for them, so `llvm-mca` was unable to analyze code containing
these instructions:
llvm-mca -mtriple=aarch64 -mcpu=cortex-a57 -mattr=+lse casb.s
error: found an unsupported instruction in the input assembly
sequence, use -skip-unsupported-instructions=lack-sched to ignore
these on the input.
note: instruction: casb w0, w1, [sp]
The patch adds a basic schedule model of 14 cycles (as measured on
Cortex-A78 with llvm-exegesis) and L/S utilized pipelines (this is a
guess, the reality is likely more complicated).
---
llvm/lib/Target/AArch64/AArch64SchedA57.td | 4 +
.../Target/AArch64/AArch64SchedA57WriteRes.td | 3 +
.../tools/llvm-mca/AArch64/Cortex/A57-cas.s | 78 +++++++++++++++++++
3 files changed, 85 insertions(+)
create mode 100644 llvm/test/tools/llvm-mca/AArch64/Cortex/A57-cas.s
diff --git a/llvm/lib/Target/AArch64/AArch64SchedA57.td b/llvm/lib/Target/AArch64/AArch64SchedA57.td
index 9260379fb5b27..dcc793966abed 100644
--- a/llvm/lib/Target/AArch64/AArch64SchedA57.td
+++ b/llvm/lib/Target/AArch64/AArch64SchedA57.td
@@ -690,5 +690,9 @@ def : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRWpre)>;
def : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpost)>;
def : InstRW<[WriteAdr, A57Write_1cyc_1I_1S, ReadAdrBase], (instrs STRXpre)>;
def : InstRW<[A57Write_2cyc_2S], (instrs STURQi)>;
+def : InstRW<[A57Write_14cyc_1L_1S], (instrs CASB, CASH, CASW, CASX)>;
+def : InstRW<[A57Write_14cyc_1L_1S], (instrs CASAB, CASAH, CASAW, CASAX)>;
+def : InstRW<[A57Write_14cyc_1L_1S], (instrs CASLB, CASLH, CASLW, CASLX)>;
+def : InstRW<[A57Write_14cyc_1L_1S], (instrs CASALB, CASALH, CASALW, CASALX)>;
} // SchedModel = CortexA57Model
diff --git a/llvm/lib/Target/AArch64/AArch64SchedA57WriteRes.td b/llvm/lib/Target/AArch64/AArch64SchedA57WriteRes.td
index fd16e98bff805..3883325d1b870 100644
--- a/llvm/lib/Target/AArch64/AArch64SchedA57WriteRes.td
+++ b/llvm/lib/Target/AArch64/AArch64SchedA57WriteRes.td
@@ -190,6 +190,9 @@ def A57Write_4cyc_2X : SchedWriteRes<[A57UnitX, A57UnitX]> {
let Latency = 4;
let NumMicroOps = 2;
}
+def A57Write_14cyc_1L_1S : SchedWriteRes<[A57UnitL, A57UnitS]> {
+ let Latency = 14;
+}
//===----------------------------------------------------------------------===//
diff --git a/llvm/test/tools/llvm-mca/AArch64/Cortex/A57-cas.s b/llvm/test/tools/llvm-mca/AArch64/Cortex/A57-cas.s
new file mode 100644
index 0000000000000..c00860e6eb1b6
--- /dev/null
+++ b/llvm/test/tools/llvm-mca/AArch64/Cortex/A57-cas.s
@@ -0,0 +1,78 @@
+# NOTE: Assertions have been autogenerated by utils/update_mca_test_checks.py
+# RUN: llvm-mca -mtriple=aarch64 -mcpu=cortex-a57 -mattr=+lse -instruction-tables < %s | FileCheck %s
+
+caslb w0, w1, [sp]
+casalb w0, w1, [sp]
+casab w0, w1, [sp]
+casb w0, w1, [sp]
+casal w0, w1, [sp]
+casa w0, w1, [sp]
+casl w0, w1, [sp]
+cas w0, w1, [sp]
+casah w0, w1, [sp]
+casalh w0, w1, [sp]
+caslh w0, w1, [sp]
+cash w0, w1, [sp]
+casal x0, x1, [sp]
+casl x0, x1, [sp]
+cas x0, x1, [sp]
+casa x0, x1, [sp]
+
+# CHECK: Instruction Info:
+# CHECK-NEXT: [1]: #uOps
+# CHECK-NEXT: [2]: Latency
+# CHECK-NEXT: [3]: RThroughput
+# CHECK-NEXT: [4]: MayLoad
+# CHECK-NEXT: [5]: MayStore
+# CHECK-NEXT: [6]: HasSideEffects (U)
+
+# CHECK: [1] [2] [3] [4] [5] [6] Instructions:
+# CHECK-NEXT: 1 14 1.00 * * U caslb w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casalb w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casab w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casb w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casal w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casa w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casl w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U cas w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casah w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casalh w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U caslh w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U cash w0, w1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casal x0, x1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casl x0, x1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U cas x0, x1, [sp]
+# CHECK-NEXT: 1 14 1.00 * * U casa x0, x1, [sp]
+
+# CHECK: Resources:
+# CHECK-NEXT: [0] - A57UnitB
+# CHECK-NEXT: [1.0] - A57UnitI
+# CHECK-NEXT: [1.1] - A57UnitI
+# CHECK-NEXT: [2] - A57UnitL
+# CHECK-NEXT: [3] - A57UnitM
+# CHECK-NEXT: [4] - A57UnitS
+# CHECK-NEXT: [5] - A57UnitW
+# CHECK-NEXT: [6] - A57UnitX
+
+# CHECK: Resource pressure per iteration:
+# CHECK-NEXT: [0] [1.0] [1.1] [2] [3] [4] [5] [6]
+# CHECK-NEXT: - - - 16.00 - 16.00 - -
+
+# CHECK: Resource pressure by instruction:
+# CHECK-NEXT: [0] [1.0] [1.1] [2] [3] [4] [5] [6] Instructions:
+# CHECK-NEXT: - - - 1.00 - 1.00 - - caslb w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casalb w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casab w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casb w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casal w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casa w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casl w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - cas w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casah w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casalh w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - caslh w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - cash w0, w1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casal x0, x1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casl x0, x1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - cas x0, x1, [sp]
+# CHECK-NEXT: - - - 1.00 - 1.00 - - casa x0, x1, [sp]
More information about the llvm-commits
mailing list