[llvm] [X86] Reject a register where a memory operand displacement belongs (PR #216068)

Zane Hambly via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 21 22:00:04 PDT 2026


https://github.com/Zaneham updated https://github.com/llvm/llvm-project/pull/216068

>From b72f1f9f6b02d31c415beec1bc6d3689aacd68d6 Mon Sep 17 00:00:00 2001
From: ZaneHam <zanehambly at gmail.com>
Date: Thu, 13 Aug 2026 23:51:03 +1200
Subject: [PATCH] [X86] Reject a register where a memory operand displacement
 belongs

---
 llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp |  6 +++++-
 llvm/test/MC/X86/x86_errors.s                  | 13 +++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index f03b7408c8f30..be45659f144e0 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -3210,7 +3210,11 @@ bool X86AsmParser::ParseMemOperand(MCRegister SegReg, const MCExpr *Disp,
     if (!isAtMemOperand()) {
       if (Parser.parseTokenLoc(Loc) || Parser.parseExpression(Disp, EndLoc))
         return true;
-      assert(!isa<X86MCExpr>(Disp) && "Expected non-register here.");
+      // A register here is a second segment override, or a register standing
+      // where the displacement belongs.
+      if (isa<X86MCExpr>(Disp))
+        return Error(Loc, "unexpected register in memory operand",
+                     SMRange(Loc, EndLoc));
     } else {
       // Disp is implicitly zero if we haven't parsed it yet.
       Disp = MCConstantExpr::create(0, Parser.getContext());
diff --git a/llvm/test/MC/X86/x86_errors.s b/llvm/test/MC/X86/x86_errors.s
index 543575f38815a..1f65b00dfc61c 100644
--- a/llvm/test/MC/X86/x86_errors.s
+++ b/llvm/test/MC/X86/x86_errors.s
@@ -201,3 +201,16 @@ pbndkb
 
 // X86: error: register %r16d is only available in 64-bit mode
 movl %eax, %r16d
+
+// X86: error: unexpected register in memory operand
+// X64: error: unexpected register in memory operand
+movl $0, %cs:%ds:(%eax)
+
+// X86: error: unexpected register in memory operand
+// X64: error: unexpected register in memory operand
+movl $0, %cs:%eax
+
+.set reg, %eax
+// X86: error: unexpected register in memory operand
+// X64: error: unexpected register in memory operand
+movl $0, ((reg))



More information about the llvm-commits mailing list