LLVM: lib/Target/NVPTX/NVVMIntrRange.cpp Source File (original) (raw)
61 struct Vector3 {
63 };
64
65
67 return false;
68
72
73
74 if (!(OverallReqNTID || OverallMaxNTID || OverallClusterRank))
75 return false;
76
77 const unsigned FunctionNTID = OverallReqNTID.value_or(
78 OverallMaxNTID.value_or(std::numeric_limits::max()));
79
80 const unsigned FunctionClusterRank =
81 OverallClusterRank.value_or(std::numeric_limits::max());
82
83 const Vector3 MaxBlockSize{std::min(1024u, FunctionNTID),
84 std::min(1024u, FunctionNTID),
85 std::min(64u, FunctionNTID)};
86
87
88
89 const Vector3 MaxClusterRank{std::min(0x7fffffffu, FunctionClusterRank),
90 std::min(0xffffu, FunctionClusterRank),
91 std::min(0xffffu, FunctionClusterRank)};
92
93 const auto ProccessIntrinsic = [&](IntrinsicInst *II) -> bool {
94 switch (II->getIntrinsicID()) {
95
96 case Intrinsic::nvvm_read_ptx_sreg_tid_x:
97 return addRangeAttr(0, MaxBlockSize.X, II);
98 case Intrinsic::nvvm_read_ptx_sreg_tid_y:
99 return addRangeAttr(0, MaxBlockSize.Y, II);
100 case Intrinsic::nvvm_read_ptx_sreg_tid_z:
101 return addRangeAttr(0, MaxBlockSize.Z, II);
102
103
104 case Intrinsic::nvvm_read_ptx_sreg_ntid_x:
105 return addRangeAttr(1, MaxBlockSize.X + 1, II);
106 case Intrinsic::nvvm_read_ptx_sreg_ntid_y:
107 return addRangeAttr(1, MaxBlockSize.Y + 1, II);
108 case Intrinsic::nvvm_read_ptx_sreg_ntid_z:
109 return addRangeAttr(1, MaxBlockSize.Z + 1, II);
110
111
112 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_x:
113 return addRangeAttr(0, MaxClusterRank.X, II);
114 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_y:
115 return addRangeAttr(0, MaxClusterRank.Y, II);
116 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctaid_z:
117 return addRangeAttr(0, MaxClusterRank.Z, II);
118 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_x:
119 return addRangeAttr(1, MaxClusterRank.X + 1, II);
120 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_y:
121 return addRangeAttr(1, MaxClusterRank.Y + 1, II);
122 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctaid_z:
123 return addRangeAttr(1, MaxClusterRank.Z + 1, II);
124
125 case Intrinsic::nvvm_read_ptx_sreg_cluster_ctarank:
126 if (OverallClusterRank)
127 return addRangeAttr(0, FunctionClusterRank, II);
128 break;
129 case Intrinsic::nvvm_read_ptx_sreg_cluster_nctarank:
130 if (OverallClusterRank)
131 return addRangeAttr(1, FunctionClusterRank + 1, II);
132 break;
133 default:
134 return false;
135 }
136 return false;
137 };
138
139
143 Changed |= ProccessIntrinsic(II);
144
146}