Skip to content

Commit c6e931a

Browse files
wangleiatAmi-zhang
authored andcommitted
[LoongArch] Reimplement the expansion of PseudoLA*_LARGE instructions (llvm#76555)
According to the description of the psABI v2.30: https://github.com/loongson/la-abi-specs/releases/tag/v2.30, moved the expansion of relevant pseudo-instructions from `LoongArchPreRAExpandPseudo` pass to `LoongArchExpandPseudo` pass, to ensure that the code sequences of `PseudoLA*_LARGE` instructions and Medium code model's function call are not scheduled. (cherry picked from commit c56a5e8) Change-Id: I3017ac451afc0ed24cd8d71b01e453427b5304d2
1 parent 3a1d20e commit c6e931a

File tree

9 files changed

+487
-383
lines changed

9 files changed

+487
-383
lines changed

llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp

Lines changed: 264 additions & 255 deletions
Large diffs are not rendered by default.

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3389,8 +3389,12 @@ const char *LoongArchTargetLowering::getTargetNodeName(unsigned Opcode) const {
33893389

33903390
// TODO: Add more target-dependent nodes later.
33913391
NODE_NAME_CASE(CALL)
3392+
NODE_NAME_CASE(CALL_MEDIUM)
3393+
NODE_NAME_CASE(CALL_LARGE)
33923394
NODE_NAME_CASE(RET)
33933395
NODE_NAME_CASE(TAIL)
3396+
NODE_NAME_CASE(TAIL_MEDIUM)
3397+
NODE_NAME_CASE(TAIL_LARGE)
33943398
NODE_NAME_CASE(SLL_W)
33953399
NODE_NAME_CASE(SRA_W)
33963400
NODE_NAME_CASE(SRL_W)
@@ -4248,15 +4252,31 @@ LoongArchTargetLowering::LowerCall(CallLoweringInfo &CLI,
42484252

42494253
// Emit the call.
42504254
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
4255+
unsigned Op;
4256+
switch (DAG.getTarget().getCodeModel()) {
4257+
default:
4258+
report_fatal_error("Unsupported code model");
4259+
case CodeModel::Small:
4260+
Op = IsTailCall ? LoongArchISD::TAIL : LoongArchISD::CALL;
4261+
break;
4262+
case CodeModel::Medium:
4263+
assert(Subtarget.is64Bit() && "Medium code model requires LA64");
4264+
Op = IsTailCall ? LoongArchISD::TAIL_MEDIUM : LoongArchISD::CALL_MEDIUM;
4265+
break;
4266+
case CodeModel::Large:
4267+
assert(Subtarget.is64Bit() && "Large code model requires LA64");
4268+
Op = IsTailCall ? LoongArchISD::TAIL_LARGE : LoongArchISD::CALL_LARGE;
4269+
break;
4270+
}
42514271

42524272
if (IsTailCall) {
42534273
MF.getFrameInfo().setHasTailCall();
4254-
SDValue Ret = DAG.getNode(LoongArchISD::TAIL, DL, NodeTys, Ops);
4274+
SDValue Ret = DAG.getNode(Op, DL, NodeTys, Ops);
42554275
DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
42564276
return Ret;
42574277
}
42584278

4259-
Chain = DAG.getNode(LoongArchISD::CALL, DL, NodeTys, Ops);
4279+
Chain = DAG.getNode(Op, DL, NodeTys, Ops);
42604280
DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge);
42614281
Glue = Chain.getValue(1);
42624282

llvm/lib/Target/LoongArch/LoongArchISelLowering.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ enum NodeType : unsigned {
2828

2929
// TODO: add more LoongArchISDs
3030
CALL,
31+
CALL_MEDIUM,
32+
CALL_LARGE,
3133
RET,
3234
TAIL,
35+
TAIL_MEDIUM,
36+
TAIL_LARGE,
3337

3438
// 32-bit shifts, directly matching the semantics of the named LoongArch
3539
// instructions.

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,18 @@ def loongarch_ret : SDNode<"LoongArchISD::RET", SDTNone,
6969
def loongarch_tail : SDNode<"LoongArchISD::TAIL", SDT_LoongArchCall,
7070
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
7171
SDNPVariadic]>;
72+
def loongarch_call_medium : SDNode<"LoongArchISD::CALL_MEDIUM", SDT_LoongArchCall,
73+
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
74+
SDNPVariadic]>;
75+
def loongarch_tail_medium : SDNode<"LoongArchISD::TAIL_MEDIUM", SDT_LoongArchCall,
76+
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
77+
SDNPVariadic]>;
78+
def loongarch_call_large : SDNode<"LoongArchISD::CALL_LARGE", SDT_LoongArchCall,
79+
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
80+
SDNPVariadic]>;
81+
def loongarch_tail_large : SDNode<"LoongArchISD::TAIL_LARGE", SDT_LoongArchCall,
82+
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
83+
SDNPVariadic]>;
7284
def loongarch_sll_w : SDNode<"LoongArchISD::SLL_W", SDT_LoongArchIntBinOpW>;
7385
def loongarch_sra_w : SDNode<"LoongArchISD::SRA_W", SDT_LoongArchIntBinOpW>;
7486
def loongarch_srl_w : SDNode<"LoongArchISD::SRL_W", SDT_LoongArchIntBinOpW>;
@@ -1327,16 +1339,43 @@ def : Pat<(brind GPR:$rj), (PseudoBRIND GPR:$rj, 0)>;
13271339
def : Pat<(brind (add GPR:$rj, simm16_lsl2:$imm16)),
13281340
(PseudoBRIND GPR:$rj, simm16_lsl2:$imm16)>;
13291341

1342+
// Function call with 'Small' code model.
13301343
let isCall = 1, Defs = [R1] in
13311344
def PseudoCALL : Pseudo<(outs), (ins bare_symbol:$func)>;
13321345

13331346
def : Pat<(loongarch_call tglobaladdr:$func), (PseudoCALL tglobaladdr:$func)>;
13341347
def : Pat<(loongarch_call texternalsym:$func), (PseudoCALL texternalsym:$func)>;
13351348

1349+
// Function call with 'Medium' code model.
1350+
let isCall = 1, Defs = [R1, R20], Size = 8 in
1351+
def PseudoCALL_MEDIUM : Pseudo<(outs), (ins bare_symbol:$func)>;
1352+
1353+
let Predicates = [IsLA64] in {
1354+
def : Pat<(loongarch_call_medium tglobaladdr:$func),
1355+
(PseudoCALL_MEDIUM tglobaladdr:$func)>;
1356+
def : Pat<(loongarch_call_medium texternalsym:$func),
1357+
(PseudoCALL_MEDIUM texternalsym:$func)>;
1358+
} // Predicates = [IsLA64]
1359+
1360+
// Function call with 'Large' code model.
1361+
let isCall = 1, Defs = [R1, R20], Size = 24 in
1362+
def PseudoCALL_LARGE: Pseudo<(outs), (ins bare_symbol:$func)>;
1363+
1364+
let Predicates = [IsLA64] in {
1365+
def : Pat<(loongarch_call_large tglobaladdr:$func),
1366+
(PseudoCALL_LARGE tglobaladdr:$func)>;
1367+
def : Pat<(loongarch_call_large texternalsym:$func),
1368+
(PseudoCALL_LARGE texternalsym:$func)>;
1369+
} // Predicates = [IsLA64]
1370+
13361371
let isCall = 1, Defs = [R1] in
13371372
def PseudoCALLIndirect : Pseudo<(outs), (ins GPR:$rj),
13381373
[(loongarch_call GPR:$rj)]>,
13391374
PseudoInstExpansion<(JIRL R1, GPR:$rj, 0)>;
1375+
let Predicates = [IsLA64] in {
1376+
def : Pat<(loongarch_call_medium GPR:$rj), (PseudoCALLIndirect GPR:$rj)>;
1377+
def : Pat<(loongarch_call_large GPR:$rj), (PseudoCALLIndirect GPR:$rj)>;
1378+
}
13401379

13411380
let isCall = 1, hasSideEffects = 0, mayStore = 0, mayLoad = 0, Defs = [R1] in
13421381
def PseudoJIRL_CALL : Pseudo<(outs), (ins GPR:$rj, simm16_lsl2:$imm16)>,
@@ -1347,6 +1386,7 @@ let isBarrier = 1, isReturn = 1, isTerminator = 1 in
13471386
def PseudoRET : Pseudo<(outs), (ins), [(loongarch_ret)]>,
13481387
PseudoInstExpansion<(JIRL R0, R1, 0)>;
13491388

1389+
// Tail call with 'Small' code model.
13501390
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [R3] in
13511391
def PseudoTAIL : Pseudo<(outs), (ins bare_symbol:$dst)>;
13521392

@@ -1355,10 +1395,38 @@ def : Pat<(loongarch_tail (iPTR tglobaladdr:$dst)),
13551395
def : Pat<(loongarch_tail (iPTR texternalsym:$dst)),
13561396
(PseudoTAIL texternalsym:$dst)>;
13571397

1398+
// Tail call with 'Medium' code model.
1399+
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
1400+
Uses = [R3], Defs = [R20], Size = 8 in
1401+
def PseudoTAIL_MEDIUM : Pseudo<(outs), (ins bare_symbol:$dst)>;
1402+
1403+
let Predicates = [IsLA64] in {
1404+
def : Pat<(loongarch_tail_medium (iPTR tglobaladdr:$dst)),
1405+
(PseudoTAIL_MEDIUM tglobaladdr:$dst)>;
1406+
def : Pat<(loongarch_tail_medium (iPTR texternalsym:$dst)),
1407+
(PseudoTAIL_MEDIUM texternalsym:$dst)>;
1408+
} // Predicates = [IsLA64]
1409+
1410+
// Tail call with 'Large' code model.
1411+
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
1412+
Uses = [R3], Defs = [R19, R20], Size = 24 in
1413+
def PseudoTAIL_LARGE : Pseudo<(outs), (ins bare_symbol:$dst)>;
1414+
1415+
let Predicates = [IsLA64] in {
1416+
def : Pat<(loongarch_tail_large (iPTR tglobaladdr:$dst)),
1417+
(PseudoTAIL_LARGE tglobaladdr:$dst)>;
1418+
def : Pat<(loongarch_tail_large (iPTR texternalsym:$dst)),
1419+
(PseudoTAIL_LARGE texternalsym:$dst)>;
1420+
} // Predicates = [IsLA64]
1421+
13581422
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [R3] in
13591423
def PseudoTAILIndirect : Pseudo<(outs), (ins GPRT:$rj),
13601424
[(loongarch_tail GPRT:$rj)]>,
13611425
PseudoInstExpansion<(JIRL R0, GPR:$rj, 0)>;
1426+
let Predicates = [IsLA64] in {
1427+
def : Pat<(loongarch_tail_medium GPR:$rj), (PseudoTAILIndirect GPR:$rj)>;
1428+
def : Pat<(loongarch_tail_large GPR:$rj), (PseudoTAILIndirect GPR:$rj)>;
1429+
}
13621430

13631431
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1,
13641432
hasSideEffects = 0, mayStore = 0, mayLoad = 0, Uses = [R3] in
@@ -1396,6 +1464,7 @@ def PseudoLA_ABS_LARGE : Pseudo<(outs GPR:$dst),
13961464
"la.abs", "$dst, $src">;
13971465
def PseudoLA_PCREL : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
13981466
"la.pcrel", "$dst, $src">;
1467+
let Defs = [R20], Size = 20 in
13991468
def PseudoLA_PCREL_LARGE : Pseudo<(outs GPR:$dst),
14001469
(ins GPR:$tmp, bare_symbol:$src), [],
14011470
"la.pcrel", "$dst, $tmp, $src">,
@@ -1407,28 +1476,30 @@ let hasSideEffects = 0, mayLoad = 1, mayStore = 0, isCodeGenOnly = 0,
14071476
isAsmParserOnly = 1 in {
14081477
def PseudoLA_GOT : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
14091478
"la.got", "$dst, $src">;
1479+
def PseudoLA_TLS_IE : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
1480+
"la.tls.ie", "$dst, $src">;
1481+
def PseudoLA_TLS_LD : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
1482+
"la.tls.ld", "$dst, $src">;
1483+
def PseudoLA_TLS_GD : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
1484+
"la.tls.gd", "$dst, $src">;
1485+
let Defs = [R20], Size = 20 in {
14101486
def PseudoLA_GOT_LARGE : Pseudo<(outs GPR:$dst),
14111487
(ins GPR:$tmp, bare_symbol:$src), [],
14121488
"la.got", "$dst, $tmp, $src">,
14131489
Requires<[IsLA64]>;
1414-
def PseudoLA_TLS_IE : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
1415-
"la.tls.ie", "$dst, $src">;
14161490
def PseudoLA_TLS_IE_LARGE : Pseudo<(outs GPR:$dst),
14171491
(ins GPR:$tmp, bare_symbol:$src), [],
14181492
"la.tls.ie", "$dst, $tmp, $src">,
14191493
Requires<[IsLA64]>;
1420-
def PseudoLA_TLS_LD : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
1421-
"la.tls.ld", "$dst, $src">;
14221494
def PseudoLA_TLS_LD_LARGE : Pseudo<(outs GPR:$dst),
14231495
(ins GPR:$tmp, bare_symbol:$src), [],
14241496
"la.tls.ld", "$dst, $tmp, $src">,
14251497
Requires<[IsLA64]>;
1426-
def PseudoLA_TLS_GD : Pseudo<(outs GPR:$dst), (ins bare_symbol:$src), [],
1427-
"la.tls.gd", "$dst, $src">;
14281498
def PseudoLA_TLS_GD_LARGE : Pseudo<(outs GPR:$dst),
14291499
(ins GPR:$tmp, bare_symbol:$src), [],
14301500
"la.tls.gd", "$dst, $tmp, $src">,
14311501
Requires<[IsLA64]>;
1502+
} // Defs = [R20], Size = 20
14321503
}
14331504

14341505
// Load address inst alias: "la", "la.global" and "la.local".

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ define i32 @call_globaladdress(i32 %a) nounwind {
3333
; LARGE: # %bb.0:
3434
; LARGE-NEXT: addi.d $sp, $sp, -16
3535
; LARGE-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
36-
; LARGE-NEXT: pcalau12i $a1, %got_pc_hi20(callee)
37-
; LARGE-NEXT: addi.d $ra, $zero, %got_pc_lo12(callee)
38-
; LARGE-NEXT: lu32i.d $ra, %got64_pc_lo20(callee)
39-
; LARGE-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(callee)
40-
; LARGE-NEXT: ldx.d $ra, $ra, $a1
36+
; LARGE-NEXT: pcalau12i $ra, %got_pc_hi20(callee)
37+
; LARGE-NEXT: addi.d $t8, $zero, %got_pc_lo12(callee)
38+
; LARGE-NEXT: lu32i.d $t8, %got64_pc_lo20(callee)
39+
; LARGE-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(callee)
40+
; LARGE-NEXT: ldx.d $ra, $t8, $ra
4141
; LARGE-NEXT: jirl $ra, $ra, 0
4242
; LARGE-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
4343
; LARGE-NEXT: addi.d $sp, $sp, 16
@@ -82,11 +82,11 @@ define void @call_external_sym(ptr %dst) {
8282
; LARGE-NEXT: .cfi_offset 1, -8
8383
; LARGE-NEXT: ori $a2, $zero, 1000
8484
; LARGE-NEXT: move $a1, $zero
85-
; LARGE-NEXT: pcalau12i $a3, %pc_hi20(memset)
86-
; LARGE-NEXT: addi.d $ra, $zero, %pc_lo12(memset)
87-
; LARGE-NEXT: lu32i.d $ra, %pc64_lo20(memset)
88-
; LARGE-NEXT: lu52i.d $ra, $ra, %pc64_hi12(memset)
89-
; LARGE-NEXT: add.d $ra, $ra, $a3
85+
; LARGE-NEXT: pcalau12i $ra, %pc_hi20(memset)
86+
; LARGE-NEXT: addi.d $t8, $zero, %pc_lo12(memset)
87+
; LARGE-NEXT: lu32i.d $t8, %pc64_lo20(memset)
88+
; LARGE-NEXT: lu52i.d $t8, $t8, %pc64_hi12(memset)
89+
; LARGE-NEXT: add.d $ra, $t8, $ra
9090
; LARGE-NEXT: jirl $ra, $ra, 0
9191
; LARGE-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
9292
; LARGE-NEXT: addi.d $sp, $sp, 16
@@ -105,17 +105,17 @@ define i32 @caller_tail(i32 %i) nounwind {
105105
;
106106
; MEDIUM-LABEL: caller_tail:
107107
; MEDIUM: # %bb.0: # %entry
108-
; MEDIUM-NEXT: pcaddu18i $a1, %call36(callee_tail)
109-
; MEDIUM-NEXT: jr $a1
108+
; MEDIUM-NEXT: pcaddu18i $t8, %call36(callee_tail)
109+
; MEDIUM-NEXT: jr $t8
110110
;
111111
; LARGE-LABEL: caller_tail:
112112
; LARGE: # %bb.0: # %entry
113-
; LARGE-NEXT: pcalau12i $a1, %got_pc_hi20(callee_tail)
114-
; LARGE-NEXT: addi.d $a2, $zero, %got_pc_lo12(callee_tail)
115-
; LARGE-NEXT: lu32i.d $a2, %got64_pc_lo20(callee_tail)
116-
; LARGE-NEXT: lu52i.d $a2, $a2, %got64_pc_hi12(callee_tail)
117-
; LARGE-NEXT: ldx.d $a1, $a2, $a1
118-
; LARGE-NEXT: jr $a1
113+
; LARGE-NEXT: pcalau12i $t7, %got_pc_hi20(callee_tail)
114+
; LARGE-NEXT: addi.d $t8, $zero, %got_pc_lo12(callee_tail)
115+
; LARGE-NEXT: lu32i.d $t8, %got64_pc_lo20(callee_tail)
116+
; LARGE-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(callee_tail)
117+
; LARGE-NEXT: ldx.d $t7, $t8, $t7
118+
; LARGE-NEXT: jr $t7
119119
entry:
120120
%r = tail call i32 @callee_tail(i32 %i)
121121
ret i32 %r

llvm/test/CodeGen/LoongArch/expand-call.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; RUN: llc --mtriple=loongarch64 --stop-before loongarch-prera-expand-pseudo \
22
; RUN: --verify-machineinstrs < %s | FileCheck %s --check-prefix=NOEXPAND
3-
; RUN: llc --mtriple=loongarch64 --stop-after loongarch-prera-expand-pseudo \
3+
; RUN: llc --mtriple=loongarch64 --stop-before machine-opt-remark-emitter \
44
; RUN: --verify-machineinstrs < %s | FileCheck %s --check-prefix=EXPAND
55

66
declare void @callee()

llvm/test/CodeGen/LoongArch/global-address.ll

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,32 +53,32 @@ define void @foo() nounwind {
5353
; LA64LARGENOPIC-LABEL: foo:
5454
; LA64LARGENOPIC: # %bb.0:
5555
; LA64LARGENOPIC-NEXT: pcalau12i $a0, %got_pc_hi20(G)
56-
; LA64LARGENOPIC-NEXT: addi.d $a1, $zero, %got_pc_lo12(G)
57-
; LA64LARGENOPIC-NEXT: lu32i.d $a1, %got64_pc_lo20(G)
58-
; LA64LARGENOPIC-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(G)
59-
; LA64LARGENOPIC-NEXT: ldx.d $a0, $a1, $a0
56+
; LA64LARGENOPIC-NEXT: addi.d $t8, $zero, %got_pc_lo12(G)
57+
; LA64LARGENOPIC-NEXT: lu32i.d $t8, %got64_pc_lo20(G)
58+
; LA64LARGENOPIC-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(G)
59+
; LA64LARGENOPIC-NEXT: ldx.d $a0, $t8, $a0
6060
; LA64LARGENOPIC-NEXT: ld.w $a0, $a0, 0
6161
; LA64LARGENOPIC-NEXT: pcalau12i $a0, %pc_hi20(g)
62-
; LA64LARGENOPIC-NEXT: addi.d $a1, $zero, %pc_lo12(g)
63-
; LA64LARGENOPIC-NEXT: lu32i.d $a1, %pc64_lo20(g)
64-
; LA64LARGENOPIC-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g)
65-
; LA64LARGENOPIC-NEXT: add.d $a0, $a1, $a0
62+
; LA64LARGENOPIC-NEXT: addi.d $t8, $zero, %pc_lo12(g)
63+
; LA64LARGENOPIC-NEXT: lu32i.d $t8, %pc64_lo20(g)
64+
; LA64LARGENOPIC-NEXT: lu52i.d $t8, $t8, %pc64_hi12(g)
65+
; LA64LARGENOPIC-NEXT: add.d $a0, $t8, $a0
6666
; LA64LARGENOPIC-NEXT: ld.w $a0, $a0, 0
6767
; LA64LARGENOPIC-NEXT: ret
6868
;
6969
; LA64LARGEPIC-LABEL: foo:
7070
; LA64LARGEPIC: # %bb.0:
7171
; LA64LARGEPIC-NEXT: pcalau12i $a0, %got_pc_hi20(G)
72-
; LA64LARGEPIC-NEXT: addi.d $a1, $zero, %got_pc_lo12(G)
73-
; LA64LARGEPIC-NEXT: lu32i.d $a1, %got64_pc_lo20(G)
74-
; LA64LARGEPIC-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(G)
75-
; LA64LARGEPIC-NEXT: ldx.d $a0, $a1, $a0
72+
; LA64LARGEPIC-NEXT: addi.d $t8, $zero, %got_pc_lo12(G)
73+
; LA64LARGEPIC-NEXT: lu32i.d $t8, %got64_pc_lo20(G)
74+
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(G)
75+
; LA64LARGEPIC-NEXT: ldx.d $a0, $t8, $a0
7676
; LA64LARGEPIC-NEXT: ld.w $a0, $a0, 0
7777
; LA64LARGEPIC-NEXT: pcalau12i $a0, %pc_hi20(.Lg$local)
78-
; LA64LARGEPIC-NEXT: addi.d $a1, $zero, %pc_lo12(.Lg$local)
79-
; LA64LARGEPIC-NEXT: lu32i.d $a1, %pc64_lo20(.Lg$local)
80-
; LA64LARGEPIC-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Lg$local)
81-
; LA64LARGEPIC-NEXT: add.d $a0, $a1, $a0
78+
; LA64LARGEPIC-NEXT: addi.d $t8, $zero, %pc_lo12(.Lg$local)
79+
; LA64LARGEPIC-NEXT: lu32i.d $t8, %pc64_lo20(.Lg$local)
80+
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %pc64_hi12(.Lg$local)
81+
; LA64LARGEPIC-NEXT: add.d $a0, $t8, $a0
8282
; LA64LARGEPIC-NEXT: ld.w $a0, $a0, 0
8383
; LA64LARGEPIC-NEXT: ret
8484
%V = load volatile i32, ptr @G

0 commit comments

Comments
 (0)