75 if (ReqNTID.
empty() && !OverallMaxNTID && ClusterDim.
empty() &&
80 OverallMaxNTID.value_or(std::numeric_limits<uint64_t>::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 = {
static_cast<unsigned>(std::min(
uint64_t{1024}, MaxNTID)),
92 static_cast<unsigned>(std::min(
uint64_t{1024}, MaxNTID)),
93 static_cast<unsigned>(std::min(
uint64_t{64}, MaxNTID))};
96 const bool HasClusterInfo = !ClusterDim.
empty() || MaxClusterRank;
101 Vector3 MinClusterDim, MaxClusterDim;
102 uint64_t MinClusterSize, MaxClusterSize;
103 if (!ClusterDim.
empty()) {
104 ClusterDim.resize(3, 1);
106 MaxClusterDim = {ClusterDim[0], ClusterDim[1], ClusterDim[2]};
107 MinClusterSize = MaxClusterSize =
108 ClusterDim[0] * ClusterDim[1] * ClusterDim[2];
110 const unsigned MaxNctaPerCluster =
111 MaxClusterRank.value_or(std::numeric_limits<unsigned>::max());
112 MinClusterDim = {1, 1, 1};
113 MaxClusterDim = {std::min(0x7fffffffu, MaxNctaPerCluster),
114 std::min(0xffffu, MaxNctaPerCluster),
115 std::min(0xffffu, MaxNctaPerCluster)};
117 MaxClusterSize = MaxNctaPerCluster;
121 switch (
II->getIntrinsicID()) {
123 case Intrinsic::nvvm_read_ptx_sreg_tid_x:
124 return addRangeAttr(0, MaxBlockDim.X,
II);
125 case Intrinsic::nvvm_read_ptx_sreg_tid_y:
126 return addRangeAttr(0, MaxBlockDim.Y,
II);
127 case Intrinsic::nvvm_read_ptx_sreg_tid_z:
128 return addRangeAttr(0, MaxBlockDim.Z,
II);
132 case Intrinsic::nvvm_read_ptx_sreg_ntid_x:
133 return addRangeAttr(MinBlockDim.X, MaxBlockDim.X + 1,
II);
134 case Intrinsic::nvvm_read_ptx_sreg_ntid_y:
135 return addRangeAttr(MinBlockDim.Y, MaxBlockDim.Y + 1,
II);
136 case Intrinsic::nvvm_read_ptx_sreg_ntid_z:
137 return addRangeAttr(MinBlockDim.Z, MaxBlockDim.Z + 1,
II);
142 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_x:
143 return addRangeAttr(0, MaxClusterDim.X,
II);
144 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_y:
145 return addRangeAttr(0, MaxClusterDim.Y,
II);
146 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_z:
147 return addRangeAttr(0, MaxClusterDim.Z,
II);
148 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_x:
149 return addRangeAttr(MinClusterDim.X, MaxClusterDim.X + 1,
II);
150 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_y:
151 return addRangeAttr(MinClusterDim.Y, MaxClusterDim.Y + 1,
II);
152 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_z:
153 return addRangeAttr(MinClusterDim.Z, MaxClusterDim.Z + 1,
II);
155 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctarank:
156 return HasClusterInfo && addRangeAttr(0, MaxClusterSize,
II);
157 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctarank:
158 return HasClusterInfo &&
159 addRangeAttr(MinClusterSize, MaxClusterSize + 1,
II);
static bool runOnFunction(Function &F, bool PostInlining)