[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