[flang] Handle logical constant value for quiet in STOP stmt

This patch handles the quiet argument in the STOP statement. It adds
ability to lower LOGICAL constant.

This patch is part of the upstreaming effort from fir-dev branch.

Reviewed By: kiranchandramohan, PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D118897

Co-authored-by: Jean Perier <jperier@nvidia.com>
This commit is contained in:
Valentin Clement 2022-02-04 10:11:46 +01:00
parent b94f09524e
commit cc306740cc
No known key found for this signature in database
GPG Key ID: 086D54783C928776
3 changed files with 23 additions and 3 deletions

View File

@ -59,6 +59,11 @@ public:
return builder.createIntegerConstant(getLoc(), type, value); return builder.createIntegerConstant(getLoc(), type, value);
} }
/// Generate a logical/boolean constant of `value`
mlir::Value genBoolConstant(bool value) {
return builder.createBool(getLoc(), value);
}
ExtValue genval(Fortran::semantics::SymbolRef sym) { ExtValue genval(Fortran::semantics::SymbolRef sym) {
TODO(getLoc(), "genval SymbolRef"); TODO(getLoc(), "genval SymbolRef");
} }
@ -231,7 +236,7 @@ public:
if constexpr (TC == Fortran::common::TypeCategory::Integer) { if constexpr (TC == Fortran::common::TypeCategory::Integer) {
return genIntegerConstant<KIND>(builder.getContext(), value.ToInt64()); return genIntegerConstant<KIND>(builder.getContext(), value.ToInt64());
} else if constexpr (TC == Fortran::common::TypeCategory::Logical) { } else if constexpr (TC == Fortran::common::TypeCategory::Logical) {
TODO(getLoc(), "genval bool constant"); return genBoolConstant(value.IsTrue());
} else if constexpr (TC == Fortran::common::TypeCategory::Real) { } else if constexpr (TC == Fortran::common::TypeCategory::Real) {
TODO(getLoc(), "genval real constant"); TODO(getLoc(), "genval real constant");
} else if constexpr (TC == Fortran::common::TypeCategory::Complex) { } else if constexpr (TC == Fortran::common::TypeCategory::Complex) {

View File

@ -77,8 +77,13 @@ void Fortran::lower::genStopStatement(
loc, calleeType.getInput(operands.size()), isError)); loc, calleeType.getInput(operands.size()), isError));
// Third operand indicates QUIET (default to false). // Third operand indicates QUIET (default to false).
if (std::get<std::optional<Fortran::parser::ScalarLogicalExpr>>(stmt.t)) { if (const auto &quiet =
TODO(loc, "STOP third operand not lowered yet"); std::get<std::optional<Fortran::parser::ScalarLogicalExpr>>(stmt.t)) {
const SomeExpr *expr = Fortran::semantics::GetExpr(*quiet);
assert(expr && "failed getting typed expression");
mlir::Value q = fir::getBase(converter.genExprValue(*expr));
operands.push_back(
builder.createConvert(loc, calleeType.getInput(operands.size()), q));
} else { } else {
operands.push_back(builder.createIntegerConstant( operands.push_back(builder.createIntegerConstant(
loc, calleeType.getInput(operands.size()), 0)); loc, calleeType.getInput(operands.size()), 0));

View File

@ -28,3 +28,13 @@ subroutine stop_code()
! CHECK: fir.call @_Fortran{{.*}}StopStatement(%[[c42]], %[[false]], %[[false]]) ! CHECK: fir.call @_Fortran{{.*}}StopStatement(%[[c42]], %[[false]], %[[false]])
! CHECK-NEXT: fir.unreachable ! CHECK-NEXT: fir.unreachable
end subroutine end subroutine
! CHECK-LABEL stop_quiet_constant
subroutine stop_quiet_constant()
stop, quiet = .true.
! CHECK-DAG: %[[true:.*]] = arith.constant true
! CHECK-DAG: %[[false:.*]] = arith.constant false
! CHECK-DAG: %[[c0:.*]] = arith.constant 0 : i32
! CHECK: fir.call @_Fortran{{.*}}StopStatement(%[[c0]], %[[false]], %[[true]])
! CHECK-NEXT: fir.unreachable
end subroutine