[flang-commits] [flang] 3113e3b - [flang] Fold fir.if with a constant condition (#225542)
via flang-commits
flang-commits at lists.llvm.org
Wed Sep 23 18:24:58 PDT 2026
Author: Delaram Talaashrafi
Date: 2026-09-23T21:24:52-04:00
New Revision: 3113e3b63d7e4f480dc30e6438f49a10faa020b0
URL: https://github.com/llvm/llvm-project/commit/3113e3b63d7e4f480dc30e6438f49a10faa020b0
DIFF: https://github.com/llvm/llvm-project/commit/3113e3b63d7e4f480dc30e6438f49a10faa020b0.diff
LOG: [flang] Fold fir.if with a constant condition (#225542)
Use `populateRegionBranchOpInterfaceInliningPattern` to fold `fir.if`
when the condition is a constant. It inlines the region the condition
selects, replacing uses of the `fir.if` results with the operands of
that region's `fir.result`, and erases the `fir.result`. A false
condition with no else region leaves nothing behind.
Added:
flang/test/Fir/if-constant-condition-fold.fir
flang/test/Lower/if-constant-condition.f90
Modified:
flang/lib/Optimizer/Dialect/FIROps.cpp
flang/test/Fir/CUDA/predefined-variables.mlir
flang/test/Lower/Intrinsics/ieee_flag.f90
flang/test/Lower/Intrinsics/ieee_logb.f90
flang/test/Lower/Intrinsics/ieee_max_min.f90
Removed:
################################################################################
diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp
index c0be8756bc592..89f5db6b988e7 100644
--- a/flang/lib/Optimizer/Dialect/FIROps.cpp
+++ b/flang/lib/Optimizer/Dialect/FIROps.cpp
@@ -5850,6 +5850,8 @@ struct FoldPresentAbsentIfOp : public mlir::OpRewritePattern<fir::IfOp> {
void fir::IfOp::getCanonicalizationPatterns(mlir::RewritePatternSet &patterns,
mlir::MLIRContext *context) {
patterns.add<FoldPresentAbsentIfOp>(context);
+ mlir::populateRegionBranchOpInterfaceInliningPattern(
+ patterns, fir::IfOp::getOperationName());
}
//===----------------------------------------------------------------------===//
diff --git a/flang/test/Fir/CUDA/predefined-variables.mlir b/flang/test/Fir/CUDA/predefined-variables.mlir
index ece593e04b642..f2db2c39be608 100644
--- a/flang/test/Fir/CUDA/predefined-variables.mlir
+++ b/flang/test/Fir/CUDA/predefined-variables.mlir
@@ -198,9 +198,7 @@ func.func @_QPsub1(%arg0: !fir.ref<i32> {fir.bindc_name = "i", cuf.data_attr = #
// -----
-func.func @_QMbarPgfoo(%arg0: !fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>, fir.bindc_name = "a"}) attributes {cuf.proc_attr = #cuf.cuda_proc<global>, no_inline} {
- %c100_i32 = arith.constant 100 : i32
- %cond = arith.cmpi sle, %c100_i32, %c100_i32 : i32
+func.func @_QMbarPgfoo(%arg0: !fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>, fir.bindc_name = "a"}, %cond: i1) attributes {cuf.proc_attr = #cuf.cuda_proc<global>, no_inline} {
fir.if %cond {
%0 = fir.address_of(@_QM__fortran_builtinsE__builtin_threadidx) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>
%1 = fir.declare %0 {uniq_name = "_QM__fortran_builtinsE__builtin_threadidx"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>
@@ -220,14 +218,12 @@ func.func @_QMbarPgfoo(%arg0: !fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>,
// -----
-func.func @_QMbarPgfoo2(%arg0: !fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>, fir.bindc_name = "a"}, %arg1: !fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>, fir.bindc_name = "b"}) attributes {cuf.proc_attr = #cuf.cuda_proc<global>, no_inline} {
- %c100_i32 = arith.constant 100 : i32
+func.func @_QMbarPgfoo2(%arg0: !fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>, fir.bindc_name = "a"}, %arg1: !fir.ref<i32> {cuf.data_attr = #cuf.cuda<device>, fir.bindc_name = "b"}, %cond: i1) attributes {cuf.proc_attr = #cuf.cuda_proc<global>, no_inline} {
%0 = fir.address_of(@_QM__fortran_builtinsE__builtin_threadidx) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>
%1 = fir.declare %0 {uniq_name = "_QM__fortran_builtinsE__builtin_threadidx"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>
%2 = fir.coordinate_of %1, x : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>) -> !fir.ref<i32>
%3 = fir.load %2 : !fir.ref<i32>
fir.store %3 to %arg0 : !fir.ref<i32>
- %cond = arith.cmpi sle, %c100_i32, %c100_i32 : i32
fir.if %cond {
%4 = fir.address_of(@_QM__fortran_builtinsE__builtin_threadidx) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>
%5 = fir.declare %4 {uniq_name = "_QM__fortran_builtinsE__builtin_threadidx"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_dim3{x:i32,y:i32,z:i32}>>
diff --git a/flang/test/Fir/if-constant-condition-fold.fir b/flang/test/Fir/if-constant-condition-fold.fir
new file mode 100644
index 0000000000000..4bc5feff5f7d4
--- /dev/null
+++ b/flang/test/Fir/if-constant-condition-fold.fir
@@ -0,0 +1,156 @@
+// RUN: fir-opt --canonicalize %s | FileCheck %s
+
+// CHECK-LABEL: func.func @true_if_with_else(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: i32, %[[P:[^:]*]]: !fir.ref<i32>) {
+// CHECK-NOT: fir.if
+// CHECK: fir.store %[[X]] to %[[P]] : !fir.ref<i32>
+// CHECK-NOT: fir.store %[[Y]]
+func.func @true_if_with_else(%x: i32, %y: i32, %p: !fir.ref<i32>) {
+ %true = arith.constant true
+ fir.if %true {
+ fir.store %x to %p : !fir.ref<i32>
+ } else {
+ fir.store %y to %p : !fir.ref<i32>
+ }
+ return
+}
+
+// CHECK-LABEL: func.func @true_if_results(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: i32) -> i32 {
+// CHECK-NOT: fir.if
+// CHECK: return %[[X]] : i32
+func.func @true_if_results(%x: i32, %y: i32) -> i32 {
+ %true = arith.constant true
+ %r = fir.if %true -> (i32) {
+ fir.result %x : i32
+ } else {
+ fir.result %y : i32
+ }
+ return %r : i32
+}
+
+// CHECK-LABEL: func.func @true_if_multiple_results(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: f32, %[[OTHER_X:[^:]*]]: i32, %[[OTHER_Y:[^:]*]]: f32) -> (i32, f32) {
+// CHECK-NOT: fir.if
+// CHECK: return %[[X]], %[[Y]] : i32, f32
+func.func @true_if_multiple_results(
+ %x: i32, %y: f32, %other_x: i32, %other_y: f32) -> (i32, f32) {
+ %true = arith.constant true
+ %r0, %r1 = fir.if %true -> (i32, f32) {
+ fir.result %x, %y : i32, f32
+ } else {
+ fir.result %other_x, %other_y : i32, f32
+ }
+ return %r0, %r1 : i32, f32
+}
+
+// CHECK-LABEL: func.func @false_if_with_else(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: i32, %[[P:[^:]*]]: !fir.ref<i32>) {
+// CHECK-NOT: fir.if
+// CHECK: fir.store %[[Y]] to %[[P]] : !fir.ref<i32>
+// CHECK-NOT: fir.store %[[X]]
+func.func @false_if_with_else(%x: i32, %y: i32, %p: !fir.ref<i32>) {
+ %false = arith.constant false
+ fir.if %false {
+ fir.store %x to %p : !fir.ref<i32>
+ } else {
+ fir.store %y to %p : !fir.ref<i32>
+ }
+ return
+}
+
+// CHECK-LABEL: func.func @false_if_results(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: i32) -> i32 {
+// CHECK-NOT: fir.if
+// CHECK: return %[[Y]] : i32
+func.func @false_if_results(%x: i32, %y: i32) -> i32 {
+ %false = arith.constant false
+ %r = fir.if %false -> (i32) {
+ fir.result %x : i32
+ } else {
+ fir.result %y : i32
+ }
+ return %r : i32
+}
+
+// CHECK-LABEL: func.func @false_if_no_else(
+// CHECK-NOT: fir.if
+// CHECK-NOT: fir.store
+func.func @false_if_no_else(%x: i32, %p: !fir.ref<i32>) {
+ %false = arith.constant false
+ fir.if %false {
+ fir.store %x to %p : !fir.ref<i32>
+ }
+ return
+}
+
+// CHECK-LABEL: func.func @nested_constant_if(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: i32, %[[Z:[^:]*]]: i32, %[[P:[^:]*]]: !fir.ref<i32>) {
+// CHECK-NOT: fir.if
+// CHECK: fir.store %[[Y]] to %[[P]] : !fir.ref<i32>
+// CHECK-NOT: fir.store %[[X]]
+// CHECK-NOT: fir.store %[[Z]]
+func.func @nested_constant_if(%x: i32, %y: i32, %z: i32, %p: !fir.ref<i32>) {
+ %true = arith.constant true
+ %false = arith.constant false
+ fir.if %true {
+ fir.if %false {
+ fir.store %x to %p : !fir.ref<i32>
+ } else {
+ fir.store %y to %p : !fir.ref<i32>
+ }
+ } else {
+ fir.store %z to %p : !fir.ref<i32>
+ }
+ return
+}
+
+// CHECK-LABEL: func.func @nested_constant_if_else(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: i32, %[[Z:[^:]*]]: i32, %[[P:[^:]*]]: !fir.ref<i32>) {
+// CHECK-NOT: fir.if
+// CHECK: fir.store %[[X]] to %[[P]] : !fir.ref<i32>
+// CHECK-NOT: fir.store %[[Y]]
+// CHECK-NOT: fir.store %[[Z]]
+func.func @nested_constant_if_else(%x: i32, %y: i32, %z: i32, %p: !fir.ref<i32>) {
+ %true = arith.constant true
+ %false = arith.constant false
+ fir.if %false {
+ fir.store %z to %p : !fir.ref<i32>
+ } else {
+ fir.if %true {
+ fir.store %x to %p : !fir.ref<i32>
+ } else {
+ fir.store %y to %p : !fir.ref<i32>
+ }
+ }
+ return
+}
+
+// CHECK-LABEL: func.func @nested_constant_if_results(
+// CHECK-SAME: %[[X:[^:]*]]: i32, %[[Y:[^:]*]]: i32, %[[Z:[^:]*]]: i32) -> i32 {
+// CHECK-NOT: fir.if
+// CHECK: return %[[Y]] : i32
+func.func @nested_constant_if_results(%x: i32, %y: i32, %z: i32) -> i32 {
+ %true = arith.constant true
+ %false = arith.constant false
+ %r = fir.if %true -> (i32) {
+ %inner = fir.if %false -> (i32) {
+ fir.result %x : i32
+ } else {
+ fir.result %y : i32
+ }
+ fir.result %inner : i32
+ } else {
+ fir.result %z : i32
+ }
+ return %r : i32
+}
+
+// CHECK-LABEL: func.func @nonconst_if(
+// CHECK: fir.if
+func.func @nonconst_if(%c: i1, %x: i32, %p: !fir.ref<i32>) {
+ fir.if %c {
+ fir.store %x to %p : !fir.ref<i32>
+ }
+ return
+}
diff --git a/flang/test/Lower/Intrinsics/ieee_flag.f90 b/flang/test/Lower/Intrinsics/ieee_flag.f90
index acf3fedae4181..43c978021d8ec 100644
--- a/flang/test/Lower/Intrinsics/ieee_flag.f90
+++ b/flang/test/Lower/Intrinsics/ieee_flag.f90
@@ -37,11 +37,7 @@
! CHECK: %[[V_97:[0-9]+]] = fir.load %[[V_96]] : !fir.ref<i8>
! CHECK: %[[V_98:[0-9]+]] = fir.convert %[[V_97]] : (i8) -> i32
! CHECK: %[[V_99:[0-9]+]] = fir.call @_FortranAMapException(%[[V_98]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_99]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_99]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_99]]) fastmath<contract> : (i32)
call ieee_set_flag(ieee_invalid, .false.)
! CHECK: %[[V_100:[0-9]+]] = fir.declare %[[V_80]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_flag_type.0"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>
@@ -63,11 +59,7 @@
! CHECK: %[[V_120:[0-9]+]] = fir.load %[[V_119]] : !fir.ref<i8>
! CHECK: %[[V_121:[0-9]+]] = fir.convert %[[V_120]] : (i8) -> i32
! CHECK: %[[V_122:[0-9]+]] = fir.call @_FortranAMapException(%[[V_121]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %true{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_122]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_122]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_122]]) fastmath<contract> : (i32)
call ieee_set_flag(ieee_invalid, .true.)
! CHECK: %[[V_123:[0-9]+]] = fir.declare %[[V_80]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_flag_type.0"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>
@@ -92,11 +84,7 @@
! CHECK: %[[V_312:[0-9]+]] = fir.load %[[V_311]] : !fir.ref<i8>
! CHECK: %[[V_313:[0-9]+]] = fir.convert %[[V_312]] : (i8) -> i32
! CHECK: %[[V_314:[0-9]+]] = fir.call @_FortranAMapException(%[[V_313]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_314]]) fastmath<contract> : (i32)
! CHECK: }
call ieee_set_flag([ieee_invalid, ieee_overflow], .false.)
@@ -165,11 +153,7 @@
! CHECK: %[[V_312:[0-9]+]] = fir.load %[[V_311]] : !fir.ref<i8>
! CHECK: %[[V_313:[0-9]+]] = fir.convert %[[V_312]] : (i8) -> i32
! CHECK: %[[V_314:[0-9]+]] = fir.call @_FortranAMapException(%[[V_313]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %true{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_314]]) fastmath<contract> : (i32)
! CHECK: }
call ieee_set_flag(ieee_usual, .true.)
@@ -237,11 +221,7 @@
! CHECK: %[[V_312:[0-9]+]] = fir.load %[[V_311]] : !fir.ref<i8>
! CHECK: %[[V_313:[0-9]+]] = fir.convert %[[V_312]] : (i8) -> i32
! CHECK: %[[V_314:[0-9]+]] = fir.call @_FortranAMapException(%[[V_313]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_314]]) fastmath<contract> : (i32)
! CHECK: }
call ieee_set_flag(ieee_all, .false.)
@@ -278,11 +258,7 @@
! CHECK: %[[V_224:[0-9]+]] = fir.load %[[V_223]] : !fir.ref<i8>
! CHECK: %[[V_225:[0-9]+]] = fir.convert %[[V_224]] : (i8) -> i32
! CHECK: %[[V_226:[0-9]+]] = fir.call @_FortranAMapException(%[[V_225]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feenableexcept(%[[V_226]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}fedisableexcept(%[[V_226]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}fedisableexcept(%[[V_226]]) fastmath<contract> : (i32)
call ieee_set_halting_mode(ieee_invalid, .false.)
! CHECK: %[[V_227:[0-9]+]] = fir.declare %[[V_80]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_flag_type.0"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>
@@ -305,11 +281,7 @@
! CHECK: %[[V_246:[0-9]+]] = fir.load %[[V_245]] : !fir.ref<i8>
! CHECK: %[[V_247:[0-9]+]] = fir.convert %[[V_246]] : (i8) -> i32
! CHECK: %[[V_248:[0-9]+]] = fir.call @_FortranAMapException(%[[V_247]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %true{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feenableexcept(%[[V_248]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}fedisableexcept(%[[V_248]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feenableexcept(%[[V_248]]) fastmath<contract> : (i32)
call ieee_set_halting_mode(ieee_invalid, .true.)
! CHECK: %[[V_249:[0-9]+]] = fir.declare %[[V_80]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_flag_type.0"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>
@@ -334,11 +306,7 @@
! CHECK: %[[V_312:[0-9]+]] = fir.load %[[V_311]] : !fir.ref<i8>
! CHECK: %[[V_313:[0-9]+]] = fir.convert %[[V_312]] : (i8) -> i32
! CHECK: %[[V_314:[0-9]+]] = fir.call @_FortranAMapException(%[[V_313]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feenableexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}fedisableexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}fedisableexcept(%[[V_314]]) fastmath<contract> : (i32)
! CHECK: }
call ieee_set_halting_mode([ieee_invalid, ieee_overflow], .false.)
@@ -406,11 +374,7 @@
! CHECK: %[[V_312:[0-9]+]] = fir.load %[[V_311]] : !fir.ref<i8>
! CHECK: %[[V_313:[0-9]+]] = fir.convert %[[V_312]] : (i8) -> i32
! CHECK: %[[V_314:[0-9]+]] = fir.call @_FortranAMapException(%[[V_313]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %true{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feenableexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}fedisableexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feenableexcept(%[[V_314]]) fastmath<contract> : (i32)
! CHECK: }
call ieee_set_halting_mode(ieee_usual, .true.)
@@ -478,11 +442,7 @@
! CHECK: %[[V_312:[0-9]+]] = fir.load %[[V_311]] : !fir.ref<i8>
! CHECK: %[[V_313:[0-9]+]] = fir.convert %[[V_312]] : (i8) -> i32
! CHECK: %[[V_314:[0-9]+]] = fir.call @_FortranAMapException(%[[V_313]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %true{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feenableexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}fedisableexcept(%[[V_314]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feenableexcept(%[[V_314]]) fastmath<contract> : (i32)
! CHECK: }
call ieee_set_halting_mode(ieee_all, .true.)
diff --git a/flang/test/Lower/Intrinsics/ieee_logb.f90 b/flang/test/Lower/Intrinsics/ieee_logb.f90
index fd4144e516118..e6a6f9777844b 100644
--- a/flang/test/Lower/Intrinsics/ieee_logb.f90
+++ b/flang/test/Lower/Intrinsics/ieee_logb.f90
@@ -19,11 +19,7 @@ subroutine out(x)
! CHECK: %[[V_69:[0-9]+]] = fir.load %[[V_68]] : !fir.ref<i8>
! CHECK: %[[V_70:[0-9]+]] = fir.convert %[[V_69]] : (i8) -> i32
! CHECK: %[[V_71:[0-9]+]] = fir.call @_FortranAMapException(%[[V_70]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_71]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_71]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_71]]) fastmath<contract> : (i32)
call ieee_set_flag(ieee_divide_by_zero, .false.)
! CHECK: %[[V_72:[0-9]+]] = fir.load %[[V_64]] : !fir.ref<f64>
diff --git a/flang/test/Lower/Intrinsics/ieee_max_min.f90 b/flang/test/Lower/Intrinsics/ieee_max_min.f90
index 53371415b1d6d..03f9ad5f6f76f 100644
--- a/flang/test/Lower/Intrinsics/ieee_max_min.f90
+++ b/flang/test/Lower/Intrinsics/ieee_max_min.f90
@@ -73,11 +73,7 @@ program p
! CHECK: %[[V_205:[0-9]+]] = fir.load %[[V_204]] : !fir.ref<i8>
! CHECK: %[[V_206:[0-9]+]] = fir.convert %[[V_205]] : (i8) -> i32
! CHECK: %[[V_207:[0-9]+]] = fir.call @_FortranAMapException(%[[V_206]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_207]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_207]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_207]]) fastmath<contract> : (i32)
! CHECK: %[[V_208:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_209:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_210:[0-9]+]] = arith.cmpf olt, %[[V_208]], %[[V_209]] {{.*}} : f32
@@ -130,11 +126,7 @@ program p
! CHECK: %[[V_270:[0-9]+]] = fir.load %[[V_269]] : !fir.ref<i8>
! CHECK: %[[V_271:[0-9]+]] = fir.convert %[[V_270]] : (i8) -> i32
! CHECK: %[[V_272:[0-9]+]] = fir.call @_FortranAMapException(%[[V_271]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_272]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_272]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_272]]) fastmath<contract> : (i32)
! CHECK: %[[V_273:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_274:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_275:[0-9]+]] = math.copysign %[[V_273]], %cst{{[_0-9]*}} fastmath<contract> : f32
@@ -189,11 +181,7 @@ program p
! CHECK: %[[V_331:[0-9]+]] = fir.load %[[V_330]] : !fir.ref<i8>
! CHECK: %[[V_332:[0-9]+]] = fir.convert %[[V_331]] : (i8) -> i32
! CHECK: %[[V_333:[0-9]+]] = fir.call @_FortranAMapException(%[[V_332]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_333]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_333]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_333]]) fastmath<contract> : (i32)
! CHECK: %[[V_334:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_335:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_336:[0-9]+]] = arith.cmpf olt, %[[V_334]], %[[V_335]] {{.*}} : f32
@@ -250,11 +238,7 @@ program p
! CHECK: %[[V_390:[0-9]+]] = fir.load %[[V_389]] : !fir.ref<i8>
! CHECK: %[[V_391:[0-9]+]] = fir.convert %[[V_390]] : (i8) -> i32
! CHECK: %[[V_392:[0-9]+]] = fir.call @_FortranAMapException(%[[V_391]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_392]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_392]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_392]]) fastmath<contract> : (i32)
! CHECK: %[[V_393:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_394:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_395:[0-9]+]] = math.copysign %[[V_393]], %cst{{[_0-9]*}} fastmath<contract> : f32
@@ -313,11 +297,7 @@ program p
! CHECK: %[[V_451:[0-9]+]] = fir.load %[[V_450]] : !fir.ref<i8>
! CHECK: %[[V_452:[0-9]+]] = fir.convert %[[V_451]] : (i8) -> i32
! CHECK: %[[V_453:[0-9]+]] = fir.call @_FortranAMapException(%[[V_452]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_453]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_453]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_453]]) fastmath<contract> : (i32)
! CHECK: %[[V_454:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_455:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_456:[0-9]+]] = arith.cmpf olt, %[[V_454]], %[[V_455]] {{.*}} : f32
@@ -370,11 +350,7 @@ program p
! CHECK: %[[V_510:[0-9]+]] = fir.load %[[V_509]] : !fir.ref<i8>
! CHECK: %[[V_511:[0-9]+]] = fir.convert %[[V_510]] : (i8) -> i32
! CHECK: %[[V_512:[0-9]+]] = fir.call @_FortranAMapException(%[[V_511]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_512]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_512]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_512]]) fastmath<contract> : (i32)
! CHECK: %[[V_513:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_514:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_515:[0-9]+]] = math.copysign %[[V_513]], %cst{{[_0-9]*}} fastmath<contract> : f32
@@ -429,11 +405,7 @@ program p
! CHECK: %[[V_571:[0-9]+]] = fir.load %[[V_570]] : !fir.ref<i8>
! CHECK: %[[V_572:[0-9]+]] = fir.convert %[[V_571]] : (i8) -> i32
! CHECK: %[[V_573:[0-9]+]] = fir.call @_FortranAMapException(%[[V_572]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_573]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_573]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_573]]) fastmath<contract> : (i32)
! CHECK: %[[V_574:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_575:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_576:[0-9]+]] = arith.cmpf olt, %[[V_574]], %[[V_575]] {{.*}} : f32
@@ -490,11 +462,7 @@ program p
! CHECK: %[[V_630:[0-9]+]] = fir.load %[[V_629]] : !fir.ref<i8>
! CHECK: %[[V_631:[0-9]+]] = fir.convert %[[V_630]] : (i8) -> i32
! CHECK: %[[V_632:[0-9]+]] = fir.call @_FortranAMapException(%[[V_631]]) fastmath<contract> : (i32) -> i32
- ! CHECK: fir.if %false{{[_0-9]*}} {
- ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_632]]) fastmath<contract> : (i32)
- ! CHECK: } else {
- ! CHECK: fir.call {{.*}}feclearexcept(%[[V_632]]) fastmath<contract> : (i32)
- ! CHECK: }
+ ! CHECK: fir.call {{.*}}feclearexcept(%[[V_632]]) fastmath<contract> : (i32)
! CHECK: %[[V_633:[0-9]+]] = fir.load %[[V_17]] : !fir.ref<f32>
! CHECK: %[[V_634:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
! CHECK: %[[V_635:[0-9]+]] = math.copysign %[[V_633]], %cst{{[_0-9]*}} fastmath<contract> : f32
diff --git a/flang/test/Lower/if-constant-condition.f90 b/flang/test/Lower/if-constant-condition.f90
new file mode 100644
index 0000000000000..675aa839dd6d4
--- /dev/null
+++ b/flang/test/Lower/if-constant-condition.f90
@@ -0,0 +1,33 @@
+! RUN: bbc -emit-fir -o - %s | FileCheck %s --implicit-check-not=fir.if --implicit-check-not="fir.call @_QPdead"
+! CHECK-LABEL: func.func @_QPconstant_branches(
+! CHECK: fir.call @_QPlive_true()
+! CHECK-NEXT: fir.call @_QPlive_false()
+! CHECK-NEXT: return
+subroutine constant_branches()
+ logical, parameter :: enabled = .false.
+ if (.true.) then
+ call live_true()
+ else
+ call dead()
+ end if
+ if (enabled) then
+ call dead()
+ else
+ call live_false()
+ end if
+end subroutine
+! CHECK-LABEL: func.func @_QPelse_if_chain(
+! CHECK: fir.call @_QPlive_chain()
+! CHECK-NEXT: return
+subroutine else_if_chain(c)
+ logical :: c
+ if (.false.) then
+ call dead()
+ else if (.true.) then
+ call live_chain()
+ else if (c) then
+ call dead()
+ else
+ call dead()
+ end if
+end subroutine
More information about the flang-commits
mailing list