Skip to content

Commit 257bf03

Browse files
author
Zaara Syeda
committed
Address review comments
1 parent f1ceef8 commit 257bf03

File tree

4 files changed

+33
-48
lines changed

4 files changed

+33
-48
lines changed

llvm/lib/Target/PowerPC/P10InstrResources.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,7 @@ def : InstRW<[P10W_FX_3C, P10W_DISP_ANY],
881881
// 3 Cycles ALU operations, 1 input operands
882882
def : InstRW<[P10W_FX_3C, P10W_DISP_ANY, P10FX_Read],
883883
(instrs
884-
ADDI, ADDI8, ADDIdtprelL32, ADDItlsldLADDR32, ADDItocL8, LI, LI8,
884+
ADDI, ADDI8, ADDIdtprelL32, ADDItlsldLADDR32, ADDItocL, ADDItocL8, LI, LI8,
885885
ADDIC, ADDIC8,
886886
ADDIS, ADDIS8, ADDISdtprelHA32, ADDIStocHA, ADDIStocHA8, LIS, LIS8,
887887
ADDME, ADDME8,

llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp

Lines changed: 25 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,19 +1153,18 @@ void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
11531153
// storage allocated in the TOC which contains the address of 'MOSymbol'.
11541154
// If the toc-data attribute is used, the TOC entry contains the data
11551155
// rather than the address of the MOSymbol.
1156-
auto isSymbolTD = [](const MachineOperand &MO) {
1157-
if (!MO.isGlobal())
1158-
return false;
1156+
if (![](const MachineOperand &MO) {
1157+
if (!MO.isGlobal())
1158+
return false;
11591159

1160-
const GlobalVariable *GV = dyn_cast<GlobalVariable>(MO.getGlobal());
1161-
if (!GV)
1162-
return false;
1160+
const GlobalVariable *GV = dyn_cast<GlobalVariable>(MO.getGlobal());
1161+
if (!GV)
1162+
return false;
11631163

1164-
return GV->hasAttribute("toc-data");
1165-
};
1166-
1167-
if (!isSymbolTD(MO))
1164+
return GV->hasAttribute("toc-data");
1165+
}(MO)) {
11681166
MOSymbol = lookUpOrCreateTOCEntry(MOSymbol, getTOCEntryTypeForMO(MO), VK);
1167+
}
11691168

11701169
const MCExpr *Exp = MCSymbolRefExpr::create(
11711170
MOSymbol, MCSymbolRefExpr::VK_PPC_U, OutContext);
@@ -1285,49 +1284,33 @@ void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
12851284
EmitToStreamer(*OutStreamer, TmpInst);
12861285
return;
12871286
}
1288-
case PPC::ADDItocL: {
1287+
case PPC::ADDItocL:
1288+
case PPC::ADDItocL8: {
12891289
// Transform %xd = ADDItocL %xs, @sym
12901290
LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
12911291

1292-
// Change the opcode to load address.
1293-
TmpInst.setOpcode(PPC::LA);
1292+
unsigned Op = MI->getOpcode();
12941293

1295-
const MachineOperand &MO = MI->getOperand(2);
1296-
assert(MO.isGlobal() && "Invalid operand for ADDItocL.");
1294+
// Change the opcode to load address for tocdata
1295+
TmpInst.setOpcode(Op == PPC::ADDItocL8 ? PPC::ADDI8 : PPC::LA);
12971296

1298-
LLVM_DEBUG(assert(
1299-
!(MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal())) &&
1300-
"Interposable definitions must use indirect accesses."));
1297+
const MachineOperand &MO = MI->getOperand(2);
1298+
if (Op == PPC::ADDItocL8)
1299+
assert((MO.isGlobal() || MO.isCPI()) && "Invalid operand for ADDItocL8.");
1300+
else
1301+
assert(MO.isGlobal() && "Invalid operand for ADDItocL.");
1302+
assert(!(MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal())) &&
1303+
"Interposable definitions must use indirect accesses.");
13011304

13021305
// Map the operand to its corresponding MCSymbol.
13031306
const MCSymbol *const MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
13041307

13051308
const MCExpr *Exp = MCSymbolRefExpr::create(
1306-
MOSymbol, MCSymbolRefExpr::VK_PPC_L, OutContext);
1307-
1308-
TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
1309-
EmitToStreamer(*OutStreamer, TmpInst);
1310-
return;
1311-
}
1312-
case PPC::ADDItocL8: {
1313-
// Transform %xd = ADDItocL8 %xs, @sym
1314-
LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
1315-
1316-
// Change the opcode to ADDI8. If the global address is external, then
1317-
// generate a TOC entry and reference that. Otherwise, reference the
1318-
// symbol directly.
1319-
TmpInst.setOpcode(PPC::ADDI8);
1320-
1321-
const MachineOperand &MO = MI->getOperand(2);
1322-
assert((MO.isGlobal() || MO.isCPI()) && "Invalid operand for ADDItocL8.");
1323-
1324-
LLVM_DEBUG(assert(
1325-
!(MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal())) &&
1326-
"Interposable definitions must use indirect accesses."));
1309+
MOSymbol,
1310+
Op == PPC::ADDItocL8 ? MCSymbolRefExpr::VK_PPC_TOC_LO
1311+
: MCSymbolRefExpr::VK_PPC_L,
1312+
OutContext);
13271313

1328-
const MCExpr *Exp =
1329-
MCSymbolRefExpr::create(getMCSymbolForTOCPseudoMO(MO, *this),
1330-
MCSymbolRefExpr::VK_PPC_TOC_LO, OutContext);
13311314
TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
13321315
EmitToStreamer(*OutStreamer, TmpInst);
13331316
return;

llvm/lib/Target/PowerPC/PPCMacroFusion.def

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
// {addi} followed by one of these {lxvd2x, lxvw4x, lxvdsx, lvebx, lvehx,
3333
// lvewx, lvx, lxsdx}
3434
FUSION_FEATURE(AddiLoad, hasAddiLoadFusion, 2, \
35-
FUSION_OP_SET(ADDI, ADDI8, ADDItocL8), \
35+
FUSION_OP_SET(ADDI, ADDI8, ADDItocL, ADDItocL8), \
3636
FUSION_OP_SET(LXVD2X, LXVW4X, LXVDSX, LVEBX, LVEHX, LVEWX, \
3737
LVX, LXSDX))
3838

@@ -134,13 +134,13 @@ FUSION_FEATURE(XorisXori, hasWideImmFusion, 1, FUSION_OP_SET(XORIS, XORIS8),
134134

135135
// addis rx,ra,si - addi rt,rx,SI, SI >= 0
136136
FUSION_FEATURE(AddisAddi, hasWideImmFusion, 1,
137-
FUSION_OP_SET(ADDIS, ADDIS8, ADDIStocHA8),
138-
FUSION_OP_SET(ADDI, ADDI8, ADDItocL8))
137+
FUSION_OP_SET(ADDIS, ADDIS8, ADDIStocHA8, ADDIStocHA),
138+
FUSION_OP_SET(ADDI, ADDI8, ADDItocL8, ADDItocL))
139139

140140
// addi rx,ra,si - addis rt,rx,SI, ra > 0, SI >= 2
141141
FUSION_FEATURE(AddiAddis, hasWideImmFusion, 1,
142-
FUSION_OP_SET(ADDI, ADDI8, ADDItocL8),
143-
FUSION_OP_SET(ADDIS, ADDIS8, ADDIStocHA8))
142+
FUSION_OP_SET(ADDI, ADDI8, ADDItocL8, ADDItocL),
143+
FUSION_OP_SET(ADDIS, ADDIS8, ADDIStocHA8, ADDIStocHA))
144144

145145
// mtctr - { bcctr,bcctrl }
146146
FUSION_FEATURE(ZeroMoveCTR, hasZeroMoveFusion, -1,

llvm/test/CodeGen/PowerPC/toc-data.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ define dso_local void @write_int(i32 signext %in) {
5757
; CHECK32LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:gprc_and_gprc_nor0 = ADDItocL killed %[[SCRATCH1]], @i
5858
; CHECK32LARGE-NEXT: STW %{{[0-9]+}}, 0, killed %[[SCRATCH2]] :: (store (s32) into @i)
5959

60+
; FIXME: peephole optimization opportunity for lower part relocation @l to the consuming stw
6061
; TEST32LARGE: .write_int:
6162
; TEST32LARGE: addis 4, i[TD]@u(2)
6263
; TEST32LARGE-NEXT: la 4, i[TD]@l(4)
@@ -127,6 +128,7 @@ define dso_local float @read_float() {
127128
; CHECK32LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:gprc_and_gprc_nor0 = ADDItocL killed %[[SCRATCH1]], @f
128129
; CHECK32LARGE-NEXT: LFS 0, killed %[[SCRATCH2]] :: (dereferenceable load (s32) from @f)
129130

131+
; FIXME: peephole optimization opportunity for lower part relocation @l to the consuming lfs
130132
; TEST32LARGE: .read_float:
131133
; TEST32LARGE: addis 3, f[TD]@u(2)
132134
; TEST32LARGE-NEXT: la 3, f[TD]@l(3)

0 commit comments

Comments
 (0)