Skip to content

Commit ee5af50

Browse files
committed
[mips] Fix JmpLink to texternalsym and tglobaladdr on mcroMIPS R6
There is not match for the `MipsJmpLink texternalsym` and `MipsJmpLink tglobaladdr` patterns for microMIPS R6. As a result LLVM incorrectly selects the `JALRC16` compact 2-byte instruction which takes a target instruction address from a register only and assign `R_MIPS_32` relocation for this instruction. This relocation completely overwrites `JALRC16` and nearby instructions. This patch adds missed matching patterns, selects `BALC` instruction and assign a correct `R_MICROMIPS_PC26_S1` relocation. Differential Revision: https://reviews.llvm.org/D64552 llvm-svn: 365870
1 parent 27ed1c5 commit ee5af50

File tree

6 files changed

+39
-16
lines changed

6 files changed

+39
-16
lines changed

llvm/lib/Target/Mips/MicroMips32r6InstrInfo.td

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,19 @@ let AddedComplexity = 41 in {
17741774
def : StoreRegImmPat<SDC1_D64_MMR6, f64>, FGR_64, ISA_MICROMIPS32R6;
17751775
}
17761776

1777+
let isCall=1, hasDelaySlot=0, isCTI=1, Defs = [RA] in {
1778+
class JumpLinkMMR6<Instruction JumpInst, DAGOperand Opnd> :
1779+
PseudoSE<(outs), (ins calltarget:$target), [], II_JAL>,
1780+
PseudoInstExpansion<(JumpInst Opnd:$target)>;
1781+
}
1782+
1783+
def JAL_MMR6 : JumpLinkMMR6<BALC_MMR6, brtarget26_mm>, ISA_MICROMIPS32R6;
1784+
1785+
def : MipsPat<(MipsJmpLink (i32 texternalsym:$dst)),
1786+
(JAL_MMR6 texternalsym:$dst)>, ISA_MICROMIPS32R6;
1787+
def : MipsPat<(MipsJmpLink (iPTR tglobaladdr:$dst)),
1788+
(JAL_MMR6 tglobaladdr:$dst)>, ISA_MICROMIPS32R6;
1789+
17771790
def TAILCALL_MMR6 : TailCall<BC_MMR6, brtarget26_mm>, ISA_MICROMIPS32R6;
17781791

17791792
def TAILCALLREG_MMR6 : TailCallReg<JRC16_MM, GPR32Opnd>, ISA_MICROMIPS32R6;

llvm/lib/Target/Mips/MipsScheduleGeneric.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ def : InstRW<[GenericWriteJump], (instrs BC16_MMR6, BC1EQZC_MMR6, BC1NEZC_MMR6,
384384
BGTZC_MMR6, BLEZC_MMR6, BLTC_MMR6,
385385
BLTUC_MMR6, BLTZC_MMR6, BNEC_MMR6,
386386
BNEZC16_MMR6, BNEZC_MMR6, BNVC_MMR6,
387-
BOVC_MMR6, DERET_MMR6, ERETNC_MMR6,
387+
BOVC_MMR6, DERET_MMR6, ERETNC_MMR6, JAL_MMR6,
388388
ERET_MMR6, JIC_MMR6, JRADDIUSP, JRC16_MM,
389389
JRC16_MMR6, JRCADDIUSP_MMR6, SIGRIE_MMR6,
390390
B_MMR6_Pseudo, PseudoIndirectBranch_MMR6)>;

llvm/test/CodeGen/Mips/llvm-ir/fptosi.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ define i32 @test1(float %t) {
208208
; MMR6-SF-NEXT: # <MCOperand Reg:{{[0-9]+}}>
209209
; MMR6-SF-NEXT: # <MCOperand Imm:20>>
210210
; MMR6-SF-NEXT: .cfi_offset 31, -4
211-
; MMR6-SF-NEXT: jalr __fixsfsi # <MCInst #{{[0-9]+}} JALRC16_MMR6
211+
; MMR6-SF-NEXT: balc __fixsfsi # <MCInst #{{[0-9]+}} BALC_MMR6
212212
; MMR6-SF-NEXT: # <MCOperand Expr:(__fixsfsi)>>
213213
; MMR6-SF-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
214214
; MMR6-SF-NEXT: # <MCInst #{{[0-9]+}} LW
@@ -399,7 +399,7 @@ define i32 @test2(double %t) {
399399
; MMR6-SF-NEXT: # <MCOperand Reg:{{[0-9]+}}>
400400
; MMR6-SF-NEXT: # <MCOperand Imm:20>>
401401
; MMR6-SF-NEXT: .cfi_offset 31, -4
402-
; MMR6-SF-NEXT: jalr __fixdfsi # <MCInst #{{[0-9]+}} JALRC16_MMR6
402+
; MMR6-SF-NEXT: balc __fixdfsi # <MCInst #{{[0-9]+}} BALC_MMR6
403403
; MMR6-SF-NEXT: # <MCOperand Expr:(__fixdfsi)>>
404404
; MMR6-SF-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
405405
; MMR6-SF-NEXT: # <MCInst #{{[0-9]+}} LW

llvm/test/CodeGen/Mips/micromips-delay-slot.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ declare i32 @bar(i32 signext) #1
1818

1919
; CHECK: jals
2020
; CHECK-NEXT: sll16
21-
; CHECK-MMR6: jal
21+
; CHECK-MMR6: balc
2222
; CHECK-MMR6-NOT: sll16
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
; RUN: llc -mtriple=mips-mti-linux-gnu -mcpu=mips32r2 -mattr=+micromips -stop-after=finalize-isel < %s | FileCheck %s
1+
; RUN: llc -mtriple=mips-mti-linux-gnu -mcpu=mips32r2 -mattr=+micromips \
2+
; RUN: -stop-after=finalize-isel < %s | FileCheck --check-prefix=MM2 %s
3+
; RUN: llc -mtriple=mips-mti-linux-gnu -mcpu=mips32r6 -mattr=+micromips \
4+
; RUN: -stop-after=finalize-isel < %s | FileCheck --check-prefix=MM6 %s
25

3-
; CHECK: JAL_MM
4-
; CHECK-NOT: JALR16_MM
6+
; MM2: JAL_MM @bar
7+
; MM2: JAL_MM &memset
8+
; MM2-NOT: JALR16_MM
9+
10+
; MM6: JAL_MMR6 @bar
11+
; MM6: JAL_MMR6 &memset
12+
; MM6-NOT: JALRC16_MMR6
513

614
define dso_local void @foo(i32* nocapture %ar) local_unnamed_addr {
715
entry:
16+
call void @bar()
817
%0 = bitcast i32* %ar to i8*
918
tail call void @llvm.memset.p0i8.i32(i8* align 4 %0, i8 0, i32 100, i1 false)
1019
ret void
1120
}
1221

1322
declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i1)
23+
declare void @bar()

llvm/test/CodeGen/Mips/tailcall/tailcall.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ entry:
4747
; PIC32MM: jalr $25
4848
; PIC32R6: jalr $25
4949
; STATIC32: jal
50-
; STATIC32MMR6: jal
50+
; STATIC32MMR6: balc
5151
; N64: jalr $25
5252
; N64R6: jalr $25
5353
; PIC16: jalrc
@@ -65,7 +65,7 @@ entry:
6565
; PIC32MM: jalr $25
6666
; PIC32R6: jalr $25
6767
; STATIC32: jal
68-
; STATIC32MMR6: jal
68+
; STATIC32MMR6: balc
6969
; N64: jalr $25
7070
; N64R6: jalr $25
7171
; PIC16: jalrc
@@ -83,7 +83,7 @@ entry:
8383
; PIC32R6: jalr $25
8484
; PIC32MM: jalr $25
8585
; STATIC32: jal
86-
; STATIC32MMR6: jal
86+
; STATIC32MMR6: balc
8787
; N64: jalr $25
8888
; N64R6: jalr $25
8989
; PIC16: jalrc
@@ -179,7 +179,7 @@ entry:
179179
; PIC32R6: jalr $25
180180
; PIC32MM: jalr $25
181181
; STATIC32: jal
182-
; STATIC32MMR6: jal
182+
; STATIC32MMR6: balc
183183
; PIC64: jalr $25
184184
; STATIC64: jal
185185
; PIC16: jalrc
@@ -217,7 +217,7 @@ entry:
217217
; PIC32R6: jalrc $25
218218
; PIC32MM: jalr $25
219219
; STATIC32: jal
220-
; STATIC32MMR6: jal
220+
; STATIC32MMR6: balc
221221
; STATIC64: jal
222222
; PIC64: jalr $25
223223
; PIC64R6: jalrc $25
@@ -236,7 +236,7 @@ entry:
236236
; PIC32R6: jalr $25
237237
; PIC32MM: jalr $25
238238
; STATIC32: jal
239-
; STATIC32MMR6: jal
239+
; STATIC32MMR6: balc
240240
; STATIC64: jal
241241
; PIC64: jalr $25
242242
; PIC64R6: jalr $25
@@ -255,7 +255,7 @@ entry:
255255
; PIC32R6: jalrc $25
256256
; PIC32MM: jalr $25
257257
; STATIC32: jal
258-
; STATIC32MMR6: jal
258+
; STATIC32MMR6: balc
259259
; STATIC64: jal
260260
; PIC64: jalr $25
261261
; PIC64R6: jalrc $25
@@ -276,7 +276,7 @@ entry:
276276
; PIC32R6: jalrc $25
277277
; PIC32MM: jalr $25
278278
; STATIC32: jal
279-
; STATIC32MMR6: jal
279+
; STATIC32MMR6: balc
280280
; STATIC64: jal
281281
; PIC64: jalr $25
282282
; PIC64R6: jalrc $25
@@ -297,7 +297,7 @@ entry:
297297
; PIC32R6: jalr $25
298298
; PIC32MM: jalr $25
299299
; STATIC32: jal
300-
; STATIC32MMR6: jal
300+
; STATIC32MMR6: balc
301301
; STATIC64: jal
302302
; PIC64R6: jalr $25
303303
; PIC64: jalr $25

0 commit comments

Comments
 (0)