@@ -164,3 +164,83 @@ TEST(AMDGPU, TestVGPRLimitsPerOccupancy) {
164164
165165 testGPRLimits (" VGPR" , true , test);
166166}
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