[llvm] [Xtensa] Lower GlobalAddress/BlockAddress/JumpTable (PR #95256)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 12 08:25:27 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());
+ XtensaConstantPoolValue *CPV =
+ XtensaConstantPoolConstant::Create(BA, 0, XtensaCP::CPBlockAddress);
+ SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, Align(4));
+ SDValue CPWrap = getAddrPCRel(CPAddr, DAG);
+ return CPWrap;
+}
+
+SDValue XtensaTargetLowering::LowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
+ SDValue Chain = Op.getOperand(0);
+ SDValue Table = Op.getOperand(1);
+ SDValue Index = Op.getOperand(2);
+ SDLoc DL(Op);
+ JumpTableSDNode *JT = cast<JumpTableSDNode>(Table);
+ MachineFunction &MF = DAG.getMachineFunction();
+ const MachineJumpTableInfo *MJTI = MF.getJumpTableInfo();
+ SDValue TargetJT = DAG.getTargetJumpTable(JT->getIndex(), MVT::i32);
+ const DataLayout &TD = DAG.getDataLayout();
+ EVT PTy = getPointerTy(TD);
----------------
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