From cf2f4b32512f2c5fdd2e39aa1bbb76a563afd19d Mon Sep 17 00:00:00 2001 From: Zhan Jun Liau Date: Thu, 18 Aug 2016 21:44:15 +0000 Subject: [PATCH] [SystemZ] Use valid base/index regs for inline asm Summary: Inline asm memory constraints can have the base or index register be assigned to %r0 right now. Make sure that we assign only ADDR64 registers to the base and index. Reviewers: uweigand Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D23367 llvm-svn: 279157 --- llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp | 23 +++++++++++++++++++++++ llvm/test/CodeGen/SystemZ/asm-02.ll | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp b/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp index c74d396..5677fda 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp @@ -1375,6 +1375,29 @@ SelectInlineAsmMemoryOperand(const SDValue &Op, } if (selectBDXAddr(Form, DispRange, Op, Base, Disp, Index)) { + const TargetRegisterClass *TRC = + Subtarget->getRegisterInfo()->getPointerRegClass(*MF); + SDLoc DL(Base); + SDValue RC = CurDAG->getTargetConstant(TRC->getID(), DL, MVT::i32); + + // Make sure that the base address doesn't go into %r0. + // If it's a TargetFrameIndex or a fixed register, we shouldn't do anything. + if (Base.getOpcode() != ISD::TargetFrameIndex && + Base.getOpcode() != ISD::Register) { + Base = + SDValue(CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS, + DL, Base.getValueType(), + Base, RC), 0); + } + + // Make sure that the index register isn't assigned to %r0 either. + if (Index.getOpcode() != ISD::Register) { + Index = + SDValue(CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS, + DL, Index.getValueType(), + Index, RC), 0); + } + OutOps.push_back(Base); OutOps.push_back(Disp); OutOps.push_back(Index); diff --git a/llvm/test/CodeGen/SystemZ/asm-02.ll b/llvm/test/CodeGen/SystemZ/asm-02.ll index 426d848..c916d82 100644 --- a/llvm/test/CodeGen/SystemZ/asm-02.ll +++ b/llvm/test/CodeGen/SystemZ/asm-02.ll @@ -74,8 +74,8 @@ define void @f6(i64 %base, i64 %index) { ; Check that LAY is used if there is an index but the displacement is too large define void @f7(i64 %base, i64 %index) { ; CHECK-LABEL: f7: -; CHECK: lay %r0, 4096(%r3,%r2) -; CHECK: blah 0(%r0) +; CHECK: lay %r1, 4096(%r3,%r2) +; CHECK: blah 0(%r1) ; CHECK: br %r14 %add = add i64 %base, 4096 %addi = add i64 %add, %index -- 2.7.4