Skip to content

Commit b53866f

Browse files
authored
[LoongArch] Modify expanding code sequence for PseudoLA_TLS_LE (#119696)
Before this commit, PseudoLA_TLS_LE for normal/medium code model expand normally to: ``` lu12i.w $rd, %le_hi20(sym) ori $rd, $rd, %le_lo12(sym) ``` This commit changes the result to: ``` lu12i.w $rd, %le_hi20_r(sym) add.w/d $rd, $rd, $tp, %le_add_r(sym) addi.w/d $rd, $rd, %le_lo12_r(sym) ``` This aims to be optimized by linker relaxation in the future. This commit makes no change to PseudoLA_TLS_LE in large code model.
1 parent 49331ab commit b53866f

8 files changed

+82
-40
lines changed

llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -352,11 +352,13 @@ bool LoongArchPreRAExpandPseudo::expandLoadAddressTLSLE(
352352
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
353353
MachineBasicBlock::iterator &NextMBBI) {
354354
// Code Sequence:
355+
// lu12i.w $rd, %le_hi20_r(sym)
356+
// add.w/d $rd, $rd, $tp, %le_add_r(sym)
357+
// addi.w/d $rd, $rd, %le_lo12_r(sym)
358+
//
359+
// Code Sequence while using the large code model:
355360
// lu12i.w $rd, %le_hi20(sym)
356361
// ori $rd, $rd, %le_lo12(sym)
357-
//
358-
// And additionally if generating code using the large code model:
359-
//
360362
// lu32i.d $rd, %le64_lo20(sym)
361363
// lu52i.d $rd, $rd, %le64_hi12(sym)
362364
MachineFunction *MF = MBB.getParent();
@@ -366,20 +368,35 @@ bool LoongArchPreRAExpandPseudo::expandLoadAddressTLSLE(
366368
bool Large = MF->getTarget().getCodeModel() == CodeModel::Large;
367369
Register DestReg = MI.getOperand(0).getReg();
368370
Register Parts01 =
369-
Large ? MF->getRegInfo().createVirtualRegister(&LoongArch::GPRRegClass)
370-
: DestReg;
371+
MF->getRegInfo().createVirtualRegister(&LoongArch::GPRRegClass);
371372
Register Part1 =
372373
MF->getRegInfo().createVirtualRegister(&LoongArch::GPRRegClass);
373374
MachineOperand &Symbol = MI.getOperand(1);
374375

375-
BuildMI(MBB, MBBI, DL, TII->get(LoongArch::LU12I_W), Part1)
376-
.addDisp(Symbol, 0, LoongArchII::MO_LE_HI);
376+
if (!Large) {
377+
BuildMI(MBB, MBBI, DL, TII->get(LoongArch::LU12I_W), Part1)
378+
.addDisp(Symbol, 0, LoongArchII::MO_LE_HI_R);
377379

378-
BuildMI(MBB, MBBI, DL, TII->get(LoongArch::ORI), Parts01)
379-
.addReg(Part1, RegState::Kill)
380-
.addDisp(Symbol, 0, LoongArchII::MO_LE_LO);
380+
const auto &STI = MF->getSubtarget<LoongArchSubtarget>();
381+
unsigned AddOp = STI.is64Bit() ? LoongArch::PseudoAddTPRel_D
382+
: LoongArch::PseudoAddTPRel_W;
383+
BuildMI(MBB, MBBI, DL, TII->get(AddOp), Parts01)
384+
.addReg(Part1, RegState::Kill)
385+
.addReg(LoongArch::R2)
386+
.addDisp(Symbol, 0, LoongArchII::MO_LE_ADD_R);
387+
388+
unsigned AddiOp = STI.is64Bit() ? LoongArch::ADDI_D : LoongArch::ADDI_W;
389+
BuildMI(MBB, MBBI, DL, TII->get(AddiOp), DestReg)
390+
.addReg(Parts01, RegState::Kill)
391+
.addDisp(Symbol, 0, LoongArchII::MO_LE_LO_R);
392+
} else {
393+
BuildMI(MBB, MBBI, DL, TII->get(LoongArch::LU12I_W), Part1)
394+
.addDisp(Symbol, 0, LoongArchII::MO_LE_HI);
395+
396+
BuildMI(MBB, MBBI, DL, TII->get(LoongArch::ORI), Parts01)
397+
.addReg(Part1, RegState::Kill)
398+
.addDisp(Symbol, 0, LoongArchII::MO_LE_LO);
381399

382-
if (Large) {
383400
Register Parts012 =
384401
MF->getRegInfo().createVirtualRegister(&LoongArch::GPRRegClass);
385402

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1866,9 +1866,17 @@ SDValue LoongArchTargetLowering::getStaticTLSAddr(GlobalAddressSDNode *N,
18661866
// PseudoLA_*_LARGE nodes.
18671867
SDValue Tmp = DAG.getConstant(0, DL, Ty);
18681868
SDValue Addr = DAG.getTargetGlobalAddress(N->getGlobal(), DL, Ty, 0, 0);
1869-
SDValue Offset = Large
1869+
1870+
// Only IE needs an extra argument for large code model.
1871+
SDValue Offset = Opc == LoongArch::PseudoLA_TLS_IE_LARGE
18701872
? SDValue(DAG.getMachineNode(Opc, DL, Ty, Tmp, Addr), 0)
18711873
: SDValue(DAG.getMachineNode(Opc, DL, Ty, Addr), 0);
1874+
1875+
// If it is LE for normal/medium code model, the add tp operation will occur
1876+
// during the pseudo-instruction expansion.
1877+
if (Opc == LoongArch::PseudoLA_TLS_LE && !Large)
1878+
return Offset;
1879+
18721880
if (UseGOT) {
18731881
// Mark the load instruction as invariant to enable hoisting in MachineLICM.
18741882
MachineFunction &MF = DAG.getMachineFunction();
@@ -1989,7 +1997,7 @@ LoongArchTargetLowering::lowerGlobalTLSAddress(SDValue Op,
19891997
//
19901998
// This node doesn't need an extra argument for the large code model.
19911999
return getStaticTLSAddr(N, DAG, LoongArch::PseudoLA_TLS_LE,
1992-
/*UseGOT=*/false);
2000+
/*UseGOT=*/false, Large);
19932001
}
19942002

19952003
return getTLSDescAddr(N, DAG,

llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,10 @@ LoongArchInstrInfo::getSerializableDirectMachineOperandTargetFlags() const {
651651
{MO_DESC_LD, "loongarch-desc-ld"},
652652
{MO_DESC_CALL, "loongarch-desc-call"},
653653
{MO_LD_PC_HI, "loongarch-ld-pc-hi"},
654-
{MO_GD_PC_HI, "loongarch-gd-pc-hi"}};
654+
{MO_GD_PC_HI, "loongarch-gd-pc-hi"},
655+
{MO_LE_HI_R, "loongarch-le-hi-r"},
656+
{MO_LE_ADD_R, "loongarch-le-add-r"},
657+
{MO_LE_LO_R, "loongarch-le-lo-r"}};
655658
return ArrayRef(TargetFlags);
656659
}
657660

llvm/lib/Target/LoongArch/LoongArchMCInstLower.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ static MCOperand lowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym,
114114
case LoongArchII::MO_DESC_CALL:
115115
Kind = LoongArchMCExpr::VK_LoongArch_TLS_DESC_CALL;
116116
break;
117+
case LoongArchII::MO_LE_HI_R:
118+
Kind = LoongArchMCExpr::VK_LoongArch_TLS_LE_HI20_R;
119+
break;
120+
case LoongArchII::MO_LE_ADD_R:
121+
Kind = LoongArchMCExpr::VK_LoongArch_TLS_LE_ADD_R;
122+
break;
123+
case LoongArchII::MO_LE_LO_R:
124+
Kind = LoongArchMCExpr::VK_LoongArch_TLS_LE_LO12_R;
125+
break;
117126
// TODO: Handle more target-flags.
118127
}
119128

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ enum {
5454
MO_DESC64_PC_LO,
5555
MO_DESC_LD,
5656
MO_DESC_CALL,
57+
MO_LE_HI_R,
58+
MO_LE_ADD_R,
59+
MO_LE_LO_R,
5760
// TODO: Add more flags.
5861
};
5962

llvm/test/CodeGen/LoongArch/machinelicm-address-pseudos.ll

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,9 @@ define void @test_la_tls_le(i32 signext %n) {
315315
; LA32-LABEL: test_la_tls_le:
316316
; LA32: # %bb.0: # %entry
317317
; LA32-NEXT: move $a1, $zero
318-
; LA32-NEXT: lu12i.w $a2, %le_hi20(le)
319-
; LA32-NEXT: ori $a2, $a2, %le_lo12(le)
320-
; LA32-NEXT: add.w $a2, $a2, $tp
318+
; LA32-NEXT: lu12i.w $a2, %le_hi20_r(le)
319+
; LA32-NEXT: add.w $a2, $a2, $tp, %le_add_r(le)
320+
; LA32-NEXT: addi.w $a2, $a2, %le_lo12_r(le)
321321
; LA32-NEXT: .p2align 4, , 16
322322
; LA32-NEXT: .LBB4_1: # %loop
323323
; LA32-NEXT: # =>This Inner Loop Header: Depth=1
@@ -330,12 +330,13 @@ define void @test_la_tls_le(i32 signext %n) {
330330
; LA64-LABEL: test_la_tls_le:
331331
; LA64: # %bb.0: # %entry
332332
; LA64-NEXT: move $a1, $zero
333-
; LA64-NEXT: lu12i.w $a2, %le_hi20(le)
334-
; LA64-NEXT: ori $a2, $a2, %le_lo12(le)
333+
; LA64-NEXT: lu12i.w $a2, %le_hi20_r(le)
334+
; LA64-NEXT: add.d $a2, $a2, $tp, %le_add_r(le)
335+
; LA64-NEXT: addi.d $a2, $a2, %le_lo12_r(le)
335336
; LA64-NEXT: .p2align 4, , 16
336337
; LA64-NEXT: .LBB4_1: # %loop
337338
; LA64-NEXT: # =>This Inner Loop Header: Depth=1
338-
; LA64-NEXT: ldx.w $zero, $a2, $tp
339+
; LA64-NEXT: ld.w $zero, $a2, 0
339340
; LA64-NEXT: addi.w $a1, $a1, 1
340341
; LA64-NEXT: blt $a1, $a0, .LBB4_1
341342
; LA64-NEXT: # %bb.2: # %ret

llvm/test/CodeGen/LoongArch/mir-target-flags.ll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ define void @caller() nounwind {
2828
; CHECK-NEXT: target-flags(loongarch-got-pc-lo) @t_ld
2929
; CHECK: target-flags(loongarch-ie-pc-hi) @t_ie
3030
; CHECK-NEXT: target-flags(loongarch-ie-pc-lo) @t_ie
31-
; CHECK: target-flags(loongarch-le-hi) @t_le
32-
; CHECK-NEXT: target-flags(loongarch-le-lo) @t_le
31+
; CHECK: target-flags(loongarch-le-hi-r) @t_le
32+
; CHECK-NEXT: target-flags(loongarch-le-add-r) @t_le
33+
; CHECK-NEXT: target-flags(loongarch-le-lo-r) @t_le
3334
; CHECK: target-flags(loongarch-call-plt) @callee1
3435
; CHECK: target-flags(loongarch-call) @callee2
3536
%a = load volatile i32, ptr @g_e

llvm/test/CodeGen/LoongArch/tls-models.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -330,16 +330,16 @@ entry:
330330
define ptr @f4() nounwind {
331331
; LA32PIC-LABEL: f4:
332332
; LA32PIC: # %bb.0: # %entry
333-
; LA32PIC-NEXT: lu12i.w $a0, %le_hi20(le)
334-
; LA32PIC-NEXT: ori $a0, $a0, %le_lo12(le)
335-
; LA32PIC-NEXT: add.w $a0, $a0, $tp
333+
; LA32PIC-NEXT: lu12i.w $a0, %le_hi20_r(le)
334+
; LA32PIC-NEXT: add.w $a0, $a0, $tp, %le_add_r(le)
335+
; LA32PIC-NEXT: addi.w $a0, $a0, %le_lo12_r(le)
336336
; LA32PIC-NEXT: ret
337337
;
338338
; LA64PIC-LABEL: f4:
339339
; LA64PIC: # %bb.0: # %entry
340-
; LA64PIC-NEXT: lu12i.w $a0, %le_hi20(le)
341-
; LA64PIC-NEXT: ori $a0, $a0, %le_lo12(le)
342-
; LA64PIC-NEXT: add.d $a0, $a0, $tp
340+
; LA64PIC-NEXT: lu12i.w $a0, %le_hi20_r(le)
341+
; LA64PIC-NEXT: add.d $a0, $a0, $tp, %le_add_r(le)
342+
; LA64PIC-NEXT: addi.d $a0, $a0, %le_lo12_r(le)
343343
; LA64PIC-NEXT: ret
344344
;
345345
; LA64LARGEPIC-LABEL: f4:
@@ -353,16 +353,16 @@ define ptr @f4() nounwind {
353353
;
354354
; LA32NOPIC-LABEL: f4:
355355
; LA32NOPIC: # %bb.0: # %entry
356-
; LA32NOPIC-NEXT: lu12i.w $a0, %le_hi20(le)
357-
; LA32NOPIC-NEXT: ori $a0, $a0, %le_lo12(le)
358-
; LA32NOPIC-NEXT: add.w $a0, $a0, $tp
356+
; LA32NOPIC-NEXT: lu12i.w $a0, %le_hi20_r(le)
357+
; LA32NOPIC-NEXT: add.w $a0, $a0, $tp, %le_add_r(le)
358+
; LA32NOPIC-NEXT: addi.w $a0, $a0, %le_lo12_r(le)
359359
; LA32NOPIC-NEXT: ret
360360
;
361361
; LA64NOPIC-LABEL: f4:
362362
; LA64NOPIC: # %bb.0: # %entry
363-
; LA64NOPIC-NEXT: lu12i.w $a0, %le_hi20(le)
364-
; LA64NOPIC-NEXT: ori $a0, $a0, %le_lo12(le)
365-
; LA64NOPIC-NEXT: add.d $a0, $a0, $tp
363+
; LA64NOPIC-NEXT: lu12i.w $a0, %le_hi20_r(le)
364+
; LA64NOPIC-NEXT: add.d $a0, $a0, $tp, %le_add_r(le)
365+
; LA64NOPIC-NEXT: addi.d $a0, $a0, %le_lo12_r(le)
366366
; LA64NOPIC-NEXT: ret
367367
;
368368
; LA64LARGENOPIC-LABEL: f4:
@@ -376,16 +376,16 @@ define ptr @f4() nounwind {
376376
;
377377
; LA32DESC-LABEL: f4:
378378
; LA32DESC: # %bb.0: # %entry
379-
; LA32DESC-NEXT: lu12i.w $a0, %le_hi20(le)
380-
; LA32DESC-NEXT: ori $a0, $a0, %le_lo12(le)
381-
; LA32DESC-NEXT: add.w $a0, $a0, $tp
379+
; LA32DESC-NEXT: lu12i.w $a0, %le_hi20_r(le)
380+
; LA32DESC-NEXT: add.w $a0, $a0, $tp, %le_add_r(le)
381+
; LA32DESC-NEXT: addi.w $a0, $a0, %le_lo12_r(le)
382382
; LA32DESC-NEXT: ret
383383
;
384384
; LA64DESC-LABEL: f4:
385385
; LA64DESC: # %bb.0: # %entry
386-
; LA64DESC-NEXT: lu12i.w $a0, %le_hi20(le)
387-
; LA64DESC-NEXT: ori $a0, $a0, %le_lo12(le)
388-
; LA64DESC-NEXT: add.d $a0, $a0, $tp
386+
; LA64DESC-NEXT: lu12i.w $a0, %le_hi20_r(le)
387+
; LA64DESC-NEXT: add.d $a0, $a0, $tp, %le_add_r(le)
388+
; LA64DESC-NEXT: addi.d $a0, $a0, %le_lo12_r(le)
389389
; LA64DESC-NEXT: ret
390390
;
391391
; DESC64-LABEL: f4:

0 commit comments

Comments
 (0)