From d39e9dca1b757b7d7da53892cf6ef7e837ca45ca Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Thu, 9 Nov 2017 16:31:57 +0000 Subject: [PATCH] [SystemZ] Add support for the "o" inline asm constraint We don't really need any special handling of "offsettable" memory addresses, but since some existing code uses inline asm statements with the "o" constraint, add support for this constraint for compatibility purposes. llvm-svn: 317807 --- llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp | 3 +++ llvm/lib/Target/SystemZ/SystemZISelLowering.h | 2 ++ llvm/test/CodeGen/SystemZ/asm-05.ll | 10 ++++++++++ 3 files changed, 15 insertions(+) diff --git a/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp b/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp index cd2f708..6ad8932 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp @@ -1379,8 +1379,11 @@ SelectInlineAsmMemoryOperand(const SDValue &Op, break; case InlineAsm::Constraint_T: case InlineAsm::Constraint_m: + case InlineAsm::Constraint_o: // Accept an address with a long displacement and an index. // m works the same as T, as this is the most general case. + // We don't really have any special handling of "offsettable" + // memory addresses, so just treat o the same as m. Form = SystemZAddressingMode::FormBDXNormal; DispRange = SystemZAddressingMode::Disp20Only; break; diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.h b/llvm/lib/Target/SystemZ/SystemZISelLowering.h index e2e27d9..099b442 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.h +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.h @@ -426,6 +426,8 @@ public: switch(ConstraintCode[0]) { default: break; + case 'o': + return InlineAsm::Constraint_o; case 'Q': return InlineAsm::Constraint_Q; case 'R': diff --git a/llvm/test/CodeGen/SystemZ/asm-05.ll b/llvm/test/CodeGen/SystemZ/asm-05.ll index 9b23ac7..832ae2f 100644 --- a/llvm/test/CodeGen/SystemZ/asm-05.ll +++ b/llvm/test/CodeGen/SystemZ/asm-05.ll @@ -1,4 +1,5 @@ ; Test the "m" asm constraint, which is equivalent to "T". +; Likewise for the "o" asm constraint. ; ; RUN: llc < %s -mtriple=s390x-linux-gnu -no-integrated-as | FileCheck %s @@ -10,3 +11,12 @@ define void @f1(i64 %base) { call void asm "blah $0", "=*m" (i64 *%addr) ret void } + +define void @f2(i64 %base) { +; CHECK-LABEL: f2: +; CHECK: blah 0(%r2) +; CHECK: br %r14 + %addr = inttoptr i64 %base to i64 * + call void asm "blah $0", "=*o" (i64 *%addr) + ret void +} -- 2.7.4