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