From baac63de04e896925d6de3bc6f1f9f871196e620 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Fri, 25 Jan 2019 09:14:05 +0000 Subject: [PATCH] [MSP430] Fix absolute addressing mode printing in AsmPrinter Align checks for absolute addressing mode with its current implementation (SR is used as a base register). This fixes https://bugs.llvm.org/show_bug.cgi?id=39993 Patch by Kristina Bessonova! Differential Revision: https://reviews.llvm.org/D56785 llvm-svn: 352178 --- llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp | 4 ++-- .../MSP430/inline-asm-absolute-addressing.ll | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/MSP430/inline-asm-absolute-addressing.ll diff --git a/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp b/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp index 5e9b108c2de3a..fd03b8c4b3284 100644 --- a/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp +++ b/llvm/lib/Target/MSP430/MSP430AsmPrinter.cpp @@ -114,12 +114,12 @@ void MSP430AsmPrinter::printSrcMemOperand(const MachineInstr *MI, int OpNum, // Print displacement first // Imm here is in fact global address - print extra modifier. - if (Disp.isImm() && !Base.getReg()) + if (Disp.isImm() && Base.getReg() == MSP430::SR) O << '&'; printOperand(MI, OpNum+1, O, "nohash"); // Print register base field - if (Base.getReg()) { + if (Base.getReg() != MSP430::SR && Base.getReg() != MSP430::PC) { O << '('; printOperand(MI, OpNum, O); O << ')'; diff --git a/llvm/test/CodeGen/MSP430/inline-asm-absolute-addressing.ll b/llvm/test/CodeGen/MSP430/inline-asm-absolute-addressing.ll new file mode 100644 index 0000000000000..91505dca48ddf --- /dev/null +++ b/llvm/test/CodeGen/MSP430/inline-asm-absolute-addressing.ll @@ -0,0 +1,15 @@ +; RUN: llc < %s | FileCheck %s + +; Check that absolute addressing mode is represented in a way +; defined in MSP430 EABI and not as indexed addressing mode form. +; See PR39993 for details. + +target datalayout = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-n8:16" +target triple = "msp430-elf" + +define void @f() { +entry: +; CHECK: mov r1, &256 + call void asm sideeffect "mov r1, $0", "*m"(i8* inttoptr (i16 256 to i8*)) + ret void +}