23
23
#include " llvm/ADT/DepthFirstIterator.h"
24
24
#include " llvm/ADT/PostOrderIterator.h"
25
25
#include " llvm/ADT/STLExtras.h"
26
+ #include " llvm/Support/DebugLog.h"
26
27
27
28
#include < deque>
28
29
#include < iterator>
29
30
30
31
using namespace mlir ;
31
32
33
+ #define DEBUG_TYPE " region-utils"
34
+
32
35
void mlir::replaceAllUsesInRegionWith (Value orig, Value replacement,
33
36
Region ®ion) {
34
37
for (auto &use : llvm::make_early_inc_range (orig.getUses ())) {
@@ -182,19 +185,34 @@ SmallVector<Value> mlir::makeRegionIsolatedFromAbove(
182
185
// TODO: We could likely merge this with the DCE algorithm below.
183
186
LogicalResult mlir::eraseUnreachableBlocks (RewriterBase &rewriter,
184
187
MutableArrayRef<Region> regions) {
188
+ LDBG () << " Starting eraseUnreachableBlocks with " << regions.size ()
189
+ << " regions" ;
190
+
185
191
// Set of blocks found to be reachable within a given region.
186
192
llvm::df_iterator_default_set<Block *, 16 > reachable;
187
193
// If any blocks were found to be dead.
188
- bool erasedDeadBlocks = false ;
194
+ int erasedDeadBlocks = 0 ;
189
195
190
196
SmallVector<Region *, 1 > worklist;
191
197
worklist.reserve (regions.size ());
192
198
for (Region ®ion : regions)
193
199
worklist.push_back (®ion);
200
+
201
+ LDBG (2 ) << " Initial worklist size: " << worklist.size ();
202
+
194
203
while (!worklist.empty ()) {
195
204
Region *region = worklist.pop_back_val ();
196
- if (region->empty ())
205
+ if (region->empty ()) {
206
+ LDBG (2 ) << " Skipping empty region" ;
197
207
continue ;
208
+ }
209
+
210
+ LDBG (2 ) << " Processing region with " << region->getBlocks ().size ()
211
+ << " blocks" ;
212
+ if (region->getParentOp ())
213
+ LDBG (2 ) << " -> for operation: "
214
+ << OpWithFlags (region->getParentOp (),
215
+ OpPrintingFlags ().skipRegions ());
198
216
199
217
// If this is a single block region, just collect the nested regions.
200
218
if (region->hasOneBlock ()) {
@@ -209,13 +227,17 @@ LogicalResult mlir::eraseUnreachableBlocks(RewriterBase &rewriter,
209
227
for (Block *block : depth_first_ext (®ion->front (), reachable))
210
228
(void )block /* Mark all reachable blocks */ ;
211
229
230
+ LDBG (2 ) << " Found " << reachable.size () << " reachable blocks out of "
231
+ << region->getBlocks ().size () << " total blocks" ;
232
+
212
233
// Collect all of the dead blocks and push the live regions onto the
213
234
// worklist.
214
235
for (Block &block : llvm::make_early_inc_range (*region)) {
215
236
if (!reachable.count (&block)) {
237
+ LDBG () << " Erasing unreachable block: " << █
216
238
block.dropAllDefinedValueUses ();
217
239
rewriter.eraseBlock (&block);
218
- erasedDeadBlocks = true ;
240
+ ++ erasedDeadBlocks;
219
241
continue ;
220
242
}
221
243
@@ -226,7 +248,10 @@ LogicalResult mlir::eraseUnreachableBlocks(RewriterBase &rewriter,
226
248
}
227
249
}
228
250
229
- return success (erasedDeadBlocks);
251
+ LDBG () << " Finished eraseUnreachableBlocks, erased " << erasedDeadBlocks
252
+ << " dead blocks" ;
253
+
254
+ return success (erasedDeadBlocks > 0 );
230
255
}
231
256
232
257
// ===----------------------------------------------------------------------===//
0 commit comments