@@ -194,7 +194,7 @@ define void @foo(i8 %v1, ptr %ptr) {
194194 auto *Call = cast<sandboxir::CallInst>(&*It++);
195195 auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
196196
197- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
197+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
198198 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
199199 EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>(DAG.getNode (Store)));
200200 EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>(DAG.getNode (Load)));
@@ -224,7 +224,7 @@ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
224224 auto *S0 = cast<sandboxir::StoreInst>(&*It++);
225225 auto *S1 = cast<sandboxir::StoreInst>(&*It++);
226226 auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
227- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
227+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
228228 auto Span = DAG.extend ({&*BB->begin (), BB->getTerminator ()});
229229 // Check extend().
230230 EXPECT_EQ (Span.top (), &*BB->begin ());
@@ -285,7 +285,7 @@ define i8 @foo(i8 %v0, i8 %v1) {
285285 auto *F = Ctx.createFunction (LLVMF);
286286 auto *BB = &*F->begin ();
287287 auto It = BB->begin ();
288- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
288+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
289289 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
290290
291291 auto *AddN0 = DAG.getNode (cast<sandboxir::BinaryOperator>(&*It++));
@@ -332,7 +332,7 @@ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
332332 auto *S1 = cast<sandboxir::StoreInst>(&*It++);
333333 [[maybe_unused]] auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
334334
335- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
335+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
336336 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
337337
338338 auto *S0N = cast<sandboxir::MemDGNode>(DAG.getNode (S0));
@@ -366,7 +366,7 @@ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
366366 auto *S1 = cast<sandboxir::StoreInst>(&*It++);
367367 auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
368368
369- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
369+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
370370 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
371371
372372 auto *S0N = cast<sandboxir::MemDGNode>(DAG.getNode (S0));
@@ -436,7 +436,7 @@ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
436436 sandboxir::Context Ctx (C);
437437 auto *F = Ctx.createFunction (LLVMF);
438438 auto *BB = &*F->begin ();
439- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
439+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
440440 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
441441 auto It = BB->begin ();
442442 auto *Store0N = cast<sandboxir::MemDGNode>(
@@ -461,7 +461,7 @@ define void @foo(ptr noalias %ptr0, ptr noalias %ptr1, i8 %v0, i8 %v1) {
461461 sandboxir::Context Ctx (C);
462462 auto *F = Ctx.createFunction (LLVMF);
463463 auto *BB = &*F->begin ();
464- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
464+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
465465 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
466466 auto It = BB->begin ();
467467 auto *Store0N = cast<sandboxir::MemDGNode>(
@@ -487,7 +487,7 @@ define void @foo(ptr noalias %ptr0, ptr noalias %ptr1) {
487487 sandboxir::Context Ctx (C);
488488 auto *F = Ctx.createFunction (LLVMF);
489489 auto *BB = &*F->begin ();
490- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
490+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
491491 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
492492 auto It = BB->begin ();
493493 auto *Ld0N = cast<sandboxir::MemDGNode>(
@@ -512,7 +512,7 @@ define void @foo(ptr noalias %ptr0, ptr noalias %ptr1, i8 %v) {
512512 sandboxir::Context Ctx (C);
513513 auto *F = Ctx.createFunction (LLVMF);
514514 auto *BB = &*F->begin ();
515- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
515+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
516516 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
517517 auto It = BB->begin ();
518518 auto *Store0N = cast<sandboxir::MemDGNode>(
@@ -542,7 +542,7 @@ define void @foo(float %v1, float %v2) {
542542 auto *F = Ctx.createFunction (LLVMF);
543543 auto *BB = &*F->begin ();
544544
545- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
545+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
546546 DAG.extend ({&*BB->begin (), BB->getTerminator ()->getPrevNode ()});
547547
548548 auto It = BB->begin ();
@@ -574,7 +574,7 @@ define void @foo() {
574574 auto *F = Ctx.createFunction (LLVMF);
575575 auto *BB = &*F->begin ();
576576
577- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
577+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
578578 DAG.extend ({&*BB->begin (), BB->getTerminator ()->getPrevNode ()});
579579
580580 auto It = BB->begin ();
@@ -606,7 +606,7 @@ define void @foo(i8 %v0, i8 %v1, ptr %ptr) {
606606 auto *F = Ctx.createFunction (LLVMF);
607607 auto *BB = &*F->begin ();
608608
609- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
609+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
610610 DAG.extend ({&*BB->begin (), BB->getTerminator ()->getPrevNode ()});
611611
612612 auto It = BB->begin ();
@@ -637,7 +637,7 @@ define void @foo(ptr %ptr) {
637637 auto *F = Ctx.createFunction (LLVMF);
638638 auto *BB = &*F->begin ();
639639
640- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
640+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
641641 DAG.extend ({&*BB->begin (), BB->getTerminator ()->getPrevNode ()});
642642
643643 auto It = BB->begin ();
@@ -664,7 +664,7 @@ define void @foo(ptr %ptr) {
664664 auto *F = Ctx.createFunction (LLVMF);
665665 auto *BB = &*F->begin ();
666666
667- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
667+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
668668 DAG.extend ({&*BB->begin (), BB->getTerminator ()->getPrevNode ()});
669669
670670 auto It = BB->begin ();
@@ -695,7 +695,7 @@ define void @foo() {
695695 auto *F = Ctx.createFunction (LLVMF);
696696 auto *BB = &*F->begin ();
697697
698- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
698+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
699699 DAG.extend ({&*BB->begin (), BB->getTerminator ()->getPrevNode ()});
700700
701701 auto It = BB->begin ();
@@ -728,7 +728,7 @@ define void @foo(ptr %ptr, i8 %v1, i8 %v2, i8 %v3, i8 %v4, i8 %v5) {
728728 auto *S3 = cast<sandboxir::StoreInst>(&*It++);
729729 auto *S4 = cast<sandboxir::StoreInst>(&*It++);
730730 auto *S5 = cast<sandboxir::StoreInst>(&*It++);
731- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
731+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
732732 {
733733 // Scenario 1: Build new DAG
734734 auto NewIntvl = DAG.extend ({S3, S3});
@@ -788,7 +788,7 @@ define void @foo(ptr %ptr, i8 %v1, i8 %v2, i8 %v3, i8 %v4, i8 %v5) {
788788
789789 {
790790 // Check UnscheduledSuccs when a node is scheduled
791- sandboxir::DependencyGraph DAG (getAA (*LLVMF));
791+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx );
792792 DAG.extend ({S2, S2});
793793 auto *S2N = cast<sandboxir::MemDGNode>(DAG.getNode (S2));
794794 S2N->setScheduled (true );
@@ -798,3 +798,35 @@ define void @foo(ptr %ptr, i8 %v1, i8 %v2, i8 %v3, i8 %v4, i8 %v5) {
798798 EXPECT_EQ (S1N->getNumUnscheduledSuccs (), 0u ); // S1 is scheduled
799799 }
800800}
801+
802+ TEST_F (DependencyGraphTest, CreateInstrCallback) {
803+ parseIR (C, R"IR(
804+ define void @foo(ptr %ptr, i8 %v1, i8 %v2, i8 %v3, i8 %arg) {
805+ store i8 %v1, ptr %ptr
806+ store i8 %v2, ptr %ptr
807+ store i8 %v3, ptr %ptr
808+ ret void
809+ }
810+ )IR" );
811+ llvm::Function *LLVMF = &*M->getFunction (" foo" );
812+ sandboxir::Context Ctx (C);
813+ auto *F = Ctx.createFunction (LLVMF);
814+ auto *BB = &*F->begin ();
815+ auto It = BB->begin ();
816+ auto *S1 = cast<sandboxir::StoreInst>(&*It++);
817+ [[maybe_unused]] auto *S2 = cast<sandboxir::StoreInst>(&*It++);
818+ auto *S3 = cast<sandboxir::StoreInst>(&*It++);
819+
820+ // Check new instruction callback.
821+ sandboxir::DependencyGraph DAG (getAA (*LLVMF), Ctx);
822+ DAG.extend ({S1, S3});
823+ auto *Arg = F->getArg (3 );
824+ auto *Ptr = S1->getPointerOperand ();
825+ sandboxir::StoreInst *NewS =
826+ sandboxir::StoreInst::create (Arg, Ptr, Align (8 ), S3->getIterator (),
827+ /* IsVolatile=*/ true , Ctx);
828+ auto *NewSN = DAG.getNode (NewS);
829+ EXPECT_TRUE (NewSN != nullptr );
830+ // TODO: Check the dependencies to/from NewSN after they land.
831+ // TODO: Check the MemDGNode chain.
832+ }
0 commit comments