[flang] Lower format statement
authorValentin Clement <clementval@gmail.com>
Mon, 14 Mar 2022 17:15:16 +0000 (18:15 +0100)
committerValentin Clement <clementval@gmail.com>
Mon, 14 Mar 2022 17:15:32 +0000 (18:15 +0100)
This patch lowers the format statement.

Reviewed By: PeteSteinfeld

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

flang/lib/Lower/Bridge.cpp
flang/test/Lower/format-statement.f90 [new file with mode: 0644]

index dd81875..17c6393 100644 (file)
@@ -1916,7 +1916,10 @@ private:
   }
 
   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 (file)
index 0000000..8f8d86e
--- /dev/null
@@ -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