@@ -164,3 +164,83 @@ TEST(AMDGPU, TestVGPRLimitsPerOccupancy) {
164
164
165
165
testGPRLimits (" VGPR" , true , test);
166
166
}
167
+
168
+ static const char *printSubReg (const TargetRegisterInfo &TRI, unsigned SubReg) {
169
+ return SubReg ? TRI.getSubRegIndexName (SubReg) : " <none>" ;
170
+ }
171
+
172
+ TEST (AMDGPU, TestReverseComposeSubRegIndices) {
173
+ auto TM = createAMDGPUTargetMachine (" amdgcn-amd-" , " gfx900" , " " );
174
+ if (!TM)
175
+ return ;
176
+ GCNSubtarget ST (TM->getTargetTriple (), std::string (TM->getTargetCPU ()),
177
+ std::string (TM->getTargetFeatureString ()), *TM);
178
+
179
+ const SIRegisterInfo *TRI = ST.getRegisterInfo ();
180
+
181
+ #define EXPECT_SUBREG_EQ (A, B, Expect ) \
182
+ do { \
183
+ unsigned Reversed = TRI->reverseComposeSubRegIndices (A, B); \
184
+ EXPECT_EQ (Reversed, Expect) \
185
+ << printSubReg (*TRI, A) << " , " << printSubReg (*TRI, B) << " => " \
186
+ << printSubReg (*TRI, Reversed) << " , *" << printSubReg (*TRI, Expect); \
187
+ } while (0 );
188
+
189
+ EXPECT_SUBREG_EQ (AMDGPU::NoSubRegister, AMDGPU::sub0, AMDGPU::sub0);
190
+ EXPECT_SUBREG_EQ (AMDGPU::sub0, AMDGPU::NoSubRegister, AMDGPU::sub0);
191
+
192
+ EXPECT_SUBREG_EQ (AMDGPU::sub0, AMDGPU::sub0, AMDGPU::sub0);
193
+
194
+ EXPECT_SUBREG_EQ (AMDGPU::sub0, AMDGPU::sub1, AMDGPU::sub1);
195
+ EXPECT_SUBREG_EQ (AMDGPU::sub1, AMDGPU::sub0, AMDGPU::NoSubRegister);
196
+
197
+ EXPECT_SUBREG_EQ (AMDGPU::sub0_sub1, AMDGPU::sub0, AMDGPU::sub0);
198
+ EXPECT_SUBREG_EQ (AMDGPU::sub0, AMDGPU::sub0_sub1, AMDGPU::sub0_sub1);
199
+
200
+ EXPECT_SUBREG_EQ (AMDGPU::sub0_sub1_sub2_sub3, AMDGPU::sub0_sub1,
201
+ AMDGPU::sub0_sub1);
202
+ EXPECT_SUBREG_EQ (AMDGPU::sub0_sub1, AMDGPU::sub0_sub1_sub2_sub3,
203
+ AMDGPU::sub0_sub1_sub2_sub3);
204
+
205
+ EXPECT_SUBREG_EQ (AMDGPU::sub0_sub1_sub2_sub3, AMDGPU::sub1_sub2,
206
+ AMDGPU::sub1_sub2);
207
+ EXPECT_SUBREG_EQ (AMDGPU::sub1_sub2, AMDGPU::sub0_sub1_sub2_sub3,
208
+ AMDGPU::NoSubRegister);
209
+
210
+ EXPECT_SUBREG_EQ (AMDGPU::sub1_sub2_sub3, AMDGPU::sub0_sub1_sub2_sub3,
211
+ AMDGPU::NoSubRegister);
212
+ EXPECT_SUBREG_EQ (AMDGPU::sub0_sub1_sub2_sub3, AMDGPU::sub1_sub2_sub3,
213
+ AMDGPU::sub1_sub2_sub3);
214
+
215
+ EXPECT_SUBREG_EQ (AMDGPU::sub0, AMDGPU::sub30, AMDGPU::NoSubRegister);
216
+ EXPECT_SUBREG_EQ (AMDGPU::sub30, AMDGPU::sub0, AMDGPU::NoSubRegister);
217
+
218
+ EXPECT_SUBREG_EQ (AMDGPU::sub0, AMDGPU::sub31, AMDGPU::NoSubRegister);
219
+ EXPECT_SUBREG_EQ (AMDGPU::sub31, AMDGPU::sub0, AMDGPU::NoSubRegister);
220
+
221
+ EXPECT_SUBREG_EQ (AMDGPU::sub0_sub1, AMDGPU::sub30, AMDGPU::NoSubRegister);
222
+ EXPECT_SUBREG_EQ (AMDGPU::sub30, AMDGPU::sub0_sub1, AMDGPU::NoSubRegister);
223
+
224
+ EXPECT_SUBREG_EQ (AMDGPU::sub0_sub1, AMDGPU::sub30_sub31,
225
+ AMDGPU::NoSubRegister);
226
+ EXPECT_SUBREG_EQ (AMDGPU::sub30_sub31, AMDGPU::sub0_sub1,
227
+ AMDGPU::NoSubRegister);
228
+
229
+ for (unsigned SubIdx0 = 1 , LastSubReg = TRI->getNumSubRegIndices ();
230
+ SubIdx0 != LastSubReg; ++SubIdx0) {
231
+ for (unsigned SubIdx1 = 1 ; SubIdx1 != LastSubReg; ++SubIdx1) {
232
+ if (unsigned ForwardCompose =
233
+ TRI->composeSubRegIndices (SubIdx0, SubIdx1)) {
234
+ unsigned ReverseComposed =
235
+ TRI->reverseComposeSubRegIndices (SubIdx0, ForwardCompose);
236
+ EXPECT_EQ (ReverseComposed, SubIdx1);
237
+ }
238
+
239
+ if (unsigned ReverseCompose =
240
+ TRI->reverseComposeSubRegIndices (SubIdx0, SubIdx1)) {
241
+ unsigned Recompose = TRI->composeSubRegIndices (SubIdx0, ReverseCompose);
242
+ EXPECT_EQ (Recompose, SubIdx1);
243
+ }
244
+ }
245
+ }
246
+ }
0 commit comments