xref: /llvm-project/llvm/unittests/Target/AArch64/MatrixRegisterAliasing.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
1c08dabb0SCullen Rhodes #include "AArch64Subtarget.h"
289b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
3c08dabb0SCullen Rhodes #include "llvm/Support/TargetSelect.h"
4c08dabb0SCullen Rhodes 
5c08dabb0SCullen Rhodes #include "gtest/gtest.h"
6c08dabb0SCullen Rhodes 
7c08dabb0SCullen Rhodes using namespace llvm;
8c08dabb0SCullen Rhodes 
9c08dabb0SCullen Rhodes namespace {
10*bb3f5e1fSMatin Raayai std::unique_ptr<TargetMachine> createTargetMachine() {
11c08dabb0SCullen Rhodes   auto TT(Triple::normalize("aarch64--"));
12c08dabb0SCullen Rhodes   std::string CPU("generic");
13c08dabb0SCullen Rhodes   std::string FS("+sme");
14c08dabb0SCullen Rhodes 
15c08dabb0SCullen Rhodes   LLVMInitializeAArch64TargetInfo();
16c08dabb0SCullen Rhodes   LLVMInitializeAArch64Target();
17c08dabb0SCullen Rhodes   LLVMInitializeAArch64TargetMC();
18c08dabb0SCullen Rhodes 
19c08dabb0SCullen Rhodes   std::string Error;
20c08dabb0SCullen Rhodes   const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);
21c08dabb0SCullen Rhodes 
22*bb3f5e1fSMatin Raayai   return std::unique_ptr<TargetMachine>(
23b6a01caaSKazu Hirata       TheTarget->createTargetMachine(TT, CPU, FS, TargetOptions(), std::nullopt,
24*bb3f5e1fSMatin Raayai                                      std::nullopt, CodeGenOptLevel::Default));
25c08dabb0SCullen Rhodes }
26c08dabb0SCullen Rhodes 
27c08dabb0SCullen Rhodes std::unique_ptr<AArch64InstrInfo> createInstrInfo(TargetMachine *TM) {
28c08dabb0SCullen Rhodes   AArch64Subtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
29607fb1bbSDavid Sherwood                       std::string(TM->getTargetCPU()),
30c08dabb0SCullen Rhodes                       std::string(TM->getTargetFeatureString()), *TM,
31c08dabb0SCullen Rhodes                       /* isLittle */ false);
32c08dabb0SCullen Rhodes   return std::make_unique<AArch64InstrInfo>(ST);
33c08dabb0SCullen Rhodes }
34c08dabb0SCullen Rhodes 
35c08dabb0SCullen Rhodes TEST(MatrixRegisterAliasing, Aliasing) {
36*bb3f5e1fSMatin Raayai   std::unique_ptr<TargetMachine> TM = createTargetMachine();
37c08dabb0SCullen Rhodes   ASSERT_TRUE(TM);
38c08dabb0SCullen Rhodes   std::unique_ptr<AArch64InstrInfo> II = createInstrInfo(TM.get());
39c08dabb0SCullen Rhodes 
40c08dabb0SCullen Rhodes   const AArch64RegisterInfo &TRI = II->getRegisterInfo();
41c08dabb0SCullen Rhodes 
42c08dabb0SCullen Rhodes   // za overlaps with za.b
43c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZA, AArch64::ZAB0));
44c08dabb0SCullen Rhodes 
45c08dabb0SCullen Rhodes   // za0.b overlaps with all tiles
46c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAQ0));
47c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAQ15));
48c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAD0));
49c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAD7));
50c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAS0));
51c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAS3));
52c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAH0));
53c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAB0, AArch64::ZAH1));
54c08dabb0SCullen Rhodes 
55c08dabb0SCullen Rhodes   // za0.h aliases with za0.q, za2.q, ..
56c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ0));
57c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ2));
58c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ4));
59c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ6));
60c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ8));
61c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ10));
62c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ12));
63c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ14));
64c08dabb0SCullen Rhodes 
65c08dabb0SCullen Rhodes   // za1.h aliases with za1.q, za3.q, ...
66c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ1));
67c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ3));
68c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ5));
69c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ7));
70c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ9));
71c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ11));
72c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ13));
73c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ15));
74c08dabb0SCullen Rhodes 
75c08dabb0SCullen Rhodes   // za1.h doesn't alias with za0.q, za2.q, ..
76c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ0));
77c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ2));
78c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ4));
79c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ6));
80c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ8));
81c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ10));
82c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ12));
83c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH1, AArch64::ZAQ14));
84c08dabb0SCullen Rhodes 
85c08dabb0SCullen Rhodes   // za0.h doesn't alias with za1.q, za3.q, ..
86c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ1));
87c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ3));
88c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ5));
89c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ7));
90c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ9));
91c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ11));
92c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ13));
93c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAH0, AArch64::ZAQ15));
94c08dabb0SCullen Rhodes 
95c08dabb0SCullen Rhodes   // za0.s aliases with za0.q, za4.q, za8.q, za12.q
96c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ0));
97c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ4));
98c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ8));
99c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ12));
100c08dabb0SCullen Rhodes 
101c08dabb0SCullen Rhodes   // za1.s aliases with za1.q, za5.q, za9.q, za13.q
102c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ1));
103c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ5));
104c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ9));
105c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ13));
106c08dabb0SCullen Rhodes 
107c08dabb0SCullen Rhodes   // za0.s doesn't alias with za1.q, za5.q, za9.q, za13.q
108c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ1));
109c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ5));
110c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ9));
111c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS0, AArch64::ZAQ13));
112c08dabb0SCullen Rhodes 
113c08dabb0SCullen Rhodes   // za1.s doesn't alias with za0.q, za4.q, za8.q, za12.q
114c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ0));
115c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ4));
116c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ8));
117c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAS1, AArch64::ZAQ12));
118c08dabb0SCullen Rhodes 
119c08dabb0SCullen Rhodes   // za0.d aliases za0.q and za8.q
120c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ0));
121c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ8));
122c08dabb0SCullen Rhodes 
123c08dabb0SCullen Rhodes   // za1.d aliases za1.q and za9.q
124c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ1));
125c08dabb0SCullen Rhodes   ASSERT_TRUE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ9));
126c08dabb0SCullen Rhodes 
127c08dabb0SCullen Rhodes   // za0.d doesn't alias with za1.q and za9.q
128c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ1));
129c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD0, AArch64::ZAQ9));
130c08dabb0SCullen Rhodes 
131c08dabb0SCullen Rhodes   // za1.d doesn't alias with za0.q and za8.q
132c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ0));
133c08dabb0SCullen Rhodes   ASSERT_FALSE(TRI.regsOverlap(AArch64::ZAD1, AArch64::ZAQ8));
134c08dabb0SCullen Rhodes }
135c08dabb0SCullen Rhodes 
136c08dabb0SCullen Rhodes } // end anonymous namespace
137