@@ -29,7 +29,7 @@ struct DependencyGraphTest : public testing::Test {
2929 }
3030};
3131
32- TEST_F (DependencyGraphTest, DGNode_IsMem ) {
32+ TEST_F (DependencyGraphTest, MemDGNode ) {
3333 parseIR (C, R"IR(
3434declare void @llvm.sideeffect()
3535declare void @llvm.pseudoprobe(i64, i64, i32, i64)
@@ -66,16 +66,16 @@ define void @foo(i8 %v1, ptr %ptr) {
6666
6767 sandboxir::DependencyGraph DAG;
6868 DAG.extend ({&*BB->begin (), BB->getTerminator ()});
69- EXPECT_TRUE (DAG.getNode (Store)-> isMem ( ));
70- EXPECT_TRUE (DAG.getNode (Load)-> isMem ( ));
71- EXPECT_FALSE (DAG.getNode (Add)-> isMem ( ));
72- EXPECT_TRUE (DAG.getNode (StackSave)-> isMem ( ));
73- EXPECT_TRUE (DAG.getNode (StackRestore)-> isMem ( ));
74- EXPECT_FALSE (DAG.getNode (SideEffect)-> isMem ( ));
75- EXPECT_FALSE (DAG.getNode (PseudoProbe)-> isMem ( ));
76- EXPECT_TRUE (DAG.getNode (FakeUse)-> isMem ( ));
77- EXPECT_TRUE (DAG.getNode (Call)-> isMem ( ));
78- EXPECT_FALSE (DAG.getNode (Ret)-> isMem ( ));
69+ EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (Store)));
70+ EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (Load)));
71+ EXPECT_FALSE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (Add)));
72+ EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (StackSave)));
73+ EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (StackRestore)));
74+ EXPECT_FALSE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (SideEffect)));
75+ EXPECT_FALSE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (PseudoProbe)));
76+ EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (FakeUse)));
77+ EXPECT_TRUE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (Call)));
78+ EXPECT_FALSE (isa<llvm::sandboxir::MemDGNode>( DAG.getNode (Ret)));
7979}
8080
8181TEST_F (DependencyGraphTest, Basic) {
@@ -115,3 +115,100 @@ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
115115 EXPECT_THAT (N1->memPreds (), testing::ElementsAre (N0));
116116 EXPECT_THAT (N2->memPreds (), testing::ElementsAre (N1));
117117}
118+
119+ TEST_F (DependencyGraphTest, MemDGNode_getPrevNode_getNextNode) {
120+ parseIR (C, R"IR(
121+ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
122+ store i8 %v0, ptr %ptr
123+ add i8 %v0, %v0
124+ store i8 %v1, ptr %ptr
125+ ret void
126+ }
127+ )IR" );
128+ llvm::Function *LLVMF = &*M->getFunction (" foo" );
129+ sandboxir::Context Ctx (C);
130+ auto *F = Ctx.createFunction (LLVMF);
131+ auto *BB = &*F->begin ();
132+ auto It = BB->begin ();
133+ auto *S0 = cast<sandboxir::StoreInst>(&*It++);
134+ [[maybe_unused]] auto *Add = cast<sandboxir::BinaryOperator>(&*It++);
135+ auto *S1 = cast<sandboxir::StoreInst>(&*It++);
136+ [[maybe_unused]] auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
137+
138+ sandboxir::DependencyGraph DAG;
139+ DAG.extend ({&*BB->begin (), BB->getTerminator ()});
140+
141+ auto *S0N = cast<sandboxir::MemDGNode>(DAG.getNode (S0));
142+ auto *S1N = cast<sandboxir::MemDGNode>(DAG.getNode (S1));
143+
144+ EXPECT_EQ (S0N->getPrevNode (), nullptr );
145+ EXPECT_EQ (S0N->getNextNode (), S1N);
146+
147+ EXPECT_EQ (S1N->getPrevNode (), S0N);
148+ EXPECT_EQ (S1N->getNextNode (), nullptr );
149+ }
150+
151+ TEST_F (DependencyGraphTest, DGNodeRange) {
152+ parseIR (C, R"IR(
153+ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
154+ add i8 %v0, %v0
155+ store i8 %v0, ptr %ptr
156+ add i8 %v0, %v0
157+ store i8 %v1, ptr %ptr
158+ ret void
159+ }
160+ )IR" );
161+ llvm::Function *LLVMF = &*M->getFunction (" foo" );
162+ sandboxir::Context Ctx (C);
163+ auto *F = Ctx.createFunction (LLVMF);
164+ auto *BB = &*F->begin ();
165+ auto It = BB->begin ();
166+ auto *Add0 = cast<sandboxir::BinaryOperator>(&*It++);
167+ auto *S0 = cast<sandboxir::StoreInst>(&*It++);
168+ auto *Add1 = cast<sandboxir::BinaryOperator>(&*It++);
169+ auto *S1 = cast<sandboxir::StoreInst>(&*It++);
170+ auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
171+
172+ sandboxir::DependencyGraph DAG;
173+ DAG.extend ({&*BB->begin (), BB->getTerminator ()});
174+
175+ auto *S0N = cast<sandboxir::MemDGNode>(DAG.getNode (S0));
176+ auto *S1N = cast<sandboxir::MemDGNode>(DAG.getNode (S1));
177+
178+ // Check empty range.
179+ EXPECT_THAT (sandboxir::MemDGNodeIntervalBuilder::makeEmpty (),
180+ testing::ElementsAre ());
181+
182+ // Returns the pointers in Range.
183+ auto getPtrVec = [](const auto &Range) {
184+ SmallVector<const sandboxir::DGNode *> Vec;
185+ for (const sandboxir::DGNode &N : Range)
186+ Vec.push_back (&N);
187+ return Vec;
188+ };
189+ // Both TopN and BotN are memory.
190+ EXPECT_THAT (
191+ getPtrVec (sandboxir::MemDGNodeIntervalBuilder::make ({S0, S1}, DAG)),
192+ testing::ElementsAre (S0N, S1N));
193+ // Only TopN is memory.
194+ EXPECT_THAT (
195+ getPtrVec (sandboxir::MemDGNodeIntervalBuilder::make ({S0, Ret}, DAG)),
196+ testing::ElementsAre (S0N, S1N));
197+ EXPECT_THAT (
198+ getPtrVec (sandboxir::MemDGNodeIntervalBuilder::make ({S0, Add1}, DAG)),
199+ testing::ElementsAre (S0N));
200+ // Only BotN is memory.
201+ EXPECT_THAT (
202+ getPtrVec (sandboxir::MemDGNodeIntervalBuilder::make ({Add0, S1}, DAG)),
203+ testing::ElementsAre (S0N, S1N));
204+ EXPECT_THAT (
205+ getPtrVec (sandboxir::MemDGNodeIntervalBuilder::make ({Add0, S0}, DAG)),
206+ testing::ElementsAre (S0N));
207+ // Neither TopN or BotN is memory.
208+ EXPECT_THAT (
209+ getPtrVec (sandboxir::MemDGNodeIntervalBuilder::make ({Add0, Ret}, DAG)),
210+ testing::ElementsAre (S0N, S1N));
211+ EXPECT_THAT (
212+ getPtrVec (sandboxir::MemDGNodeIntervalBuilder::make ({Add0, Add0}, DAG)),
213+ testing::ElementsAre ());
214+ }
0 commit comments