@@ -29,7 +29,7 @@ struct DependencyGraphTest : public testing::Test {
29
29
}
30
30
};
31
31
32
- TEST_F (DependencyGraphTest, DGNode_IsMem ) {
32
+ TEST_F (DependencyGraphTest, MemDGNode ) {
33
33
parseIR (C, R"IR(
34
34
declare void @llvm.sideeffect()
35
35
declare void @llvm.pseudoprobe(i64, i64, i32, i64)
@@ -66,16 +66,16 @@ define void @foo(i8 %v1, ptr %ptr) {
66
66
67
67
sandboxir::DependencyGraph DAG;
68
68
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)));
79
79
}
80
80
81
81
TEST_F (DependencyGraphTest, Basic) {
@@ -115,3 +115,100 @@ define void @foo(ptr %ptr, i8 %v0, i8 %v1) {
115
115
EXPECT_THAT (N1->memPreds (), testing::ElementsAre (N0));
116
116
EXPECT_THAT (N2->memPreds (), testing::ElementsAre (N1));
117
117
}
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