Skip to content

Commit aaf6ddf

Browse files
committed
Merging r340932:
------------------------------------------------------------------------ r340932 | atanasyan | 2018-08-29 07:54:01 -0700 (Wed, 29 Aug 2018) | 11 lines [mips] Fix microMIPS unconditional branch offset handling MipsSEInstrInfo class defines for internal purpose unconditional branches as Mips::B nad Mips:J even in case of microMIPS code generation. Under some conditions that leads to the bug - for rather long branch which fits to Mips jump instruction offset size, but does not fit to microMIPS jump offset size, we generate 'short' branch and later show an error 'out of range PC16 fixup' after check in the isBranchOffsetInRange routine. Differential revision: https://reviews.llvm.org/D50615 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_70@346736 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent b023def commit aaf6ddf

File tree

2 files changed

+105
-2
lines changed

2 files changed

+105
-2
lines changed

lib/Target/Mips/MipsSEInstrInfo.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,14 @@
2525

2626
using namespace llvm;
2727

28+
static unsigned getUnconditionalBranch(const MipsSubtarget &STI) {
29+
if (STI.inMicroMipsMode())
30+
return STI.isPositionIndependent() ? Mips::B_MM : Mips::J_MM;
31+
return STI.isPositionIndependent() ? Mips::B : Mips::J;
32+
}
33+
2834
MipsSEInstrInfo::MipsSEInstrInfo(const MipsSubtarget &STI)
29-
: MipsInstrInfo(STI, STI.isPositionIndependent() ? Mips::B : Mips::J),
30-
RI() {}
35+
: MipsInstrInfo(STI, getUnconditionalBranch(STI)), RI() {}
3136

3237
const MipsRegisterInfo &MipsSEInstrInfo::getRegisterInfo() const {
3338
return RI;
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
; RUN: llc -march=mips -relocation-model=pic -mattr=+micromips \
2+
; RUN: -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
3+
4+
; CHECK-LABEL: foo:
5+
; CHECK-NEXT: 0: 41 a2 00 00 lui $2, 0
6+
; CHECK-NEXT: 4: 30 42 00 00 addiu $2, $2, 0
7+
; CHECK-NEXT: 8: 03 22 11 50 addu $2, $2, $25
8+
; CHECK-NEXT: c: fc 42 00 00 lw $2, 0($2)
9+
; CHECK-NEXT: 10: 69 20 lw16 $2, 0($2)
10+
; CHECK-NEXT: 12: 40 c2 00 14 bgtz $2, 44 <foo+0x3e>
11+
; CHECK-NEXT: 16: 00 00 00 00 nop
12+
; CHECK-NEXT: 1a: 33 bd ff f8 addiu $sp, $sp, -8
13+
; CHECK-NEXT: 1e: fb fd 00 00 sw $ra, 0($sp)
14+
; CHECK-NEXT: 22: 41 a1 00 01 lui $1, 1
15+
; CHECK-NEXT: 26: 40 60 00 02 bal 8 <foo+0x2e>
16+
; CHECK-NEXT: 2a: 30 21 04 68 addiu $1, $1, 1128
17+
; CHECK-NEXT: 2e: 00 3f 09 50 addu $1, $ra, $1
18+
; CHECK-NEXT: 32: ff fd 00 00 lw $ra, 0($sp)
19+
; CHECK-NEXT: 36: 00 01 0f 3c jr $1
20+
; CHECK-NEXT: 3a: 33 bd 00 08 addiu $sp, $sp, 8
21+
; CHECK-NEXT: 3e: 94 00 00 02 b 8 <foo+0x46>
22+
; CHECK-NEXT: 42: 00 00 00 00 nop
23+
; CHECK-NEXT: 46: 30 20 4e 1f addiu $1, $zero, 19999
24+
; CHECK-NEXT: 4a: b4 22 00 14 bne $2, $1, 44 <foo+0x76>
25+
; CHECK-NEXT: 4e: 00 00 00 00 nop
26+
; CHECK-NEXT: 52: 33 bd ff f8 addiu $sp, $sp, -8
27+
; CHECK-NEXT: 56: fb fd 00 00 sw $ra, 0($sp)
28+
; CHECK-NEXT: 5a: 41 a1 00 01 lui $1, 1
29+
; CHECK-NEXT: 5e: 40 60 00 02 bal 8 <foo+0x66>
30+
; CHECK-NEXT: 62: 30 21 04 5c addiu $1, $1, 1116
31+
; CHECK-NEXT: 66: 00 3f 09 50 addu $1, $ra, $1
32+
; CHECK-NEXT: 6a: ff fd 00 00 lw $ra, 0($sp)
33+
; CHECK-NEXT: 6e: 00 01 0f 3c jr $1
34+
; CHECK-NEXT: 72: 33 bd 00 08 addiu $sp, $sp, 8
35+
; CHECK-NEXT: 76: 30 20 27 0f addiu $1, $zero, 9999
36+
; CHECK-NEXT: 7a: 94 22 00 14 beq $2, $1, 44 <foo+0xa6>
37+
; CHECK-NEXT: 7e: 00 00 00 00 nop
38+
; CHECK-NEXT: 82: 33 bd ff f8 addiu $sp, $sp, -8
39+
; CHECK-NEXT: 86: fb fd 00 00 sw $ra, 0($sp)
40+
; CHECK-NEXT: 8a: 41 a1 00 01 lui $1, 1
41+
; CHECK-NEXT: 8e: 40 60 00 02 bal 8 <foo+0x96>
42+
; CHECK-NEXT: 92: 30 21 04 2c addiu $1, $1, 1068
43+
; CHECK-NEXT: 96: 00 3f 09 50 addu $1, $ra, $1
44+
; CHECK-NEXT: 9a: ff fd 00 00 lw $ra, 0($sp)
45+
; CHECK-NEXT: 9e: 00 01 0f 3c jr $1
46+
; CHECK-NEXT: a2: 33 bd 00 08 addiu $sp, $sp, 8
47+
48+
; CHECK: 10466: 00 00 00 00 nop
49+
; CHECK-NEXT: 1046a: 94 00 00 02 b 8 <foo+0x10472>
50+
; CHECK-NEXT: 1046e: 00 00 00 00 nop
51+
; CHECK-NEXT: 10472: 33 bd ff f8 addiu $sp, $sp, -8
52+
; CHECK-NEXT: 10476: fb fd 00 00 sw $ra, 0($sp)
53+
; CHECK-NEXT: 1047a: 41 a1 00 01 lui $1, 1
54+
; CHECK-NEXT: 1047e: 40 60 00 02 bal 8 <foo+0x10486>
55+
; CHECK-NEXT: 10482: 30 21 04 00 addiu $1, $1, 1024
56+
; CHECK-NEXT: 10486: 00 3f 09 50 addu $1, $ra, $1
57+
; CHECK-NEXT: 1048a: ff fd 00 00 lw $ra, 0($sp)
58+
; CHECK-NEXT: 1048e: 00 01 0f 3c jr $1
59+
; CHECK-NEXT: 10492: 33 bd 00 08 addiu $sp, $sp, 8
60+
; CHECK-NEXT: 10496: 94 00 00 02 b 8 <foo+0x1049e>
61+
62+
@x = external global i32, align 4
63+
64+
define void @foo() {
65+
%1 = load i32, i32* @x, align 4
66+
%2 = icmp sgt i32 %1, 0
67+
br i1 %2, label %la, label %lf
68+
69+
la:
70+
switch i32 %1, label %le [
71+
i32 9999, label %lb
72+
i32 19999, label %lc
73+
]
74+
75+
lb:
76+
tail call void asm sideeffect ".space 0", ""()
77+
br label %le
78+
79+
lc:
80+
tail call void asm sideeffect ".space 0", ""()
81+
br label %le
82+
83+
le:
84+
tail call void asm sideeffect ".space 66500", ""()
85+
br label %lg
86+
87+
lf:
88+
tail call void asm sideeffect ".space 0", ""()
89+
br label %lg
90+
91+
lg:
92+
tail call void asm sideeffect ".space 0", ""()
93+
br label %li
94+
95+
li:
96+
tail call void asm sideeffect ".space 0", ""()
97+
ret void
98+
}

0 commit comments

Comments
 (0)