[llvm-branch-commits] [llvm] [AArch64][llvm] Fix constant expressions in CMPBR immediate aliases (PR #230050)
Jonathan Thackray via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Oct 8 03:23:38 PDT 2026
https://github.com/jthackray created https://github.com/llvm/llvm-project/pull/230050
Use the standard immediate parser for CMPBR aliases so that parenthesized
expressions and explicit unary plus are accepted. This also simplifies
the amount of code required, since we can remove `tryParseAdjImm0_63`,
and reuse code in `AdjImmAsmOperand` which does the same job.
Check immediates in their original ranges and apply the adjustment
when rendering MC operands. Add coverage for constant expressions in
`cbge`, `cbhs`, `cble` and `cbls`.
---
<sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>
>From 09ad028272f2bf8b332921da138f53676e337f86 Mon Sep 17 00:00:00 2001
From: Jonathan Thackray <jonathan.thackray at arm.com>
Date: Fri, 2 Oct 2026 11:52:02 +0100
Subject: [PATCH] [AArch64][llvm] Fix constant expressions in CMPBR immediate
aliases
Use the standard immediate parser for CMPBR aliases so that parenthesized
expressions and explicit unary plus are accepted. This also simplifies
the amount of code required, since we can remove `tryParseAdjImm0_63`,
and reuse code in `AdjImmAsmOperand` which does the same job.
Check immediates in their original ranges and apply the adjustment
when rendering MC operands. Add coverage for constant expressions in
`cbge`, `cbhs`, `cble` and `cbls`.
---
.../lib/Target/AArch64/AArch64InstrFormats.td | 36 +++++++------------
.../AArch64/AsmParser/AArch64AsmParser.cpp | 30 ----------------
llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s | 13 +++++++
3 files changed, 26 insertions(+), 53 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 754e4444cf0dcc..b87bf6ade0acc5 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -470,6 +470,15 @@ def uimm6_32b : Operand<i32>, ImmLeaf<i32, [{ return Imm >= 0 && Imm < 64; }]> {
let OperandType = "OPERAND_IMMEDIATE";
}
+class AdjImmAsmOperand<string name, string diagnostic, int adjustment,
+ int low, int high> : AsmOperandClass {
+ let Name = name;
+ let DiagnosticType = diagnostic;
+ let RenderMethod = "addAdjImmOperands<" # adjustment # ">";
+ let PredicateMethod = "isImmInRange<" # !sub(low, adjustment) # "," #
+ !sub(high, adjustment) # ">";
+}
+
def CmpBranchUImm6Operand_32b
: ComplexPattern<i32, 1, "SelectCmpBranchUImm6Operand", [imm]> {
let WantsParent = true;
@@ -486,21 +495,11 @@ def CmpBranchBExtOperand
def CmpBranchHExtOperand
: ComplexPattern<i32, 2, "SelectCmpBranchExtOperand<false>", []> {}
-def UImm6Plus1Operand : AsmOperandClass {
- let Name = "UImm6P1";
- let DiagnosticType = "InvalidImm1_64";
- let RenderMethod = "addImmOperands";
- let ParserMethod = "tryParseAdjImm0_63<-1>";
- let PredicateMethod = "isImmInRange<0,63>";
-}
+def UImm6Plus1Operand
+ : AdjImmAsmOperand<"UImm6P1", "InvalidImm1_64", -1, 0, 63>;
-def UImm6Minus1Operand : AsmOperandClass {
- let Name = "UImm6M1";
- let DiagnosticType = "InvalidImmM1_62";
- let RenderMethod = "addImmOperands";
- let ParserMethod = "tryParseAdjImm0_63<1>";
- let PredicateMethod = "isImmInRange<0,63>";
-}
+def UImm6Minus1Operand
+ : AdjImmAsmOperand<"UImm6M1", "InvalidImmM1_62", 1, 0, 63>;
def uimm6p1_32b : Operand<i32> {
let ParserMatchClass = UImm6Plus1Operand;
@@ -527,15 +526,6 @@ def uimm9 : Operand<i64> {
let OperandType = "OPERAND_IMMEDIATE";
}
-class AdjImmAsmOperand<string name, string diagnostic, int adjustment,
- int low, int high> : AsmOperandClass {
- let Name = name;
- let DiagnosticType = diagnostic;
- let RenderMethod = "addAdjImmOperands<" # adjustment # ">";
- let PredicateMethod = "isImmInRange<" # !sub(low, adjustment) # "," #
- !sub(high, adjustment) # ">";
-}
-
def uimm9p1 : Operand<i64> {
let ParserMatchClass =
AdjImmAsmOperand<"UImm9P1", "InvalidImm1_512", -1, 0, 511>;
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 412d4f16bc98b0..a904efc8f0612e 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -296,7 +296,6 @@ class AArch64AsmParser : public MCTargetAsmParser {
ParseStatus tryParseSVEVecLenSpecifier(OperandVector &Operands);
ParseStatus tryParseGPR64x8(OperandVector &Operands);
ParseStatus tryParseImmRange(OperandVector &Operands);
- template <int> ParseStatus tryParseAdjImm0_63(OperandVector &Operands);
public:
enum AArch64MatchResultTy {
@@ -8797,32 +8796,3 @@ ParseStatus AArch64AsmParser::tryParseImmRange(OperandVector &Operands) {
AArch64Operand::CreateImmRange(ImmFVal, ImmLVal, S, E, getContext()));
return ParseStatus::Success;
}
-
-template <int Adj>
-ParseStatus AArch64AsmParser::tryParseAdjImm0_63(OperandVector &Operands) {
- SMLoc S = getLoc();
-
- parseOptionalToken(AsmToken::Hash);
-
- if (getTok().isNot(AsmToken::Integer) && getTok().isNot(AsmToken::Minus))
- return ParseStatus::NoMatch;
-
- int64_t Imm;
- if (parseImmExpr(Imm))
- return ParseStatus::Failure;
-
- // We want an adjusted immediate in the range [0, 63]. If we don't have one,
- // return a value, which is certain to trigger a error message about invalid
- // immediate range instead of a non-descriptive invalid operand error.
- static_assert(Adj == 1 || Adj == -1, "Unsafe immediate adjustment");
- if (Imm == INT64_MIN || Imm == INT64_MAX || Imm + Adj < 0 || Imm + Adj > 63)
- Imm = -2;
- else
- Imm += Adj;
-
- SMLoc E = SMLoc::getFromPointer(getLoc().getPointer() - 1);
- Operands.push_back(AArch64Operand::CreateImm(
- MCConstantExpr::create(Imm, getContext()), S, E, getContext()));
-
- return ParseStatus::Success;
-}
diff --git a/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s b/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s
index b7ec31d51a4263..8985a574ace80b 100644
--- a/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s
+++ b/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s
@@ -72,3 +72,16 @@
// CHECK: cbgt x5, x3, #-1024 // encoding: [0x05,0x20,0x03,0xf4]
cblt x3, x5, #-1024
+// Constant expressions in adjusted immediate aliases.
+
+// CHECK: cbgt w5, #0, #-1024 // encoding: [0x05,0x20,0x00,0x75]
+ cbge w5, #(2 - 1), #-1024
+
+// CHECK: cbhi x5, #63, #-1024 // encoding: [0x05,0xa0,0x5f,0xf5]
+ cbhs x5, #+64, #-1024
+
+// CHECK: cblt w5, #0, #-1024 // encoding: [0x05,0x20,0x20,0x75]
+ cble w5, #(-1), #-1024
+
+// CHECK: cblo x5, #63, #-1024 // encoding: [0x05,0xa0,0x7f,0xf5]
+ cbls x5, #+62, #-1024
More information about the llvm-branch-commits
mailing list