From f5091625ffc2b9a0ef5bc32ac3664f26349ac045 Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Thu, 29 Aug 2019 13:19:38 +0000 Subject: [PATCH] [mips] Fix expanding `lw/sw $reg1, symbol($reg2)` instruction When a "base" in the `lw/sw $reg1, symbol($reg2)` instruction is a register and generated code is position independent, backend does not add the "base" value to the symbol address. ``` lw $reg1, %got(symbol)($gp) lw/sw $reg1, 0($reg1) ``` This patch fixes the bug and adds the missed `addu` instruction by passing `BaseReg` into the `loadAndAddSymbolAddress` routine and handles the case when the `BaseReg` is the zero register to escape redundant `move reg, reg` instruction: ``` lw $reg1, %got(symbol)($gp) addu $reg1, $reg1, $reg2 lw/sw $reg1, 0($reg1) ``` Differential Revision: https://reviews.llvm.org/D66894 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@370353 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 6 +++--- test/MC/Mips/mips-expansions.s | 4 ++-- test/MC/Mips/mips64-expansions.s | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 5e5f7279093..37c46b681eb 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -2870,7 +2870,8 @@ bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, const MCSubtargetInfo *STI) { // FIXME: These expansions do not respect -mxgot. MipsTargetStreamer &TOut = getTargetStreamer(); - bool UseSrcReg = SrcReg != Mips::NoRegister; + bool UseSrcReg = SrcReg != Mips::NoRegister && SrcReg != Mips::ZERO && + SrcReg != Mips::ZERO_64; warnIfNoMacro(IDLoc); if (inPicMode() && ABI.IsO32()) { @@ -3654,7 +3655,6 @@ void MipsAsmParser::expandMemInst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, if (OffsetOp.isExpr()) { if (inPicMode()) { // FIXME: - // a) Fix lw/sw $reg, symbol($reg) instruction expanding. // c) Check that immediates of R_MIPS_GOT16/R_MIPS_LO16 relocations // do not exceed 16-bit. // d) Use R_MIPS_GOT_PAGE/R_MIPS_GOT_OFST relocations instead @@ -3670,7 +3670,7 @@ void MipsAsmParser::expandMemInst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, return; } - loadAndAddSymbolAddress(Res.getSymA(), TmpReg, Mips::NoRegister, + loadAndAddSymbolAddress(Res.getSymA(), TmpReg, BaseReg, !ABI.ArePtrs64bit(), IDLoc, Out, STI); TOut.emitRRI(Inst.getOpcode(), DstReg, TmpReg, Res.getConstant(), IDLoc, STI); diff --git a/test/MC/Mips/mips-expansions.s b/test/MC/Mips/mips-expansions.s index 240e06868d4..f4f3b1f6cf6 100644 --- a/test/MC/Mips/mips-expansions.s +++ b/test/MC/Mips/mips-expansions.s @@ -112,13 +112,13 @@ lw $10, symbol($4) # CHECK-LE: lw $10, %got(symbol)($gp) # encoding: [A,A,0x8a,0x8f] # CHECK-LE: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT -# CHECK-LE-FIXME: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] +# CHECK-LE: addu $10, $10, $4 # encoding: [0x21,0x50,0x44,0x01] # CHECK-LE: lw $10, 0($10) # encoding: [0x00,0x00,0x4a,0x8d] .set at sw $10, symbol($9) # CHECK-LE: lw $1, %got(symbol)($gp) # encoding: [A,A,0x81,0x8f] # CHECK-LE: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT -# CHECK-LE-FIXME: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] +# CHECK-LE: addu $1, $1, $9 # encoding: [0x21,0x08,0x29,0x00] # CHECK-LE: sw $10, 0($1) # encoding: [0x00,0x00,0x2a,0xac] lw $8, 1f+8 diff --git a/test/MC/Mips/mips64-expansions.s b/test/MC/Mips/mips64-expansions.s index 5689c9ad8c9..044a90e34df 100644 --- a/test/MC/Mips/mips64-expansions.s +++ b/test/MC/Mips/mips64-expansions.s @@ -472,12 +472,12 @@ sym: lw $10, symbol($4) # CHECK: ld $10, %got_disp(symbol)($gp) # encoding: [A,A,0x8a,0xdf] # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP -# CHECK-FIXME: daddu $10, $10, $4 # encoding: [0x2d,0x50,0x44,0x01] +# CHECK: daddu $10, $10, $4 # encoding: [0x2d,0x50,0x44,0x01] # CHECK: lw $10, 0($10) # encoding: [0x00,0x00,0x4a,0x8d] sw $10, symbol($9) # CHECK: ld $1, %got_disp(symbol)($gp) # encoding: [A,A,0x81,0xdf] # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP -# CHECK-FIXME: daddu $1, $1, $9 # encoding: [0x2d,0x08,0x29,0x00] +# CHECK: daddu $1, $1, $9 # encoding: [0x2d,0x08,0x29,0x00] # CHECK: sw $10, 0($1) # encoding: [0x00,0x00,0x2a,0xac] lw $8, sym+8 -- 2.50.1