Index: lib/Target/X86/AsmParser/X86AsmParser.cpp =================================================================== --- lib/Target/X86/AsmParser/X86AsmParser.cpp +++ lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -558,7 +558,11 @@ State = IES_INTEGER; Sym = SymRef; SymName = SymRefName; - IC.pushOperand(IC_IMM); + if (Sym->getKind() == llvm::MCExpr::Constant) { + auto *Constant = cast(SymRef); + IC.pushOperand(IC_IMM, Constant->getValue()); + } else + IC.pushOperand(IC_IMM); break; } } @@ -1504,9 +1508,10 @@ End); } - if (SM.getImm() || !Disp) { + int64_t ImmVal = SM.getImm(); + if (ImmVal || !Disp) { const MCExpr *Imm = MCConstantExpr::create(SM.getImm(), getContext()); - if (Disp) + if (Disp && ImmVal && Disp->getKind() == llvm::MCExpr::SymbolRef) Disp = MCBinaryExpr::createAdd(Disp, Imm, getContext()); else Disp = Imm; // An immediate displacement only. Index: test/MC/X86/intel-syntax.s =================================================================== --- test/MC/X86/intel-syntax.s +++ test/MC/X86/intel-syntax.s @@ -6,7 +6,19 @@ xor EAX, EAX ret +.set number, 33 + _main: +// CHECK: leaq -33(%rax), %rdx +// CHECK: leaq -33(%rax), %rdx +// CHECK: leaq 33(%rax), %rdx +// CHECK: leaq 33(%rax), %rdx + + lea rdx, [rax - 33] + lea rdx, [rax - number] + lea rdx, [rax + number] + lea rdx, [number + rax] + // CHECK: movl $257, -4(%rsp) mov DWORD PTR [RSP - 4], 257 // CHECK: movl $258, 4(%rsp)