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

View File

@ -77,8 +77,13 @@ void Fortran::lower::genStopStatement(
loc, calleeType.getInput(operands.size()), isError));
// Third operand indicates QUIET (default to false).
if (std::get<std::optional<Fortran::parser::ScalarLogicalExpr>>(stmt.t)) {
TODO(loc, "STOP third operand not lowered yet");
if (const auto &quiet =
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 {
operands.push_back(builder.createIntegerConstant(
loc, calleeType.getInput(operands.size()), 0));

View File

@ -28,3 +28,13 @@ subroutine stop_code()
! CHECK: fir.call @_Fortran{{.*}}StopStatement(%[[c42]], %[[false]], %[[false]])
! CHECK-NEXT: fir.unreachable
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