Skip to content

Commit ad41a69

Browse files
committed
[Xtensa] Minor fixes in lowering GlobalAddress/BlockAddress/JumptTable.
Remove redundant code and correct pointer type variable initialization. Also improve asm printing.
1 parent b62eea6 commit ad41a69

File tree

3 files changed

+33
-46
lines changed

3 files changed

+33
-46
lines changed

llvm/lib/Target/Xtensa/XtensaAsmPrinter.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,17 @@ void XtensaAsmPrinter::emitInstruction(const MachineInstr *MI) {
4646
unsigned Opc = MI->getOpcode();
4747

4848
switch (Opc) {
49-
case Xtensa::BR_JT: {
49+
case Xtensa::BR_JT:
5050
EmitToStreamer(
5151
*OutStreamer,
5252
MCInstBuilder(Xtensa::JX).addReg(MI->getOperand(0).getReg()));
5353
return;
54+
default:
55+
MCInst LoweredMI;
56+
lowerToMCInst(MI, LoweredMI);
57+
EmitToStreamer(*OutStreamer, LoweredMI);
58+
return;
5459
}
55-
}
56-
57-
MCInst LoweredMI;
58-
lowerToMCInst(MI, LoweredMI);
59-
EmitToStreamer(*OutStreamer, LoweredMI);
6060
}
6161

6262
void XtensaAsmPrinter::emitMachineConstantPoolValue(
@@ -74,13 +74,15 @@ void XtensaAsmPrinter::emitMachineConstantPoolValue(
7474
} else {
7575
assert(ACPV->isExtSymbol() && "unrecognized constant pool value");
7676
XtensaConstantPoolSymbol *XtensaSym = cast<XtensaConstantPoolSymbol>(ACPV);
77-
const char *Sym = XtensaSym->getSymbol();
78-
std::string SymName(Sym);
77+
const char *SymName = XtensaSym->getSymbol();
7978

80-
if (XtensaSym->isPrivateLinkage())
81-
SymName = ".L" + SymName;
82-
83-
MCSym = GetExternalSymbolSymbol(StringRef(SymName));
79+
if (XtensaSym->isPrivateLinkage()) {
80+
const DataLayout &DL = getDataLayout();
81+
MCSym = OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
82+
SymName);
83+
} else {
84+
MCSym = OutContext.getOrCreateSymbol(SymName);
85+
}
8486
}
8587

8688
MCSymbol *LblSym = GetCPISymbol(ACPV->getLabelId());
@@ -92,7 +94,7 @@ void XtensaAsmPrinter::emitMachineConstantPoolValue(
9294
std::string SymName(MCSym->getName());
9395
StringRef Modifier = ACPV->getModifierText();
9496
SymName += Modifier;
95-
MCSym = GetExternalSymbolSymbol(StringRef(SymName));
97+
MCSym = OutContext.getOrCreateSymbol(SymName);
9698
}
9799

98100
const MCExpr *Expr = MCSymbolRefExpr::create(MCSym, VK, OutContext);

llvm/lib/Target/Xtensa/XtensaISelLowering.cpp

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -541,42 +541,26 @@ SDValue XtensaTargetLowering::LowerGlobalAddress(SDValue Op,
541541
SelectionDAG &DAG) const {
542542
const GlobalAddressSDNode *G = cast<GlobalAddressSDNode>(Op);
543543
SDLoc DL(Op);
544-
auto PtrVt = getPointerTy(DAG.getDataLayout());
544+
auto PtrVT = Op.getValueType();
545545
const GlobalValue *GV = G->getGlobal();
546546

547-
// Check Op SDNode users
548-
// If there are only CALL nodes, don't expand Global Address
549-
SDNode &OpNode = *Op.getNode();
550-
bool Val = false;
551-
for (SDNode::use_iterator UI = OpNode.use_begin(); UI != OpNode.use_end();
552-
++UI) {
553-
SDNode &User = *UI.getUse().getUser();
554-
unsigned OpCode = User.getOpcode();
555-
if (OpCode != XtensaISD::CALL) {
556-
Val = true;
557-
break;
558-
}
559-
}
560-
if (!Val) {
561-
SDValue TargAddr = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVt, 0,
562-
0 /* TargetFlags */);
563-
return TargAddr;
564-
}
565-
566-
SDValue CPAddr = DAG.getTargetConstantPool(GV, PtrVt, Align(4));
547+
SDValue CPAddr = DAG.getTargetConstantPool(GV, PtrVT, Align(4));
567548
SDValue CPWrap = getAddrPCRel(CPAddr, DAG);
568549

569550
return CPWrap;
570551
}
571552

572-
SDValue XtensaTargetLowering::LowerBlockAddress(BlockAddressSDNode *Node,
553+
SDValue XtensaTargetLowering::LowerBlockAddress(SDValue Op,
573554
SelectionDAG &DAG) const {
555+
BlockAddressSDNode *Node = cast<BlockAddressSDNode>(Op);
574556
const BlockAddress *BA = Node->getBlockAddress();
575-
EVT PtrVT = getPointerTy(DAG.getDataLayout());
557+
EVT PtrVT = Op.getValueType();
558+
576559
XtensaConstantPoolValue *CPV =
577560
XtensaConstantPoolConstant::Create(BA, 0, XtensaCP::CPBlockAddress);
578561
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, Align(4));
579562
SDValue CPWrap = getAddrPCRel(CPAddr, DAG);
563+
580564
return CPWrap;
581565
}
582566

@@ -590,30 +574,31 @@ SDValue XtensaTargetLowering::LowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
590574
const MachineJumpTableInfo *MJTI = MF.getJumpTableInfo();
591575
SDValue TargetJT = DAG.getTargetJumpTable(JT->getIndex(), MVT::i32);
592576
const DataLayout &TD = DAG.getDataLayout();
593-
EVT PTy = getPointerTy(TD);
577+
EVT PtrVT = Table.getValueType();
594578
unsigned EntrySize = MJTI->getEntrySize(TD);
595579

596580
Index = DAG.getNode(ISD::MUL, DL, Index.getValueType(), Index,
597581
DAG.getConstant(EntrySize, DL, Index.getValueType()));
598582
SDValue Addr = DAG.getNode(ISD::ADD, DL, Index.getValueType(), Index, Table);
599583
SDValue LD =
600-
DAG.getLoad(PTy, DL, Chain, Addr,
584+
DAG.getLoad(PtrVT, DL, Chain, Addr,
601585
MachinePointerInfo::getJumpTable(DAG.getMachineFunction()));
586+
602587
return DAG.getNode(XtensaISD::BR_JT, DL, MVT::Other, LD.getValue(1), LD,
603588
TargetJT);
604589
}
605590

606-
SDValue XtensaTargetLowering::LowerJumpTable(JumpTableSDNode *JT,
591+
SDValue XtensaTargetLowering::LowerJumpTable(SDValue Op,
607592
SelectionDAG &DAG) const {
608-
SDLoc DL(JT);
609-
EVT PtrVt = getPointerTy(DAG.getDataLayout());
593+
JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
594+
EVT PtrVT = Op.getValueType();
610595

611596
// Create a constant pool entry for the callee address
612597
XtensaConstantPoolValue *CPV =
613598
XtensaConstantPoolJumpTable::Create(*DAG.getContext(), JT->getIndex());
614599

615600
// Get the address of the callee into a register
616-
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVt, Align(4));
601+
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, Align(4));
617602

618603
return getAddrPCRel(CPAddr, DAG);
619604
}
@@ -686,9 +671,9 @@ SDValue XtensaTargetLowering::LowerOperation(SDValue Op,
686671
case ISD::GlobalAddress:
687672
return LowerGlobalAddress(Op, DAG);
688673
case ISD::BlockAddress:
689-
return LowerBlockAddress(cast<BlockAddressSDNode>(Op), DAG);
674+
return LowerBlockAddress(Op, DAG);
690675
case ISD::JumpTable:
691-
return LowerJumpTable(cast<JumpTableSDNode>(Op), DAG);
676+
return LowerJumpTable(Op, DAG);
692677
case ISD::ConstantPool:
693678
return LowerConstantPool(cast<ConstantPoolSDNode>(Op), DAG);
694679
case ISD::STACKSAVE:

llvm/lib/Target/Xtensa/XtensaISelLowering.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ class XtensaTargetLowering : public TargetLowering {
8080

8181
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
8282

83-
SDValue LowerBlockAddress(BlockAddressSDNode *Node, SelectionDAG &DAG) const;
83+
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
8484

85-
SDValue LowerJumpTable(JumpTableSDNode *JT, SelectionDAG &DAG) const;
85+
SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
8686

8787
SDValue LowerConstantPool(ConstantPoolSDNode *CP, SelectionDAG &DAG) const;
8888

0 commit comments

Comments
 (0)