[llvm] [Xtensa] Lower GlobalAddress/BlockAddress/JumpTable (PR #95256)

Andrei Safronov via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 17 16:07:20 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());
----------------
andreisfr wrote:

fixed

https://github.com/llvm/llvm-project/pull/95256


More information about the llvm-commits mailing list