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

Valentin Clement via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 4 01:04:50 PST 2022


clementval updated this revision to Diff 405887.
clementval added a comment.

Remove auto


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D118897/new/

https://reviews.llvm.org/D118897

Files:
  flang/lib/Lower/ConvertExpr.cpp
  flang/lib/Lower/Runtime.cpp
  flang/test/Lower/stop-statement.f90


Index: flang/test/Lower/stop-statement.f90
===================================================================
--- flang/test/Lower/stop-statement.f90
+++ flang/test/Lower/stop-statement.f90
@@ -28,3 +28,13 @@
  ! 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
Index: flang/lib/Lower/Runtime.cpp
===================================================================
--- flang/lib/Lower/Runtime.cpp
+++ flang/lib/Lower/Runtime.cpp
@@ -77,8 +77,13 @@
       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));
Index: flang/lib/Lower/ConvertExpr.cpp
===================================================================
--- flang/lib/Lower/ConvertExpr.cpp
+++ flang/lib/Lower/ConvertExpr.cpp
@@ -59,6 +59,11 @@
     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 @@
     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) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118897.405887.patch
Type: text/x-patch
Size: 2733 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220204/b787bb18/attachment.bin>


More information about the llvm-commits mailing list