[llvm] [Xtensa] Lower GlobalAddress/BlockAddress/JumpTable (PR #95256)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 12 08:25:26 PDT 2024
================
@@ -519,6 +537,87 @@ SDValue XtensaTargetLowering::LowerImmediate(SDValue Op,
return Op;
}
+SDValue XtensaTargetLowering::LowerGlobalAddress(SDValue Op,
+ SelectionDAG &DAG) const {
+ const GlobalAddressSDNode *G = cast<GlobalAddressSDNode>(Op);
+ SDLoc DL(Op);
+ auto PtrVt = getPointerTy(DAG.getDataLayout());
+ const GlobalValue *GV = G->getGlobal();
+
+ // Check Op SDNode users
+ // If there are only CALL nodes, don't expand Global Address
+ SDNode &OpNode = *Op.getNode();
+ bool Val = false;
+ for (SDNode::use_iterator UI = OpNode.use_begin(); UI != OpNode.use_end();
+ ++UI) {
+ SDNode &User = *UI.getUse().getUser();
+ unsigned OpCode = User.getOpcode();
+ if (OpCode != XtensaISD::CALL) {
+ Val = true;
+ break;
+ }
+ }
+ if (!Val) {
+ SDValue TargAddr = DAG.getTargetGlobalAddress(G->getGlobal(), DL, PtrVt, 0,
+ 0 /* TargetFlags */);
+ return TargAddr;
+ }
+
+ SDValue CPAddr = DAG.getTargetConstantPool(GV, PtrVt, Align(4));
+ SDValue CPWrap = getAddrPCRel(CPAddr, DAG);
+
+ return CPWrap;
+}
+
+SDValue XtensaTargetLowering::LowerBlockAddress(BlockAddressSDNode *Node,
+ SelectionDAG &DAG) const {
+ const BlockAddress *BA = Node->getBlockAddress();
+ EVT PtrVT = getPointerTy(DAG.getDataLayout());
----------------
arsenm wrote:
Use the type of the original node
https://github.com/llvm/llvm-project/pull/95256
More information about the llvm-commits
mailing list