Skip to content

Commit a8c624a

Browse files
[AIX]Lowering global address for 32/64bit small/large code models
This patch implements global address lowering for 32/64 bit with small/large code models. 1.For 32bit large code model on AIX, there are newly added pseudo opcode LWZtocL & ADDIStocHA32, the support of which on MC layer will be provided by future patches. 2.The default code model on AIX should be small code model. 3.Since AIX does not have medium code model, "report_fatal_error" when users specify it. Differential Revision: https://reviews.llvm.org/D63547 llvm-svn: 368744
1 parent 52d0cfc commit a8c624a

File tree

8 files changed

+195
-46
lines changed

8 files changed

+195
-46
lines changed

llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp

Lines changed: 65 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5065,44 +5065,87 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
50655065
return;
50665066
}
50675067
case PPCISD::TOC_ENTRY: {
5068-
assert ((PPCSubTarget->isPPC64() || PPCSubTarget->isSVR4ABI()) &&
5069-
"Only supported for 64-bit ABI and 32-bit SVR4");
5070-
if (PPCSubTarget->isSVR4ABI() && !PPCSubTarget->isPPC64()) {
5071-
SDValue GA = N->getOperand(0);
5072-
SDNode *MN = CurDAG->getMachineNode(PPC::LWZtoc, dl, MVT::i32, GA,
5073-
N->getOperand(1));
5074-
transferMemOperands(N, MN);
5075-
ReplaceNode(N, MN);
5076-
return;
5077-
}
5068+
const bool isPPC64 = PPCSubTarget->isPPC64();
5069+
const bool isELFABI = PPCSubTarget->isSVR4ABI();
5070+
const bool isAIXABI = PPCSubTarget->isAIXABI();
5071+
5072+
assert(!PPCSubTarget->isDarwin() && "TOC is an ELF/XCOFF construct");
5073+
5074+
// PowerPC only support small, medium and large code model.
5075+
const CodeModel::Model CModel = TM.getCodeModel();
5076+
assert((CModel != CodeModel::Tiny || CModel != CodeModel::Kernel) &&
5077+
"PowerPC doesn't support tiny or kernel code models.");
50785078

5079-
// For medium and large code model, we generate two instructions as
5080-
// described below. Otherwise we allow SelectCodeCommon to handle this,
5079+
if (isAIXABI && CModel == CodeModel::Medium)
5080+
report_fatal_error("Medium code model is not supported on AIX.");
5081+
5082+
// For 64-bit small code model, we allow SelectCodeCommon to handle this,
50815083
// selecting one of LDtoc, LDtocJTI, LDtocCPT, and LDtocBA.
5082-
CodeModel::Model CModel = TM.getCodeModel();
5083-
if (CModel != CodeModel::Medium && CModel != CodeModel::Large)
5084+
if (isPPC64 && CModel == CodeModel::Small)
50845085
break;
50855086

5086-
// The first source operand is a TargetGlobalAddress or a TargetJumpTable.
5087-
// If it must be toc-referenced according to PPCSubTarget, we generate:
5087+
// Handle 32-bit small code model.
5088+
if (!isPPC64) {
5089+
// Transforms the ISD::TOC_ENTRY node to a PPCISD::LWZtoc.
5090+
auto replaceWithLWZtoc = [this, &dl](SDNode *TocEntry) {
5091+
SDValue GA = TocEntry->getOperand(0);
5092+
SDValue TocBase = TocEntry->getOperand(1);
5093+
SDNode *MN = CurDAG->getMachineNode(PPC::LWZtoc, dl, MVT::i32, GA,
5094+
TocBase);
5095+
transferMemOperands(TocEntry, MN);
5096+
ReplaceNode(TocEntry, MN);
5097+
};
5098+
5099+
if (isELFABI) {
5100+
assert(TM.isPositionIndependent() &&
5101+
"32-bit ELF can only have TOC entries in position independent"
5102+
" code.");
5103+
// 32-bit ELF always uses a small code model toc access.
5104+
replaceWithLWZtoc(N);
5105+
return;
5106+
}
5107+
5108+
if (isAIXABI && CModel == CodeModel::Small) {
5109+
replaceWithLWZtoc(N);
5110+
return;
5111+
}
5112+
}
5113+
5114+
assert(CModel != CodeModel::Small && "All small code models handled.");
5115+
5116+
assert((isPPC64 || (isAIXABI && !isPPC64)) && "We are dealing with 64-bit"
5117+
" ELF/AIX or 32-bit AIX in the following.");
5118+
5119+
// Transforms the ISD::TOC_ENTRY node for 32-bit AIX large code model mode
5120+
// or 64-bit medium (ELF-only) or large (ELF and AIX) code model code. We
5121+
// generate two instructions as described below. The first source operand
5122+
// is a symbol reference. If it must be toc-referenced according to
5123+
// PPCSubTarget, we generate:
5124+
// [32-bit AIX]
5125+
// LWZtocL(@sym, ADDIStocHA(%r2, @sym))
5126+
// [64-bit ELF/AIX]
50885127
// LDtocL(@sym, ADDIStocHA8(%x2, @sym))
50895128
// Otherwise we generate:
50905129
// ADDItocL(ADDIStocHA8(%x2, @sym), @sym)
50915130
SDValue GA = N->getOperand(0);
50925131
SDValue TOCbase = N->getOperand(1);
5093-
SDNode *Tmp = CurDAG->getMachineNode(PPC::ADDIStocHA8, dl, MVT::i64,
5094-
TOCbase, GA);
5132+
5133+
EVT VT = isPPC64 ? MVT::i64 : MVT::i32;
5134+
SDNode *Tmp = CurDAG->getMachineNode(
5135+
isPPC64 ? PPC::ADDIStocHA8 : PPC::ADDIStocHA, dl, VT, TOCbase, GA);
5136+
50955137
if (PPCLowering->isAccessedAsGotIndirect(GA)) {
5096-
// If it is access as got-indirect, we need an extra LD to load
5138+
// If it is accessed as got-indirect, we need an extra LWZ/LD to load
50975139
// the address.
5098-
SDNode *MN = CurDAG->getMachineNode(PPC::LDtocL, dl, MVT::i64, GA,
5099-
SDValue(Tmp, 0));
5140+
SDNode *MN = CurDAG->getMachineNode(
5141+
isPPC64 ? PPC::LDtocL : PPC::LWZtocL, dl, VT, GA, SDValue(Tmp, 0));
5142+
51005143
transferMemOperands(N, MN);
51015144
ReplaceNode(N, MN);
51025145
return;
51035146
}
51045147

5105-
// Build the address relative to the TOC-pointer..
5148+
// Build the address relative to the TOC-pointer.
51065149
ReplaceNode(N, CurDAG->getMachineNode(PPC::ADDItocL, dl, MVT::i64,
51075150
SDValue(Tmp, 0), GA));
51085151
return;

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,7 +1521,7 @@ bool PPC::isVPKUWUMShuffleMask(ShuffleVectorSDNode *N, unsigned ShuffleKind,
15211521
bool PPC::isVPKUDUMShuffleMask(ShuffleVectorSDNode *N, unsigned ShuffleKind,
15221522
SelectionDAG &DAG) {
15231523
const PPCSubtarget& Subtarget =
1524-
static_cast<const PPCSubtarget&>(DAG.getSubtarget());
1524+
static_cast<const PPCSubtarget&>(DAG.getSubtarget());
15251525
if (!Subtarget.hasP8Vector())
15261526
return false;
15271527

@@ -2671,12 +2671,14 @@ static void setUsesTOCBasePtr(SelectionDAG &DAG) {
26712671
setUsesTOCBasePtr(DAG.getMachineFunction());
26722672
}
26732673

2674-
static SDValue getTOCEntry(SelectionDAG &DAG, const SDLoc &dl, bool Is64Bit,
2675-
SDValue GA) {
2674+
SDValue PPCTargetLowering::getTOCEntry(SelectionDAG &DAG, const SDLoc &dl,
2675+
SDValue GA) const {
2676+
const bool Is64Bit = Subtarget.isPPC64();
26762677
EVT VT = Is64Bit ? MVT::i64 : MVT::i32;
2677-
SDValue Reg = Is64Bit ? DAG.getRegister(PPC::X2, VT) :
2678-
DAG.getNode(PPCISD::GlobalBaseReg, dl, VT);
2679-
2678+
SDValue Reg = Is64Bit ? DAG.getRegister(PPC::X2, VT)
2679+
: Subtarget.isAIXABI()
2680+
? DAG.getRegister(PPC::R2, VT)
2681+
: DAG.getNode(PPCISD::GlobalBaseReg, dl, VT);
26802682
SDValue Ops[] = { GA, Reg };
26812683
return DAG.getMemIntrinsicNode(
26822684
PPCISD::TOC_ENTRY, dl, DAG.getVTList(VT, MVT::Other), Ops, VT,
@@ -2695,7 +2697,7 @@ SDValue PPCTargetLowering::LowerConstantPool(SDValue Op,
26952697
if (Subtarget.isSVR4ABI() && Subtarget.isPPC64()) {
26962698
setUsesTOCBasePtr(DAG);
26972699
SDValue GA = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment(), 0);
2698-
return getTOCEntry(DAG, SDLoc(CP), true, GA);
2700+
return getTOCEntry(DAG, SDLoc(CP), GA);
26992701
}
27002702

27012703
unsigned MOHiFlag, MOLoFlag;
@@ -2705,7 +2707,7 @@ SDValue PPCTargetLowering::LowerConstantPool(SDValue Op,
27052707
if (IsPIC && Subtarget.isSVR4ABI()) {
27062708
SDValue GA = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment(),
27072709
PPCII::MO_PIC_FLAG);
2708-
return getTOCEntry(DAG, SDLoc(CP), false, GA);
2710+
return getTOCEntry(DAG, SDLoc(CP), GA);
27092711
}
27102712

27112713
SDValue CPIHi =
@@ -2771,7 +2773,7 @@ SDValue PPCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
27712773
if (Subtarget.isSVR4ABI() && Subtarget.isPPC64()) {
27722774
setUsesTOCBasePtr(DAG);
27732775
SDValue GA = DAG.getTargetJumpTable(JT->getIndex(), PtrVT);
2774-
return getTOCEntry(DAG, SDLoc(JT), true, GA);
2776+
return getTOCEntry(DAG, SDLoc(JT), GA);
27752777
}
27762778

27772779
unsigned MOHiFlag, MOLoFlag;
@@ -2781,7 +2783,7 @@ SDValue PPCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
27812783
if (IsPIC && Subtarget.isSVR4ABI()) {
27822784
SDValue GA = DAG.getTargetJumpTable(JT->getIndex(), PtrVT,
27832785
PPCII::MO_PIC_FLAG);
2784-
return getTOCEntry(DAG, SDLoc(GA), false, GA);
2786+
return getTOCEntry(DAG, SDLoc(GA), GA);
27852787
}
27862788

27872789
SDValue JTIHi = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, MOHiFlag);
@@ -2802,7 +2804,7 @@ SDValue PPCTargetLowering::LowerBlockAddress(SDValue Op,
28022804
if (Subtarget.isPPC64())
28032805
setUsesTOCBasePtr(DAG);
28042806
SDValue GA = DAG.getTargetBlockAddress(BA, PtrVT, BASDN->getOffset());
2805-
return getTOCEntry(DAG, SDLoc(BASDN), Subtarget.isPPC64(), GA);
2807+
return getTOCEntry(DAG, SDLoc(BASDN), GA);
28062808
}
28072809

28082810
unsigned MOHiFlag, MOLoFlag;
@@ -2917,12 +2919,12 @@ SDValue PPCTargetLowering::LowerGlobalAddress(SDValue Op,
29172919
SDLoc DL(GSDN);
29182920
const GlobalValue *GV = GSDN->getGlobal();
29192921

2920-
// 64-bit SVR4 ABI code is always position-independent.
2922+
// 64-bit SVR4 ABI & AIX ABI code is always position-independent.
29212923
// The actual address of the GlobalValue is stored in the TOC.
2922-
if (Subtarget.isSVR4ABI() && Subtarget.isPPC64()) {
2924+
if ((Subtarget.isSVR4ABI() && Subtarget.isPPC64()) || Subtarget.isAIXABI()) {
29232925
setUsesTOCBasePtr(DAG);
29242926
SDValue GA = DAG.getTargetGlobalAddress(GV, DL, PtrVT, GSDN->getOffset());
2925-
return getTOCEntry(DAG, DL, true, GA);
2927+
return getTOCEntry(DAG, DL, GA);
29262928
}
29272929

29282930
unsigned MOHiFlag, MOLoFlag;
@@ -2933,7 +2935,7 @@ SDValue PPCTargetLowering::LowerGlobalAddress(SDValue Op,
29332935
SDValue GA = DAG.getTargetGlobalAddress(GV, DL, PtrVT,
29342936
GSDN->getOffset(),
29352937
PPCII::MO_PIC_FLAG);
2936-
return getTOCEntry(DAG, DL, false, GA);
2938+
return getTOCEntry(DAG, DL, GA);
29372939
}
29382940

29392941
SDValue GAHi =
@@ -14407,11 +14409,14 @@ bool PPCTargetLowering::isAccessedAsGotIndirect(SDValue GA) const {
1440714409
if (Subtarget.isSVR4ABI() && !Subtarget.isPPC64())
1440814410
return true;
1440914411

14412+
// AIX accesses everything indirectly through the TOC, which is similar to
14413+
// the GOT.
14414+
if (Subtarget.isAIXABI())
14415+
return true;
14416+
1441014417
CodeModel::Model CModel = getTargetMachine().getCodeModel();
1441114418
// If it is small or large code model, module locals are accessed
14412-
// indirectly by loading their address from .toc/.got. The difference
14413-
// is that for large code model we have ADDIStocHA8 + LDtocL and for
14414-
// small code model we simply have LDtoc.
14419+
// indirectly by loading their address from .toc/.got.
1441514420
if (CModel == CodeModel::Small || CModel == CodeModel::Large)
1441614421
return true;
1441714422

llvm/lib/Target/PowerPC/PPCISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,8 @@ namespace llvm {
10201020
SDValue &FPOpOut,
10211021
const SDLoc &dl) const;
10221022

1023+
SDValue getTOCEntry(SelectionDAG &DAG, const SDLoc &dl, SDValue GA) const;
1024+
10231025
SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
10241026
SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
10251027
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;

llvm/lib/Target/PowerPC/PPCInstrInfo.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3161,7 +3161,16 @@ def ADDISdtprelHA32 : PPCEmitTimePseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s1
31613161
def LWZtoc : PPCEmitTimePseudo<(outs gprc:$rD), (ins tocentry32:$disp, gprc:$reg),
31623162
"#LWZtoc",
31633163
[(set i32:$rD,
3164+
(PPCtoc_entry tglobaladdr:$disp, i32:$reg))]>;
3165+
def LWZtocL : PPCEmitTimePseudo<(outs gprc:$rD), (ins tocentry32:$disp, gprc_nor0:$reg),
3166+
"#LWZtocL",
3167+
[(set i32:$rD,
31643168
(PPCtoc_entry tglobaladdr:$disp, i32:$reg))]>;
3169+
def ADDIStocHA : PPCEmitTimePseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, tocentry32:$disp),
3170+
"#ADDIStocHA",
3171+
[(set i32:$rD,
3172+
(PPCtoc_entry i32:$reg, tglobaladdr:$disp))]>;
3173+
31653174
// Get Global (GOT) Base Register offset, from the word immediately preceding
31663175
// the function label.
31673176
def UpdateGBR : PPCEmitTimePseudo<(outs gprc:$rD, gprc:$rT), (ins gprc:$rI), "#UpdateGBR", []>;

llvm/lib/Target/PowerPC/PPCTOCRegDeps.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ namespace {
9595
protected:
9696
bool hasTOCLoReloc(const MachineInstr &MI) {
9797
if (MI.getOpcode() == PPC::LDtocL ||
98-
MI.getOpcode() == PPC::ADDItocL)
98+
MI.getOpcode() == PPC::ADDItocL ||
99+
MI.getOpcode() == PPC::LWZtocL)
99100
return true;
100101

101102
for (const MachineOperand &MO : MI.operands()) {
@@ -109,11 +110,15 @@ namespace {
109110
bool processBlock(MachineBasicBlock &MBB) {
110111
bool Changed = false;
111112

113+
const bool isPPC64 =
114+
MBB.getParent()->getSubtarget<PPCSubtarget>().isPPC64();
115+
const unsigned TOCReg = isPPC64 ? PPC::X2 : PPC::R2;
116+
112117
for (auto &MI : MBB) {
113118
if (!hasTOCLoReloc(MI))
114119
continue;
115120

116-
MI.addOperand(MachineOperand::CreateReg(PPC::X2,
121+
MI.addOperand(MachineOperand::CreateReg(TOCReg,
117122
false /*IsDef*/,
118123
true /*IsImp*/));
119124
Changed = true;

llvm/lib/Target/PowerPC/PPCTargetMachine.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,19 @@ static CodeModel::Model getEffectivePPCCodeModel(const Triple &TT,
249249
report_fatal_error("Target does not support the kernel CodeModel", false);
250250
return *CM;
251251
}
252-
if (!TT.isOSDarwin() && !JIT &&
253-
(TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le))
254-
return CodeModel::Medium;
255-
return CodeModel::Small;
252+
253+
if (JIT)
254+
return CodeModel::Small;
255+
if (TT.isOSAIX())
256+
return CodeModel::Small;
257+
258+
assert(TT.isOSBinFormatELF() && "All remaining PPC OSes are ELF based.");
259+
260+
if (TT.isArch32Bit())
261+
return CodeModel::Small;
262+
263+
assert(TT.isArch64Bit() && "Unsupported PPC architecture.");
264+
return CodeModel::Medium;
256265
}
257266

258267

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
; RUN: llc -mtriple powerpc-ibm-aix-xcoff -code-model=small \
2+
; RUN: -stop-after=machine-cp -print-before=simple-register-coalescing 2>&1 < \
3+
; RUN: %s | FileCheck --check-prefix=SMALL %s
4+
5+
; RUN: not llc -mtriple powerpc-ibm-aix-xcoff -code-model=medium \
6+
; RUN: -stop-after=machine-cp 2>&1 < %s | FileCheck --check-prefix=MEDIUM %s
7+
8+
; RUN: llc -mtriple powerpc-ibm-aix-xcoff -code-model=large \
9+
; RUN: -stop-after=machine-cp -print-before=simple-register-coalescing 2>&1 < \
10+
; RUN: %s | FileCheck --check-prefix=LARGE %s
11+
12+
; RUN: llc -mtriple powerpc-ibm-aix-xcoff -stop-after=machine-cp \
13+
; RUN: -print-before=simple-register-coalescing 2>&1 < %s | FileCheck \
14+
; RUN: --check-prefix=SMALL %s
15+
16+
@msg = common global i8* null, align 4
17+
@ptr = common global i8* null, align 4
18+
19+
define void @foo() {
20+
entry:
21+
; SMALL: %0:gprc_and_gprc_nor0 = LWZtoc @msg, $r2 :: (load 4 from got)
22+
; SMALL: %1:gprc = LWZ 0, %0:gprc_and_gprc_nor0 :: (dereferenceable load 4 from @msg)
23+
; SMALL: %2:gprc_and_gprc_nor0 = LWZtoc @ptr, $r2 :: (load 4 from got)
24+
; SMALL: STW %1:gprc, 0, %2:gprc_and_gprc_nor0 :: (store 4 into @ptr)
25+
26+
; MEDIUM: Medium code model is not supported on AIX.
27+
28+
; LARGE: %0:gprc_and_gprc_nor0 = ADDIStocHA $r2, @msg
29+
; LARGE: %1:gprc_and_gprc_nor0 = LWZtocL @msg, %0:gprc_and_gprc_nor0, implicit $r2 :: (load 4 from got)
30+
; LARGE: %2:gprc = LWZ 0, %1:gprc_and_gprc_nor0 :: (dereferenceable load 4 from @msg)
31+
; LARGE: %3:gprc_and_gprc_nor0 = ADDIStocHA $r2, @ptr
32+
; LARGE: %4:gprc_and_gprc_nor0 = LWZtocL @ptr, %3:gprc_and_gprc_nor0, implicit $r2 :: (load 4 from got)
33+
; LARGE: STW %2:gprc, 0, %4:gprc_and_gprc_nor0 :: (store 4 into @ptr)
34+
35+
%0 = load i8*, i8** @msg, align 4
36+
store i8* %0, i8** @ptr, align 4
37+
ret void
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -code-model=small \
2+
; RUN: -stop-after=machine-cp -print-before=simple-register-coalescing 2>&1 < \
3+
; RUN: %s | FileCheck --check-prefix=SMALL %s
4+
5+
; RUN: not llc -mtriple powerpc64-ibm-aix-xcoff -code-model=medium \
6+
; RUN: -stop-after=machine-cp 2>&1 < %s | FileCheck --check-prefix=MEDIUM %s
7+
8+
; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -code-model=large \
9+
; RUN: -stop-after=machine-cp -print-before=simple-register-coalescing 2>&1 < \
10+
; RUN: %s | FileCheck --check-prefix=LARGE %s
11+
12+
; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -stop-after=machine-cp \
13+
; RUN: -print-before=simple-register-coalescing 2>&1 < %s | FileCheck \
14+
; RUN: --check-prefix=SMALL %s
15+
16+
@msg = common global i8* null, align 8
17+
@ptr = common global i8* null, align 8
18+
19+
define void @foo() {
20+
entry:
21+
; SMALL: %0:g8rc_and_g8rc_nox0 = LDtoc @msg, $x2 :: (load 8 from got)
22+
; SMALL: %1:g8rc = LD 0, %0:g8rc_and_g8rc_nox0 :: (dereferenceable load 8 from @msg)
23+
; SMALL: %2:g8rc_and_g8rc_nox0 = LDtoc @ptr, $x2 :: (load 8 from got)
24+
; SMALL: STD %1:g8rc, 0, %2:g8rc_and_g8rc_nox0 :: (store 8 into @ptr)
25+
26+
; MEDIUM: Medium code model is not supported on AIX.
27+
28+
; LARGE: %0:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @msg
29+
; LARGE: %1:g8rc_and_g8rc_nox0 = LDtocL @msg, %0:g8rc_and_g8rc_nox0, implicit $x2 :: (load 8 from got)
30+
; LARGE: %2:g8rc = LD 0, %1:g8rc_and_g8rc_nox0 :: (dereferenceable load 8 from @msg)
31+
; LARGE: %3:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @ptr
32+
; LARGE: %4:g8rc_and_g8rc_nox0 = LDtocL @ptr, %3:g8rc_and_g8rc_nox0, implicit $x2 :: (load 8 from got)
33+
; LARGE: STD %2:g8rc, 0, %4:g8rc_and_g8rc_nox0 :: (store 8 into @ptr)
34+
35+
%0 = load i8*, i8** @msg, align 8
36+
store i8* %0, i8** @ptr, align 8
37+
ret void
38+
}

0 commit comments

Comments
 (0)