[llvm] Validate immediates for SCVTF, UCVTF and EXT (PR #214233)
Hamza Khan via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 11 02:32:53 PDT 2026
https://github.com/HamzaKodez updated https://github.com/llvm/llvm-project/pull/214233
>From f89da748dd80eacaec4418d78c8415f7adaa16da Mon Sep 17 00:00:00 2001
From: Hamza Khan <hamza.khan at arm.com>
Date: Thu, 23 Jul 2026 13:51:00 +0100
Subject: [PATCH] Validate EXT byte-index immediates
Reject symbolic and out-of-range byte-index operands for AArch64 EXT instructions instead of silently encoding invalid values.
Add MC regression coverage for invalid operands and valid boundary values.
Assisted-by: ChatGPT; human-reviewed, debugged, tested, and validated by the author.
---
llvm/lib/Target/AArch64/AArch64InstrFormats.td | 8 ++++----
llvm/test/MC/AArch64/neon-diagnostics.s | 15 +++++++++++++++
llvm/test/MC/AArch64/neon-extract.s | 4 ++++
3 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index a4d5c0d97c8ce..68c80f5d112ae 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -7686,8 +7686,8 @@ multiclass SIMDWideThreeVectorBHS<bit U, bits<4> opc, string asm,
//----------------------------------------------------------------------------
class BaseSIMDBitwiseExtract<bit size, RegisterOperand regtype, ValueType vty,
- string asm, string kind>
- : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, i32imm:$imm), asm,
+ Operand immtype, string asm, string kind>
+ : I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, immtype:$imm), asm,
"{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # ", $imm" #
"|" # kind # "\t$Rd, $Rn, $Rm, $imm}", "",
[(set (vty regtype:$Rd),
@@ -7710,10 +7710,10 @@ class BaseSIMDBitwiseExtract<bit size, RegisterOperand regtype, ValueType vty,
multiclass SIMDBitwiseExtract<string asm> {
- def v8i8 : BaseSIMDBitwiseExtract<0, V64, v8i8, asm, ".8b"> {
+ def v8i8 : BaseSIMDBitwiseExtract<0, V64, v8i8, imm32_0_7, asm, ".8b"> {
let imm{3} = 0;
}
- def v16i8 : BaseSIMDBitwiseExtract<1, V128, v16i8, asm, ".16b">;
+ def v16i8 : BaseSIMDBitwiseExtract<1, V128, v16i8, imm32_0_15, asm, ".16b">;
}
//----------------------------------------------------------------------------
diff --git a/llvm/test/MC/AArch64/neon-diagnostics.s b/llvm/test/MC/AArch64/neon-diagnostics.s
index 2610f4acf383b..cfcbf7e336a86 100644
--- a/llvm/test/MC/AArch64/neon-diagnostics.s
+++ b/llvm/test/MC/AArch64/neon-diagnostics.s
@@ -6418,6 +6418,21 @@
// CHECK-ERROR: ext v0.2d, v1.2d, v2.2d, #0x0
// CHECK-ERROR: ^
+ // Symbolic operands are not valid byte-index immediates.
+ ext v0.8b, v1.8b, v2.8b, f0
+// CHECK-ERROR: [[@LINE-1]]:34: error: immediate must be an integer in range [0, 7].
+ ext v0.16b, v1.16b, v2.16b, f0
+// CHECK-ERROR: [[@LINE-1]]:37: error: immediate must be an integer in range [0, 15].
+ ext v0.8b, v1.8b, v2.8b, NaN
+// CHECK-ERROR: [[@LINE-1]]:34: error: immediate must be an integer in range [0, 7].
+ ext v0.8b, v1.8b, v2.8b, Inf
+// CHECK-ERROR: [[@LINE-1]]:34: error: immediate must be an integer in range [0, 7].
+
+ // Out-of-range byte-index immediates must be rejected.
+ ext v0.8b, v1.8b, v2.8b, #8
+// CHECK-ERROR: [[@LINE-1]]:34: error: immediate must be an integer in range [0, 7].
+ ext v0.16b, v1.16b, v2.16b, #16
+// CHECK-ERROR: [[@LINE-1]]:37: error: immediate must be an integer in range [0, 15].
//----------------------------------------------------------------------
// Permutation with 3 vectors
diff --git a/llvm/test/MC/AArch64/neon-extract.s b/llvm/test/MC/AArch64/neon-extract.s
index 1daa46d096eee..f37bc0ec3e67d 100644
--- a/llvm/test/MC/AArch64/neon-extract.s
+++ b/llvm/test/MC/AArch64/neon-extract.s
@@ -8,6 +8,10 @@
ext v0.8b, v1.8b, v2.8b, #0x3
ext v0.16b, v1.16b, v2.16b, #0x3
+ ext v0.8b, v1.8b, v2.8b, #7
+ ext v0.16b, v1.16b, v2.16b, #15
// CHECK: ext v0.8b, v1.8b, v2.8b, #{{0x3|3}} // encoding: [0x20,0x18,0x02,0x2e]
// CHECK: ext v0.16b, v1.16b, v2.16b, #{{0x3|3}} // encoding: [0x20,0x18,0x02,0x6e]
+// CHECK: ext v0.8b, v1.8b, v2.8b, #7 // encoding: [0x20,0x38,0x02,0x2e]
+// CHECK: ext v0.16b, v1.16b, v2.16b, #15 // encoding: [0x20,0x78,0x02,0x6e]
\ No newline at end of file
More information about the llvm-commits
mailing list