From 3ddc32292d35c73a39ef9c54a95bdf04717438f9 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Tue, 16 Dec 2014 18:05:28 +0000 Subject: [PATCH] [MC] Reset the MCInst in the matcher function before adding opcode/operands. On X86, the Intel asm parser tries to match all memory operand sizes when none is explicitly specified. For LEA, which doesn't really have a memory operand (just a pointer one), this results in multiple successful matches, one for each memory size. There's no error because it's same opcode, so really, it's just one match. However, the tablegen'd matcher function adds opcode/operands to the passed MCInst, and this results in multiple duplicated operands. This commit clears the MCInst in the tablegen'd matcher function. We sometimes clear it when the match failed, so there's no expectation of keeping the previous content anyway. Differential Revision: http://reviews.llvm.org/D6670 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224347 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/MC/X86/intel-syntax-unsized-memory.s | 3 +++ utils/TableGen/AsmMatcherEmitter.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/test/MC/X86/intel-syntax-unsized-memory.s b/test/MC/X86/intel-syntax-unsized-memory.s index 3467f8fb3e8..c9d8e2a5f7c 100644 --- a/test/MC/X86/intel-syntax-unsized-memory.s +++ b/test/MC/X86/intel-syntax-unsized-memory.s @@ -24,3 +24,6 @@ vmovdqa [rax], ymm0 // CHECK: vaddps (%rax), %zmm1, %zmm1 vaddps zmm1, zmm1, [rax] + +// CHECK: leal 1(%r15d), %r9d +lea r9d, [r15d+1] diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index 5b2ff6792d4..85312b13923 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -2965,6 +2965,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) { OS << " continue;\n"; OS << " }\n"; OS << "\n"; + OS << " Inst.clear();\n\n"; OS << " if (matchingInlineAsm) {\n"; OS << " Inst.setOpcode(it->Opcode);\n"; OS << " convertToMapAndConstraints(it->ConvertFn, Operands);\n";