2525#include " llvm/CodeGen/Analysis.h"
2626#include " llvm/CodeGen/ISDOpcodes.h"
2727#include " llvm/CodeGen/MachineFunction.h"
28+ #include " llvm/CodeGen/MachineJumpTableInfo.h"
2829#include " llvm/CodeGen/MachineMemOperand.h"
2930#include " llvm/CodeGen/SelectionDAG.h"
3031#include " llvm/CodeGen/SelectionDAGNodes.h"
@@ -582,9 +583,7 @@ NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM,
582583 setOperationAction (ISD::ROTR, MVT::i8 , Expand);
583584 setOperationAction (ISD::BSWAP, MVT::i16 , Expand);
584585
585- // Indirect branch is not supported.
586- // This also disables Jump Table creation.
587- setOperationAction (ISD::BR_JT, MVT::Other, Expand);
586+ setOperationAction (ISD::BR_JT, MVT::Other, Custom);
588587 setOperationAction (ISD::BRIND, MVT::Other, Expand);
589588
590589 setOperationAction (ISD::GlobalAddress, MVT::i32 , Custom);
@@ -945,6 +944,9 @@ const char *NVPTXTargetLowering::getTargetNodeName(unsigned Opcode) const {
945944 MAKE_CASE (NVPTXISD::Dummy)
946945 MAKE_CASE (NVPTXISD::MUL_WIDE_SIGNED)
947946 MAKE_CASE (NVPTXISD::MUL_WIDE_UNSIGNED)
947+ MAKE_CASE (NVPTXISD::BrxEnd)
948+ MAKE_CASE (NVPTXISD::BrxItem)
949+ MAKE_CASE (NVPTXISD::BrxStart)
948950 MAKE_CASE (NVPTXISD::Tex1DFloatS32)
949951 MAKE_CASE (NVPTXISD::Tex1DFloatFloat)
950952 MAKE_CASE (NVPTXISD::Tex1DFloatFloatLevel)
@@ -2785,6 +2787,8 @@ NVPTXTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
27852787 return LowerFP_ROUND (Op, DAG);
27862788 case ISD::FP_EXTEND:
27872789 return LowerFP_EXTEND (Op, DAG);
2790+ case ISD::BR_JT:
2791+ return LowerBR_JT (Op, DAG);
27882792 case ISD::VAARG:
27892793 return LowerVAARG (Op, DAG);
27902794 case ISD::VASTART:
@@ -2810,6 +2814,41 @@ NVPTXTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
28102814 }
28112815}
28122816
2817+ SDValue NVPTXTargetLowering::LowerBR_JT (SDValue Op, SelectionDAG &DAG) const {
2818+ SDLoc DL (Op);
2819+ SDValue Chain = Op.getOperand (0 );
2820+ const auto *JT = cast<JumpTableSDNode>(Op.getOperand (1 ));
2821+ SDValue Index = Op.getOperand (2 );
2822+
2823+ unsigned JId = JT->getIndex ();
2824+ MachineJumpTableInfo *MJTI = DAG.getMachineFunction ().getJumpTableInfo ();
2825+ ArrayRef<MachineBasicBlock *> MBBs = MJTI->getJumpTables ()[JId].MBBs ;
2826+
2827+ SDValue IdV = DAG.getConstant (JId, DL, MVT::i32 );
2828+
2829+ // Generate BrxStart node
2830+ SDVTList VTs = DAG.getVTList (MVT::Other, MVT::Glue);
2831+ Chain = DAG.getNode (NVPTXISD::BrxStart, DL, VTs, Chain, IdV);
2832+
2833+ // Generate BrxItem nodes
2834+ assert (!MBBs.empty ());
2835+ for (MachineBasicBlock *MBB : MBBs.drop_back ())
2836+ Chain = DAG.getNode (NVPTXISD::BrxItem, DL, VTs, Chain.getValue (0 ),
2837+ DAG.getBasicBlock (MBB), Chain.getValue (1 ));
2838+
2839+ // Generate BrxEnd nodes
2840+ SDValue EndOps[] = {Chain.getValue (0 ), DAG.getBasicBlock (MBBs.back ()), Index,
2841+ IdV, Chain.getValue (1 )};
2842+ SDValue BrxEnd = DAG.getNode (NVPTXISD::BrxEnd, DL, VTs, EndOps);
2843+
2844+ return BrxEnd;
2845+ }
2846+
2847+ // This will prevent AsmPrinter from trying to print the jump tables itself.
2848+ unsigned NVPTXTargetLowering::getJumpTableEncoding () const {
2849+ return MachineJumpTableInfo::EK_Inline;
2850+ }
2851+
28132852// This function is almost a copy of SelectionDAG::expandVAArg().
28142853// The only diff is that this one produces loads from local address space.
28152854SDValue NVPTXTargetLowering::LowerVAARG (SDValue Op, SelectionDAG &DAG) const {
0 commit comments