[flang-commits] [flang] d8222d9 - [flang] Lower format statement

Valentin Clement via flang-commits flang-commits at lists.llvm.org
Mon Mar 14 10:15:37 PDT 2022


Author: Valentin Clement
Date: 2022-03-14T18:15:32+01:00
New Revision: d8222d91c6f41725aa7669bea24932e072bc2767

URL: https://github.com/llvm/llvm-project/commit/d8222d91c6f41725aa7669bea24932e072bc2767
DIFF: https://github.com/llvm/llvm-project/commit/d8222d91c6f41725aa7669bea24932e072bc2767.diff

LOG: [flang] Lower format statement

This patch lowers the format statement.

Reviewed By: PeteSteinfeld

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

Added: 
    flang/test/Lower/format-statement.f90

Modified: 
    flang/lib/Lower/Bridge.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index dd818759cf0ce..17c6393cc9e39 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -1916,7 +1916,10 @@ class FirConverter : public Fortran::lower::AbstractConverter {
   }
 
   void genFIR(const Fortran::parser::FormatStmt &) {
-    TODO(toLocation(), "FormatStmt lowering");
+    // do nothing.
+
+    // FORMAT statements have no semantics. They may be lowered if used by a
+    // data transfer statement.
   }
 
   void genFIR(const Fortran::parser::PauseStmt &stmt) {

diff  --git a/flang/test/Lower/format-statement.f90 b/flang/test/Lower/format-statement.f90
new file mode 100644
index 0000000000000..8f8d86e9dd759
--- /dev/null
+++ b/flang/test/Lower/format-statement.f90
@@ -0,0 +1,59 @@
+! RUN: bbc %s -o - | FileCheck %s
+
+! CHECK-LABEL: func @_QPformatassign
+subroutine formatAssign(flag1, flag2, flag3)
+    real :: pi
+    integer :: label
+    logical :: flag1, flag2, flag3
+
+    ! CHECK-DAG: %[[ONE:.*]] = arith.constant 100 : i32
+    ! CHECK-DAG: %[[TWO:.*]] = arith.constant 200 : i32
+    if (flag1) then
+       assign 100 to label
+    else
+       assign 200 to label
+    end if
+
+    ! CHECK: cond_br %{{.*}}, ^bb[[BLK1:.*]], ^bb[[BLK2:.*]]
+    ! CHECK: ^bb[[BLK1]]:
+    ! CHECK: fir.store %[[ONE]]
+    ! CHECK: br ^bb[[END_BLOCK:.*]]
+    ! CHECK: ^bb[[BLK2]]:
+    ! CHECK: fir.store %[[TWO]]
+    ! CHECK: br ^bb[[END_BLOCK]]
+    ! CHECK: ^bb[[END_BLOCK]]
+    ! CHECK: fir.call @{{.*}}BeginExternalFormattedOutput
+    ! CHECK: fir.call @{{.*}}OutputAscii
+    ! CHECK: fir.call @{{.*}}OutputReal32
+    ! CHECK: fir.call @{{.*}}EndIoStatement
+    pi = 3.141592653589
+    write(*, label) " PI=", pi
+    ! CHECK: fir.call @{{.*}}BeginExternalFormattedOutput
+    ! CHECK: fir.call @{{.*}}OutputAscii
+    ! CHECK: fir.call @{{.*}}OutputReal32
+    ! CHECK: fir.call @{{.*}}EndIoStatement
+    if (flag2) write(*, label) "2PI=", 2*pi
+    if (flag1 .and. flag2 .and. flag3) then
+       assign 100 to label
+    else
+       assign 200 to label
+    end if
+    if (flag3) then
+      ! CHECK: fir.call @{{.*}}BeginExternalFormattedOutput
+      ! CHECK: fir.call @{{.*}}OutputAscii
+      ! CHECK: fir.call @{{.*}}OutputReal32
+      ! CHECK: fir.call @{{.*}}EndIoStatement
+      write(*, label) "3PI=", 3*pi
+    endif
+
+100 format (A, F10.3)
+200 format (A,E8.1)
+300 format (A, E4.2)
+
+end subroutine
+
+! CHECK-LABEL: func @_QQmain
+  call formatAssign(.true., .true., .true.)
+  print*
+  call formatAssign(.true., .false., .true.)
+end


        


More information about the flang-commits mailing list