[flang-commits] [flang] 591e3e6 - [flang] Make EndProgramStmt a NOP + early return
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Wed Feb 1 06:55:33 PST 2023
Author: Valentin Clement
Date: 2023-02-01T15:55:23+01:00
New Revision: 591e3e6207894ebaee1e47a82fcfb3b246459f76
URL: https://github.com/llvm/llvm-project/commit/591e3e6207894ebaee1e47a82fcfb3b246459f76
DIFF: https://github.com/llvm/llvm-project/commit/591e3e6207894ebaee1e47a82fcfb3b246459f76.diff
LOG: [flang] Make EndProgramStmt a NOP + early return
Fix done in D143055 can be simpler by making EndProgramStmt a NOP
and dealing with the exit in `endNewFunction` in a centralize way.
Also add finalization when there is an early exit in the main
program.
Reviewed By: jeanPerier
Differential Revision: https://reviews.llvm.org/D143065
Added:
Modified:
flang/lib/Lower/Bridge.cpp
flang/test/Lower/derived-type-finalization.f90
Removed:
################################################################################
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 492176f2e130..9033ab8026c2 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -950,7 +950,6 @@ class FirConverter : public Fortran::lower::AbstractConverter {
if (blockIsUnterminated())
builder->create<mlir::func::ReturnOp>(toLocation());
}
- void genFIR(const Fortran::parser::EndProgramStmt &) { genExitRoutine(); }
/// END of procedure-like constructs
///
@@ -3059,6 +3058,7 @@ class FirConverter : public Fortran::lower::AbstractConverter {
getEval().getOwningProcedure();
assert(funit && "not inside main program, function or subroutine");
if (funit->isMainProgram()) {
+ bridge.fctCtx().finalizeAndKeep();
genExitRoutine();
return;
}
@@ -3114,6 +3114,7 @@ class FirConverter : public Fortran::lower::AbstractConverter {
void genFIR(const Fortran::parser::EndFunctionStmt &) {} // nop
void genFIR(const Fortran::parser::EndIfStmt &) {} // nop
void genFIR(const Fortran::parser::EndMpSubprogramStmt &) {} // nop
+ void genFIR(const Fortran::parser::EndProgramStmt &) {} // nop
void genFIR(const Fortran::parser::EndSelectStmt &) {} // nop
void genFIR(const Fortran::parser::EndSubroutineStmt &) {} // nop
void genFIR(const Fortran::parser::EntryStmt &) {} // nop
@@ -3438,16 +3439,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
void endNewFunction(Fortran::lower::pft::FunctionLikeUnit &funit) {
setCurrentPosition(Fortran::lower::pft::stmtSourceLoc(funit.endStmt));
if (funit.isMainProgram()) {
- if (!blockIsUnterminated()) {
- auto insertPt = builder->saveInsertionPoint();
- mlir::Block *currentBlock = builder->getBlock();
- builder->setInsertionPoint(¤tBlock->back());
- bridge.fctCtx().finalizeAndPop();
- builder->restoreInsertionPoint(insertPt);
- } else {
- bridge.fctCtx().finalizeAndPop();
- genExitRoutine();
- }
+ bridge.fctCtx().finalizeAndPop();
+ genExitRoutine();
} else {
genFIRProcedureExit(funit, funit.getSubprogramSymbol());
}
diff --git a/flang/test/Lower/derived-type-finalization.f90 b/flang/test/Lower/derived-type-finalization.f90
index 6dcf7cf41ffd..fae1cdc32bf8 100644
--- a/flang/test/Lower/derived-type-finalization.f90
+++ b/flang/test/Lower/derived-type-finalization.f90
@@ -153,12 +153,20 @@ subroutine test_finalize_intent_out(t)
program p
use derived_type_finalization
type(t1) :: t
+ if (t%a == 10) return
print *, 'end of program'
end program
! CHECK-LABEL: func.func @_QQmain() {
! CHECK: %[[T:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "t", uniq_name = "_QFEt"}
-! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
-! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> none
-! CHECK: return
+! CHECK: cf.cond_br %{{.*}}, ^bb1, ^bb2
+! CHECK: ^bb1:
+! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
+! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
+! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> none
+! CHECK: return
+! CHECK: ^bb2:
+! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
+! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
+! CHECK: %{{.*}} = fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> none
+! CHECK: return
More information about the flang-commits
mailing list