@@ -6081,6 +6081,72 @@ TEST_F(SandboxIRTest, InstructionCallbacks) {
60816081 EXPECT_THAT (Moved, testing::IsEmpty ());
60826082}
60836083
6084+ // Check callbacks when we set a Use.
6085+ TEST_F (SandboxIRTest, SetUseCallbacks) {
6086+ parseIR (C, R"IR(
6087+ define void @foo(i8 %v0, i8 %v1) {
6088+ %add0 = add i8 %v0, %v1
6089+ %add1 = add i8 %add0, %v1
6090+ ret void
6091+ }
6092+ )IR" );
6093+ llvm::Function *LLVMF = &*M->getFunction (" foo" );
6094+ sandboxir::Context Ctx (C);
6095+ auto *F = Ctx.createFunction (LLVMF);
6096+ auto *Arg0 = F->getArg (0 );
6097+ auto *BB = &*F->begin ();
6098+ auto It = BB->begin ();
6099+ auto *Add0 = cast<sandboxir::BinaryOperator>(&*It++);
6100+ auto *Add1 = cast<sandboxir::BinaryOperator>(&*It++);
6101+
6102+ SmallVector<std::pair<sandboxir::Use, sandboxir::Value *>> UsesSet;
6103+ auto Id = Ctx.registerSetUseCallback (
6104+ [&UsesSet](sandboxir::Use U, sandboxir::Value *NewSrc) {
6105+ UsesSet.push_back ({U, NewSrc});
6106+ });
6107+
6108+ // Now change %add1 operand to not use %add0.
6109+ Add1->setOperand (0 , Arg0);
6110+ EXPECT_EQ (UsesSet.size (), 1u );
6111+ EXPECT_EQ (UsesSet[0 ].first .get (), Add1->getOperandUse (0 ).get ());
6112+ EXPECT_EQ (UsesSet[0 ].second , Arg0);
6113+ // Restore to previous state.
6114+ Add1->setOperand (0 , Add0);
6115+ UsesSet.clear ();
6116+
6117+ // RAUW
6118+ Add0->replaceAllUsesWith (Arg0);
6119+ EXPECT_EQ (UsesSet.size (), 1u );
6120+ EXPECT_EQ (UsesSet[0 ].first .get (), Add1->getOperandUse (0 ).get ());
6121+ EXPECT_EQ (UsesSet[0 ].second , Arg0);
6122+ // Restore to previous state.
6123+ Add1->setOperand (0 , Add0);
6124+ UsesSet.clear ();
6125+
6126+ // RUWIf
6127+ Add0->replaceUsesWithIf (Arg0, [](const auto &U) { return true ; });
6128+ EXPECT_EQ (UsesSet.size (), 1u );
6129+ EXPECT_EQ (UsesSet[0 ].first .get (), Add1->getOperandUse (0 ).get ());
6130+ EXPECT_EQ (UsesSet[0 ].second , Arg0);
6131+ // Restore to previous state.
6132+ Add1->setOperand (0 , Add0);
6133+ UsesSet.clear ();
6134+
6135+ // RUOW
6136+ Add1->replaceUsesOfWith (Add0, Arg0);
6137+ EXPECT_EQ (UsesSet.size (), 1u );
6138+ EXPECT_EQ (UsesSet[0 ].first .get (), Add1->getOperandUse (0 ).get ());
6139+ EXPECT_EQ (UsesSet[0 ].second , Arg0);
6140+ // Restore to previous state.
6141+ Add1->setOperand (0 , Add0);
6142+ UsesSet.clear ();
6143+
6144+ // Check unregister.
6145+ Ctx.unregisterSetUseCallback (Id);
6146+ Add0->replaceAllUsesWith (Arg0);
6147+ EXPECT_TRUE (UsesSet.empty ());
6148+ }
6149+
60846150TEST_F (SandboxIRTest, FunctionObjectAlreadyExists) {
60856151 parseIR (C, R"IR(
60866152define void @foo() {
0 commit comments