[flang] Source code location for IF statements and constructs (#90853)
Make source code locations for IF statements and IF construct component statements more accurate. Make similar changes to ASSOCIATE, BLOCK, and SELECT TYPE construct component statements.
This commit is contained in:
parent
9c8b0d4ef6
commit
cda8270981
@ -2055,17 +2055,19 @@ private:
|
||||
/// Generate structured or unstructured FIR for an IF construct.
|
||||
/// The initial statement may be either an IfStmt or an IfThenStmt.
|
||||
void genFIR(const Fortran::parser::IfConstruct &) {
|
||||
mlir::Location loc = toLocation();
|
||||
Fortran::lower::pft::Evaluation &eval = getEval();
|
||||
|
||||
// Structured fir.if nest.
|
||||
if (eval.lowerAsStructured()) {
|
||||
// Structured fir.if nest.
|
||||
fir::IfOp topIfOp, currentIfOp;
|
||||
for (Fortran::lower::pft::Evaluation &e : eval.getNestedEvaluations()) {
|
||||
auto genIfOp = [&](mlir::Value cond) {
|
||||
auto ifOp = builder->create<fir::IfOp>(loc, cond, /*withElse=*/true);
|
||||
auto ifOp =
|
||||
builder->create<fir::IfOp>(toLocation(), cond, /*withElse=*/true);
|
||||
builder->setInsertionPointToStart(&ifOp.getThenRegion().front());
|
||||
return ifOp;
|
||||
};
|
||||
setCurrentPosition(e.position);
|
||||
if (auto *s = e.getIf<Fortran::parser::IfThenStmt>()) {
|
||||
topIfOp = currentIfOp = genIfOp(genIfCondition(s, e.negateCondition));
|
||||
} else if (auto *s = e.getIf<Fortran::parser::IfStmt>()) {
|
||||
@ -2096,6 +2098,7 @@ private:
|
||||
else // non-empty block
|
||||
genConditionalBranch(cond, e.lexicalSuccessor, e.controlSuccessor);
|
||||
};
|
||||
setCurrentPosition(e.position);
|
||||
if (auto *s = e.getIf<Fortran::parser::IfThenStmt>()) {
|
||||
maybeStartBlock(e.block);
|
||||
genIfBranch(genIfCondition(s, e.negateCondition));
|
||||
@ -2863,6 +2866,7 @@ private:
|
||||
Fortran::lower::StatementContext stmtCtx;
|
||||
pushActiveConstruct(eval, stmtCtx);
|
||||
for (Fortran::lower::pft::Evaluation &e : eval.getNestedEvaluations()) {
|
||||
setCurrentPosition(e.position);
|
||||
if (auto *stmt = e.getIf<Fortran::parser::AssociateStmt>()) {
|
||||
if (eval.lowerAsUnstructured())
|
||||
maybeStartBlock(e.block);
|
||||
@ -2891,10 +2895,10 @@ private:
|
||||
Fortran::lower::StatementContext stmtCtx;
|
||||
pushActiveConstruct(eval, stmtCtx);
|
||||
for (Fortran::lower::pft::Evaluation &e : eval.getNestedEvaluations()) {
|
||||
setCurrentPosition(e.position);
|
||||
if (e.getIf<Fortran::parser::BlockStmt>()) {
|
||||
if (eval.lowerAsUnstructured())
|
||||
maybeStartBlock(e.block);
|
||||
setCurrentPosition(e.position);
|
||||
const Fortran::parser::CharBlock &endPosition =
|
||||
eval.getLastNestedEvaluation().position;
|
||||
localSymbols.pushScope();
|
||||
@ -2921,7 +2925,6 @@ private:
|
||||
} else if (e.getIf<Fortran::parser::EndBlockStmt>()) {
|
||||
if (eval.lowerAsUnstructured())
|
||||
maybeStartBlock(e.block);
|
||||
setCurrentPosition(e.position);
|
||||
localSymbols.popScope();
|
||||
} else {
|
||||
genFIR(e);
|
||||
@ -2963,7 +2966,6 @@ private:
|
||||
}
|
||||
|
||||
void genFIR(const Fortran::parser::SelectTypeConstruct &selectTypeConstruct) {
|
||||
mlir::Location loc = toLocation();
|
||||
mlir::MLIRContext *context = builder->getContext();
|
||||
Fortran::lower::StatementContext stmtCtx;
|
||||
fir::ExtendedValue selector;
|
||||
@ -2989,6 +2991,8 @@ private:
|
||||
pushActiveConstruct(getEval(), stmtCtx);
|
||||
for (Fortran::lower::pft::Evaluation &eval :
|
||||
getEval().getNestedEvaluations()) {
|
||||
setCurrentPosition(eval.position);
|
||||
mlir::Location loc = toLocation();
|
||||
if (auto *selectTypeStmt =
|
||||
eval.getIf<Fortran::parser::SelectTypeStmt>()) {
|
||||
// A genFIR(SelectTypeStmt) call would have unwanted side effects.
|
||||
|
34
flang/test/Lower/if-loc.f90
Normal file
34
flang/test/Lower/if-loc.f90
Normal file
@ -0,0 +1,34 @@
|
||||
! RUN: bbc -emit-hlfir -mlir-print-debuginfo -o - %s | FileCheck %s
|
||||
|
||||
integer :: n = 0, x = 1
|
||||
if (x .ne. 1) goto 9
|
||||
n = n + 1
|
||||
if (x .gt. 1) goto 9
|
||||
n = n + 1
|
||||
9 print *, 'n =', n
|
||||
end
|
||||
|
||||
! CHECK-LABEL: c.func @_QQmain
|
||||
! CHECK: %[[V_0:[0-9]+]] = fir.address_of(@_QFEn) : !fir.ref<i32> loc("{{.*}}if-loc.f90":3:
|
||||
! CHECK: %[[V_1:[0-9]+]]:2 = hlfir.declare %[[V_0]] {uniq_name = "_QFEn"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) loc("{{.*}}if-loc.f90":3:
|
||||
! CHECK: %[[V_2:[0-9]+]] = fir.address_of(@_QFEx) : !fir.ref<i32> loc("{{.*}}if-loc.f90":3:
|
||||
! CHECK: %[[V_3:[0-9]+]]:2 = hlfir.declare %[[V_2]] {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) loc("{{.*}}if-loc.f90":3:
|
||||
! CHECK: %[[V_4:[0-9]+]] = fir.load %[[V_3]]#0 : !fir.ref<i32> loc("{{.*}}if-loc.f90":4:
|
||||
! CHECK: %[[V_5:[0-9]+]] = arith.cmpi ne, %[[V_4]], %c1{{.*}} : i32 loc("{{.*}}if-loc.f90":4:
|
||||
! CHECK: %[[V_6:[0-9]+]] = arith.xori %[[V_5]], %true{{[_0-9]*}} : i1 loc("{{.*}}if-loc.f90":4:
|
||||
! CHECK: fir.if %[[V_6]] {
|
||||
! CHECK: %[[V_18:[0-9]+]] = fir.load %[[V_1]]#0 : !fir.ref<i32> loc("{{.*}}if-loc.f90":5:
|
||||
! CHECK: %[[V_19:[0-9]+]] = arith.addi %[[V_18]], %c1{{.*}} : i32 loc("{{.*}}if-loc.f90":5:
|
||||
! CHECK: hlfir.assign %[[V_19]] to %[[V_1]]#0 : i32, !fir.ref<i32> loc("{{.*}}if-loc.f90":5:
|
||||
! CHECK: %[[V_20:[0-9]+]] = fir.load %[[V_3]]#0 : !fir.ref<i32> loc("{{.*}}if-loc.f90":6:
|
||||
! CHECK: %[[V_21:[0-9]+]] = arith.cmpi sgt, %[[V_20]], %c1{{.*}} : i32 loc("{{.*}}if-loc.f90":6:
|
||||
! CHECK: %[[V_22:[0-9]+]] = arith.xori %[[V_21]], %true{{[_0-9]*}} : i1 loc("{{.*}}if-loc.f90":6:
|
||||
! CHECK: fir.if %[[V_22]] {
|
||||
! CHECK: %[[V_23:[0-9]+]] = fir.load %[[V_1]]#0 : !fir.ref<i32> loc("{{.*}}if-loc.f90":7:
|
||||
! CHECK: %[[V_24:[0-9]+]] = arith.addi %[[V_23]], %c1{{.*}} : i32 loc("{{.*}}if-loc.f90":7:
|
||||
! CHECK: hlfir.assign %[[V_24]] to %[[V_1]]#0 : i32, !fir.ref<i32> loc("{{.*}}if-loc.f90":7:
|
||||
! CHECK: }
|
||||
! CHECK: }
|
||||
! CHECK: %[[V_9:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput{{.*}} loc("{{.*}}if-loc.f90":8:
|
||||
! CHECK: return loc("{{.*}}if-loc.f90":9:
|
||||
! CHECK:}
|
Loading…
x
Reference in New Issue
Block a user