@@ -2440,6 +2440,58 @@ void testDiagnostics(void) {
24402440 mlirContextDestroy (ctx );
24412441}
24422442
2443+ int testBlockPredecessorsSuccessors (MlirContext ctx ) {
2444+ // CHECK-LABEL: @testBlockPredecessorsSuccessors
2445+ fprintf (stderr , "@testBlockPredecessorsSuccessors\n" );
2446+
2447+ const char * moduleString = R "(
2448+ #loc2 = loc (" arg1 ")
2449+ #loc3 = loc("middle")
2450+ #loc4 = loc("successor")
2451+ module {
2452+ func .func @test (%arg0 : i32 loc ("arg0" ), %arg1 : i16 loc ("arg1" )) {
2453+ cf .br ^bb1 (%arg1 : i16 ) loc (#loc )
2454+ ^bb1 (%0 : i16 loc ("middle" )): // pred: ^bb0
2455+ cf .br ^bb2 (%arg0 : i32 ) loc (#loc )
2456+ ^bb2 (%1 : i32 loc ("successor" )): // pred: ^bb1
2457+ return loc (#loc )
2458+ } loc (#loc )
2459+ } loc (#loc )
2460+ #loc = loc(unknown)
2461+ )";
2462+
2463+ MlirModule module =
2464+ mlirModuleCreateParse (ctx , mlirStringRefCreateFromCString (moduleString ));
2465+
2466+ MlirOperation moduleOp = mlirModuleGetOperation (module );
2467+ MlirRegion moduleRegion = mlirOperationGetRegion (moduleOp , 0 );
2468+ MlirBlock moduleBlock = mlirRegionGetFirstBlock (moduleRegion );
2469+ MlirOperation function = mlirBlockGetFirstOperation (moduleBlock );
2470+ MlirRegion funcRegion = mlirOperationGetRegion (function , 0 );
2471+ MlirBlock entryBlock = mlirRegionGetFirstBlock (funcRegion );
2472+ MlirBlock middleBlock = mlirBlockGetNextInRegion (entryBlock );
2473+ MlirBlock successorBlock = mlirBlockGetNextInRegion (middleBlock );
2474+
2475+ assert (mlirBlockGetNumPredecessors (entryBlock ) == 0 );
2476+
2477+ assert (mlirBlockGetNumSuccessors (entryBlock ) == 1 );
2478+ assert (mlirBlockEqual (middleBlock , mlirBlockGetSuccessor (entryBlock , 0 )));
2479+ assert (mlirBlockGetNumPredecessors (middleBlock ) == 1 );
2480+ assert (mlirBlockEqual (entryBlock , mlirBlockGetPredecessor (middleBlock , 0 )));
2481+
2482+ assert (mlirBlockGetNumSuccessors (middleBlock ) == 1 );
2483+ assert (mlirBlockEqual (successorBlock , mlirBlockGetSuccessor (middleBlock , 0 )));
2484+ assert (mlirBlockGetNumPredecessors (successorBlock ) == 1 );
2485+ assert (
2486+ mlirBlockEqual (middleBlock , mlirBlockGetPredecessor (successorBlock , 0 )));
2487+
2488+ assert (mlirBlockGetNumSuccessors (successorBlock ) == 0 );
2489+
2490+ mlirModuleDestroy (module );
2491+
2492+ return 0 ;
2493+ }
2494+
24432495int main (void ) {
24442496 MlirContext ctx = mlirContextCreate ();
24452497 registerAllUpstreamDialects (ctx );
@@ -2486,6 +2538,9 @@ int main(void) {
24862538 testExplicitThreadPools ();
24872539 testDiagnostics ();
24882540
2541+ if (testBlockPredecessorsSuccessors (ctx ))
2542+ return 17 ;
2543+
24892544 // CHECK: DESTROY MAIN CONTEXT
24902545 // CHECK: reportResourceDelete: resource_i64_blob
24912546 fprintf (stderr , "DESTROY MAIN CONTEXT\n" );
0 commit comments