75 if (ReqNTID.
empty() && !OverallMaxNTID && ClusterDim.
empty() &&
79 const unsigned MaxNTID =
80 OverallMaxNTID.value_or(std::numeric_limits<unsigned>::max());
85 Vector3 MinBlockDim, MaxBlockDim;
86 if (!ReqNTID.
empty()) {
88 MinBlockDim = MaxBlockDim = {ReqNTID[0], ReqNTID[1], ReqNTID[2]};
90 MinBlockDim = {1, 1, 1};
91 MaxBlockDim = {std::min(1024u, MaxNTID), std::min(1024u, MaxNTID),
92 std::min(64u, MaxNTID)};
95 const bool HasClusterInfo = !ClusterDim.
empty() || MaxClusterRank;
100 Vector3 MinClusterDim, MaxClusterDim;
101 uint64_t MinClusterSize, MaxClusterSize;
102 if (!ClusterDim.
empty()) {
103 ClusterDim.resize(3, 1);
105 MaxClusterDim = {ClusterDim[0], ClusterDim[1], ClusterDim[2]};
106 MinClusterSize = MaxClusterSize =
107 ClusterDim[0] * ClusterDim[1] * ClusterDim[2];
109 const unsigned MaxNctaPerCluster =
110 MaxClusterRank.value_or(std::numeric_limits<unsigned>::max());
111 MinClusterDim = {1, 1, 1};
112 MaxClusterDim = {std::min(0x7fffffffu, MaxNctaPerCluster),
113 std::min(0xffffu, MaxNctaPerCluster),
114 std::min(0xffffu, MaxNctaPerCluster)};
116 MaxClusterSize = MaxNctaPerCluster;
120 switch (
II->getIntrinsicID()) {
122 case Intrinsic::nvvm_read_ptx_sreg_tid_x:
123 return addRangeAttr(0, MaxBlockDim.X,
II);
124 case Intrinsic::nvvm_read_ptx_sreg_tid_y:
125 return addRangeAttr(0, MaxBlockDim.Y,
II);
126 case Intrinsic::nvvm_read_ptx_sreg_tid_z:
127 return addRangeAttr(0, MaxBlockDim.Z,
II);
131 case Intrinsic::nvvm_read_ptx_sreg_ntid_x:
132 return addRangeAttr(MinBlockDim.X, MaxBlockDim.X + 1,
II);
133 case Intrinsic::nvvm_read_ptx_sreg_ntid_y:
134 return addRangeAttr(MinBlockDim.Y, MaxBlockDim.Y + 1,
II);
135 case Intrinsic::nvvm_read_ptx_sreg_ntid_z:
136 return addRangeAttr(MinBlockDim.Z, MaxBlockDim.Z + 1,
II);
141 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_x:
142 return addRangeAttr(0, MaxClusterDim.X,
II);
143 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_y:
144 return addRangeAttr(0, MaxClusterDim.Y,
II);
145 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_z:
146 return addRangeAttr(0, MaxClusterDim.Z,
II);
147 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_x:
148 return addRangeAttr(MinClusterDim.X, MaxClusterDim.X + 1,
II);
149 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_y:
150 return addRangeAttr(MinClusterDim.Y, MaxClusterDim.Y + 1,
II);
151 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_z:
152 return addRangeAttr(MinClusterDim.Z, MaxClusterDim.Z + 1,
II);
154 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctarank:
155 return HasClusterInfo && addRangeAttr(0, MaxClusterSize,
II);
156 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctarank:
157 return HasClusterInfo &&
158 addRangeAttr(MinClusterSize, MaxClusterSize + 1,
II);
static bool runOnFunction(Function &F, bool PostInlining)