Skip to content

Commit 08e4386

Browse files
authored
[flang][fir] update block argument types in boxed-procedure pass (#77914)
The boxed-procedure pass is lowering the fir.boxproc type. Although this is not common, this types may end-up as block arguments (or be part of derived type that are block arguments). Update the pass to update block argument types too.
1 parent 0cb024b commit 08e4386

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

flang/lib/Optimizer/CodeGen/BoxedProcedure.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,19 @@ class BoxedProcedurePass
347347
}
348348
rewriter.finalizeRootUpdate(op);
349349
}
350+
// Ensure block arguments are updated if needed.
351+
if (op->getNumRegions() != 0) {
352+
rewriter.startRootUpdate(op);
353+
for (mlir::Region &region : op->getRegions())
354+
for (mlir::Block &block : region.getBlocks())
355+
for (mlir::BlockArgument blockArg : block.getArguments())
356+
if (typeConverter.needsConversion(blockArg.getType())) {
357+
mlir::Type toTy =
358+
typeConverter.convertType(blockArg.getType());
359+
blockArg.setType(toTy);
360+
}
361+
rewriter.finalizeRootUpdate(op);
362+
}
350363
});
351364
}
352365
}

flang/test/Fir/boxproc-2.fir

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,32 @@ func.func @proc_pointer_global() {
6565
// CHECK: %[[VAL_0:.*]] = fir.address_of(@ProcedurePointer) : !fir.ref<(!fir.ref<i32>) -> f32>
6666
// CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<(!fir.ref<i32>) -> f32>
6767
}
68+
69+
func.func @block_arg_rewrite(%arg0: !fir.ref<!fir.type<t{p:!fir.boxproc<() -> ()>}>>, %cdt : i1) {
70+
cf.cond_br %cdt, ^bb1, ^bb2
71+
^bb1: // pred: ^bb0
72+
cf.br ^bb3(%arg0 : !fir.ref<!fir.type<t{p:!fir.boxproc<() -> ()>}>>)
73+
^bb2: // pred: ^bb0
74+
%8 = fir.absent !fir.ref<!fir.type<t{p:!fir.boxproc<() -> ()>}>>
75+
cf.br ^bb3(%8 : !fir.ref<!fir.type<t{p:!fir.boxproc<() -> ()>}>>)
76+
^bb3(%9: !fir.ref<!fir.type<t{p:!fir.boxproc<() -> ()>}>>): // 2 preds: ^bb1, ^bb2
77+
cf.br ^bb4
78+
^bb4: // pred: ^bb3
79+
fir.call @dosomething(%9) : (!fir.ref<!fir.type<t{p:!fir.boxproc<() -> ()>}>>) -> ()
80+
return
81+
}
82+
// CHECK-LABEL: func.func @block_arg_rewrite(
83+
// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.type<tUnboxProc{p:() -> ()}>>,
84+
// CHECK-SAME: %[[VAL_1:.*]]: i1) {
85+
// CHECK: cf.cond_br %[[VAL_1]], ^bb1, ^bb2
86+
// CHECK: ^bb1:
87+
// CHECK: cf.br ^bb3(%[[VAL_0]] : !fir.ref<!fir.type<tUnboxProc{p:() -> ()}>>)
88+
// CHECK: ^bb2:
89+
// CHECK: %[[VAL_2:.*]] = fir.absent !fir.ref<!fir.type<tUnboxProc{p:() -> ()}>>
90+
// CHECK: cf.br ^bb3(%[[VAL_2]] : !fir.ref<!fir.type<tUnboxProc{p:() -> ()}>>)
91+
// CHECK: ^bb3(%[[VAL_3:.*]]: !fir.ref<!fir.type<tUnboxProc{p:() -> ()}>>):
92+
// CHECK: cf.br ^bb4
93+
// CHECK: ^bb4:
94+
// CHECK: fir.call @dosomething(%[[VAL_3]]) : (!fir.ref<!fir.type<tUnboxProc{p:() -> ()}>>) -> ()
95+
96+
func.func private @dosomething(!fir.ref<!fir.type<t{p:!fir.boxproc<() -> ()>}>>)

0 commit comments

Comments
 (0)