diff --git a/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp b/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp --- a/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp @@ -77,6 +77,25 @@ auto Undef0 = CSEB.buildUndef(s32); auto Undef1 = CSEB.buildUndef(s32); EXPECT_EQ(&*Undef0, &*Undef1); + + // If the observer is installed to the MF, CSE can also + // track new instructions built without the CSEBuilder and + // the newly built instructions are available for CSEing next + // time a build call is made through the CSEMIRBuilder. + // Additionally, the CSE implememtation lazily hashes instructions + // (every build call) to give chance for the instruction to be fully + // built (say using .addUse().addDef().. so on). + GISelObserverWrapper WrapperObserver(&CSEInfo); + RAIIMFObsDelInstaller Installer(*MF, WrapperObserver); + MachineIRBuilder RegularBuilder(*MF); + RegularBuilder.setInsertPt(*EntryMBB, EntryMBB->begin()); + auto NonCSEFMul = RegularBuilder.buildInstr(TargetOpcode::G_AND) + .addDef(MRI->createGenericVirtualRegister(s32)) + .addUse(Copies[0]) + .addUse(Copies[1]); + auto CSEFMul = + CSEB.buildInstr(TargetOpcode::G_AND, {s32}, {Copies[0], Copies[1]}); + EXPECT_EQ(&*CSEFMul, &*NonCSEFMul); } TEST_F(AArch64GISelMITest, TestCSEConstantConfig) {