]> granicus.if.org Git - llvm/commitdiff
[MSP430] Fix absolute addressing mode printing in AsmPrinter
authorAnton Korobeynikov <anton@korobeynikov.info>
Fri, 25 Jan 2019 09:14:05 +0000 (09:14 +0000)
committerAnton Korobeynikov <anton@korobeynikov.info>
Fri, 25 Jan 2019 09:14:05 +0000 (09:14 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352178 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/MSP430/MSP430AsmPrinter.cpp
test/CodeGen/MSP430/inline-asm-absolute-addressing.ll [new file with mode: 0644]

index fda42106ba2b5c1d523b7b618ed5750b5d3352a7..4a3f58d67352abe84758fd4efca147a74602c4eb 100644 (file)
@@ -113,12 +113,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/test/CodeGen/MSP430/inline-asm-absolute-addressing.ll b/test/CodeGen/MSP430/inline-asm-absolute-addressing.ll
new file mode 100644 (file)
index 0000000..91505dc
--- /dev/null
@@ -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
+}