xref: /llvm-project/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp (revision 500e3ead9fa5cf27e8dcadae509ffbe93ee0d3bb)
1 //===- CSETest.cpp -----------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "GISelMITest.h"
11 #include "llvm/CodeGen/GlobalISel/CSEMIRBuilder.h"
12 
13 namespace {
14 
15 TEST_F(GISelMITest, TestCSE) {
16   if (!TM)
17     return;
18 
19   LLT s16{LLT::scalar(16)};
20   LLT s32{LLT::scalar(32)};
21   auto MIBInput = B.buildInstr(TargetOpcode::G_TRUNC, {s16}, {Copies[0]});
22   auto MIBInput1 = B.buildInstr(TargetOpcode::G_TRUNC, {s16}, {Copies[1]});
23   auto MIBAdd = B.buildInstr(TargetOpcode::G_ADD, {s16}, {MIBInput, MIBInput});
24   GISelCSEInfo CSEInfo;
25   CSEInfo.setCSEConfig(make_unique<CSEConfig>());
26   CSEInfo.analyze(*MF);
27   B.setCSEInfo(&CSEInfo);
28   CSEMIRBuilder CSEB(B.getState());
29   CSEB.setInsertPt(*EntryMBB, EntryMBB->begin());
30   unsigned AddReg = MRI->createGenericVirtualRegister(s16);
31   auto MIBAddCopy =
32       CSEB.buildInstr(TargetOpcode::G_ADD, {AddReg}, {MIBInput, MIBInput});
33   ASSERT_EQ(MIBAddCopy->getOpcode(), TargetOpcode::COPY);
34   auto MIBAdd2 =
35       CSEB.buildInstr(TargetOpcode::G_ADD, {s16}, {MIBInput, MIBInput});
36   ASSERT_TRUE(&*MIBAdd == &*MIBAdd2);
37   auto MIBAdd4 =
38       CSEB.buildInstr(TargetOpcode::G_ADD, {s16}, {MIBInput, MIBInput});
39   ASSERT_TRUE(&*MIBAdd == &*MIBAdd4);
40   auto MIBAdd5 =
41       CSEB.buildInstr(TargetOpcode::G_ADD, {s16}, {MIBInput, MIBInput1});
42   ASSERT_TRUE(&*MIBAdd != &*MIBAdd5);
43 
44   // Try building G_CONSTANTS.
45   auto MIBCst = CSEB.buildConstant(s32, 0);
46   auto MIBCst1 = CSEB.buildConstant(s32, 0);
47   ASSERT_TRUE(&*MIBCst == &*MIBCst1);
48   // Try the CFing of BinaryOps.
49   auto MIBCF1 = CSEB.buildInstr(TargetOpcode::G_ADD, {s32}, {MIBCst, MIBCst});
50   ASSERT_TRUE(&*MIBCF1 == &*MIBCst);
51 
52   // Try out building FCONSTANTs.
53   auto MIBFP0 = CSEB.buildFConstant(s32, 1.0);
54   auto MIBFP0_1 = CSEB.buildFConstant(s32, 1.0);
55   ASSERT_TRUE(&*MIBFP0 == &*MIBFP0_1);
56   CSEInfo.print();
57 
58   // Check G_UNMERGE_VALUES
59   auto MIBUnmerge = CSEB.buildUnmerge({s32, s32}, Copies[0]);
60   auto MIBUnmerge2 = CSEB.buildUnmerge({s32, s32}, Copies[0]);
61   ASSERT_TRUE(&*MIBUnmerge == &*MIBUnmerge2);
62 }
63 
64 TEST_F(GISelMITest, TestCSEConstantConfig) {
65   if (!TM)
66     return;
67 
68   LLT s16{LLT::scalar(16)};
69   auto MIBInput = B.buildInstr(TargetOpcode::G_TRUNC, {s16}, {Copies[0]});
70   auto MIBAdd = B.buildInstr(TargetOpcode::G_ADD, {s16}, {MIBInput, MIBInput});
71   auto MIBZero = B.buildConstant(s16, 0);
72   GISelCSEInfo CSEInfo;
73   CSEInfo.setCSEConfig(make_unique<CSEConfigConstantOnly>());
74   CSEInfo.analyze(*MF);
75   B.setCSEInfo(&CSEInfo);
76   CSEMIRBuilder CSEB(B.getState());
77   CSEB.setInsertPt(*EntryMBB, EntryMBB->begin());
78   auto MIBAdd1 =
79       CSEB.buildInstr(TargetOpcode::G_ADD, {s16}, {MIBInput, MIBInput});
80   // We should CSE constants only. Adds should not be CSEd.
81   ASSERT_TRUE(MIBAdd1->getOpcode() != TargetOpcode::COPY);
82   ASSERT_TRUE(&*MIBAdd1 != &*MIBAdd);
83   // We should CSE constant.
84   auto MIBZeroTmp = CSEB.buildConstant(s16, 0);
85   ASSERT_TRUE(&*MIBZero == &*MIBZeroTmp);
86 }
87 } // namespace
88