@@ -832,9 +832,10 @@ define void @foo(ptr %ptr, i8 %v1, i8 %v2, i8 %v3, i8 %v4, i8 %v5) {
832832 }
833833}
834834
835+ // Check that the DAG gets updated when we create a new instruction.
835836TEST_F (DependencyGraphTest, CreateInstrCallback) {
836837 parseIR (C, R"IR(
837- define void @foo(ptr %ptr, ptr noalias %ptr2 , i8 %v1 , i8 %v2 , i8 %v3 , i8 %arg ) {
838+ define void @foo(ptr %ptr, i8 %v1 , i8 %v2 , i8 %v3 , i8 %new1 , i8 %new2 ) {
838839 store i8 %v1, ptr %ptr
839840 store i8 %v2, ptr %ptr
840841 store i8 %v3, ptr %ptr
@@ -851,42 +852,52 @@ define void @foo(ptr %ptr, ptr noalias %ptr2, i8 %v1, i8 %v2, i8 %v3, i8 %arg) {
851852 auto *S3 = cast<sandboxir::StoreInst>(&*It++);
852853 auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
853854
854- // Check new instruction callback.
855855 sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx);
856- DAG.extend ({S1, Ret});
857- auto *Arg = F->getArg (3 );
856+ // Create a DAG spanning S1 to S3.
857+ DAG.extend ({S1, S3});
858+ auto *ArgNew1 = F->getArg (4 );
859+ auto *ArgNew2 = F->getArg (5 );
858860 auto *Ptr = S1->getPointerOperand ();
861+
862+ auto *S1MemN = cast<sandboxir::MemDGNode>(DAG.getNode (S1));
863+ auto *S2MemN = cast<sandboxir::MemDGNode>(DAG.getNode (S2));
864+ auto *S3MemN = cast<sandboxir::MemDGNode>(DAG.getNode (S3));
865+ sandboxir::MemDGNode *New1MemN = nullptr ;
866+ sandboxir::MemDGNode *New2MemN = nullptr ;
859867 {
868+ // Create a new store before S3 (within the span of the DAG).
860869 sandboxir::StoreInst *NewS =
861- sandboxir::StoreInst::create (Arg , Ptr, Align (8 ), S3->getIterator (),
870+ sandboxir::StoreInst::create (ArgNew1 , Ptr, Align (8 ), S3->getIterator (),
862871 /* IsVolatile=*/ true , Ctx);
863- auto *NewSN = DAG.getNode (NewS);
864- EXPECT_TRUE (NewSN != nullptr );
865-
866872 // Check the MemDGNode chain.
867- auto *S2MemN = cast<sandboxir::MemDGNode>(DAG.getNode (S2));
868- auto *NewMemSN = cast<sandboxir::MemDGNode>(NewSN);
869- auto *S3MemN = cast<sandboxir::MemDGNode>(DAG.getNode (S3));
870- EXPECT_EQ (S2MemN->getNextNode (), NewMemSN);
871- EXPECT_EQ (NewMemSN->getPrevNode (), S2MemN);
872- EXPECT_EQ (NewMemSN->getNextNode (), S3MemN);
873- EXPECT_EQ (S3MemN->getPrevNode (), NewMemSN);
873+ New1MemN = cast<sandboxir::MemDGNode>(DAG.getNode (NewS));
874+ EXPECT_EQ (S2MemN->getNextNode (), New1MemN);
875+ EXPECT_EQ (New1MemN->getPrevNode (), S2MemN);
876+ EXPECT_EQ (New1MemN->getNextNode (), S3MemN);
877+ EXPECT_EQ (S3MemN->getPrevNode (), New1MemN);
878+
879+ // Check dependencies.
880+ EXPECT_TRUE (memDependency (S1MemN, New1MemN));
881+ EXPECT_TRUE (memDependency (S2MemN, New1MemN));
882+ EXPECT_TRUE (memDependency (New1MemN, S3MemN));
874883 }
875-
876884 {
877- // Also check if new node is at the end of the BB, after Ret .
885+ // Create a new store before Ret (outside the current DAG) .
878886 sandboxir::StoreInst *NewS =
879- sandboxir::StoreInst::create (Arg , Ptr, Align (8 ), BB-> end (),
887+ sandboxir::StoreInst::create (ArgNew2 , Ptr, Align (8 ), Ret-> getIterator (),
880888 /* IsVolatile=*/ true , Ctx);
881889 // Check the MemDGNode chain.
882- auto *S3MemN = cast<sandboxir::MemDGNode>(DAG.getNode (S3));
883- auto *NewMemSN = cast<sandboxir::MemDGNode>(DAG.getNode (NewS));
884- EXPECT_EQ (S3MemN->getNextNode (), NewMemSN);
885- EXPECT_EQ (NewMemSN->getPrevNode (), S3MemN);
886- EXPECT_EQ (NewMemSN->getNextNode (), nullptr );
890+ New2MemN = cast<sandboxir::MemDGNode>(DAG.getNode (NewS));
891+ EXPECT_EQ (S3MemN->getNextNode (), New2MemN);
892+ EXPECT_EQ (New2MemN->getPrevNode (), S3MemN);
893+ EXPECT_EQ (New2MemN->getNextNode (), nullptr );
894+
895+ // Check dependencies.
896+ EXPECT_TRUE (memDependency (S1MemN, New2MemN));
897+ EXPECT_TRUE (memDependency (S2MemN, New2MemN));
898+ EXPECT_TRUE (memDependency (New1MemN, New2MemN));
899+ EXPECT_TRUE (memDependency (S3MemN, New2MemN));
887900 }
888-
889- // TODO: Check the dependencies to/from NewSN after they land.
890901}
891902
892903TEST_F (DependencyGraphTest, EraseInstrCallback) {
0 commit comments