@@ -832,9 +832,10 @@ define void @foo(ptr %ptr, i8 %v1, i8 %v2, i8 %v3, i8 %v4, i8 %v5) {
832
832
}
833
833
}
834
834
835
+ // Check that the DAG gets updated when we create a new instruction.
835
836
TEST_F (DependencyGraphTest, CreateInstrCallback) {
836
837
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 ) {
838
839
store i8 %v1, ptr %ptr
839
840
store i8 %v2, ptr %ptr
840
841
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) {
851
852
auto *S3 = cast<sandboxir::StoreInst>(&*It++);
852
853
auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
853
854
854
- // Check new instruction callback.
855
855
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 );
858
860
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 ;
859
867
{
868
+ // Create a new store before S3 (within the span of the DAG).
860
869
sandboxir::StoreInst *NewS =
861
- sandboxir::StoreInst::create (Arg , Ptr , Align (8 ), S3->getIterator (),
870
+ sandboxir::StoreInst::create (ArgNew1 , Ptr , Align (8 ), S3->getIterator (),
862
871
/* IsVolatile=*/ true , Ctx);
863
- auto *NewSN = DAG.getNode (NewS);
864
- EXPECT_TRUE (NewSN != nullptr );
865
-
866
872
// 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));
874
883
}
875
-
876
884
{
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) .
878
886
sandboxir::StoreInst *NewS =
879
- sandboxir::StoreInst::create (Arg , Ptr , Align (8 ), BB-> end (),
887
+ sandboxir::StoreInst::create (ArgNew2 , Ptr , Align (8 ), Ret-> getIterator (),
880
888
/* IsVolatile=*/ true , Ctx);
881
889
// 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));
887
900
}
888
-
889
- // TODO: Check the dependencies to/from NewSN after they land.
890
901
}
891
902
892
903
TEST_F (DependencyGraphTest, EraseInstrCallback) {
0 commit comments