[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