From fa2df7e853d7f11c04af1fcdfe727b006c66c181 Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn Date: Thu, 19 Mar 2026 23:41:53 -0400 Subject: [PATCH] [flang][NFC] Converted five tests from old lowering to new lowering (part 35) (#187407) Tests converted from test/Lower/Intrinsics: len.f90, lge_lgt_lle_llt.f90, log.f90, matmul.f90, max.f90 --- flang/test/Lower/Intrinsics/len.f90 | 82 ++++++----- .../test/Lower/Intrinsics/lge_lgt_lle_llt.f90 | 21 ++- flang/test/Lower/Intrinsics/log.f90 | 83 ++++++----- flang/test/Lower/Intrinsics/matmul.f90 | 71 +++------- flang/test/Lower/Intrinsics/max.f90 | 133 +++++++++--------- 5 files changed, 189 insertions(+), 201 deletions(-) diff --git a/flang/test/Lower/Intrinsics/len.f90 b/flang/test/Lower/Intrinsics/len.f90 index 16b865cc89aa..c0ca30a6401d 100644 --- a/flang/test/Lower/Intrinsics/len.f90 +++ b/flang/test/Lower/Intrinsics/len.f90 @@ -1,68 +1,78 @@ -! RUN: bbc --use-desc-for-alloc=false -emit-fir -hlfir=false %s -o - | FileCheck %s +! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s -! CHECK-LABEL: len_test +! CHECK-LABEL: func.func @_QPlen_test( +! CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.bindc_name = "i"}, +! CHECK-SAME: %[[ARG1:.*]]: !fir.boxchar<1> {fir.bindc_name = "c"}) subroutine len_test(i, c) integer :: i character(*) :: c - ! CHECK: %[[c:.*]]:2 = fir.unboxchar %arg1 - ! CHECK: %[[xx:.*]] = fir.convert %[[c]]#1 : (index) -> i32 - ! CHECK: fir.store %[[xx]] to %arg0 +! CHECK: %[[c:.*]]:2 = fir.unboxchar %[[ARG1]] +! CHECK: hlfir.declare %[[c]]#0 typeparams %[[c]]#1 +! CHECK: %[[IVAL:.*]]:2 = hlfir.declare %[[ARG0]] +! CHECK: %[[xx:.*]] = fir.convert %[[c]]#1 : (index) -> i32 +! CHECK: hlfir.assign %[[xx]] to %[[IVAL]]#0 : i32, !fir.ref i = len(c) end subroutine -! CHECK-LABEL: len_test_array -! CHECK-SAME: %[[arg0:.*]]: !fir.ref {fir.bindc_name = "i"}, %[[arg1:.*]]: !fir.boxchar<1> {fir.bindc_name = "c"} +! CHECK-LABEL: func.func @_QPlen_test_array( +! CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.bindc_name = "i"}, +! CHECK-SAME: %[[ARG1:.*]]: !fir.boxchar<1> {fir.bindc_name = "c"}) subroutine len_test_array(i, c) integer :: i character(*) :: c(100) - ! CHECK: %[[c:.*]]:2 = fir.unboxchar %[[arg1]] - ! CHECK: %[[xx:.*]] = fir.convert %[[c]]#1 : (index) -> i32 - ! CHECK: fir.store %[[xx]] to %[[arg0]] +! CHECK: %[[c:.*]]:2 = fir.unboxchar %[[ARG1]] +! CHECK: hlfir.declare {{.*}} typeparams %[[c]]#1 +! CHECK: %[[IVAL:.*]]:2 = hlfir.declare %[[ARG0]] +! CHECK: %[[xx:.*]] = fir.convert %[[c]]#1 : (index) -> i32 +! CHECK: hlfir.assign %[[xx]] to %[[IVAL]]#0 : i32, !fir.ref i = len(c) end subroutine -! CHECK-LABEL: func @_QPlen_test_assumed_shape_array( +! CHECK-LABEL: func.func @_QPlen_test_assumed_shape_array( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "i"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.box>> {fir.bindc_name = "c"}) { subroutine len_test_assumed_shape_array(i, c) integer :: i character(*) :: c(:) -! CHECK: %[[VAL_2:.*]] = fir.box_elesize %[[VAL_1]] : (!fir.box>>) -> index +! CHECK-DAG: %[[I:.*]]:2 = hlfir.declare %[[VAL_0]] +! CHECK-DAG: %[[C:.*]]:2 = hlfir.declare %[[VAL_1]] +! CHECK: %[[VAL_2:.*]] = fir.box_elesize %[[C]]#1 : (!fir.box>>) -> index ! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (index) -> i32 -! CHECK: fir.store %[[VAL_3]] to %[[VAL_0]] : !fir.ref +! CHECK: hlfir.assign %[[VAL_3]] to %[[I]]#0 : i32, !fir.ref i = len(c) end subroutine -! CHECK-LABEL: func @_QPlen_test_array_alloc( +! CHECK-LABEL: func.func @_QPlen_test_array_alloc( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "i"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref>>>> {fir.bindc_name = "c"}) { subroutine len_test_array_alloc(i, c) integer :: i character(:), allocatable :: c(:) -! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref>>>> +! CHECK-DAG: %[[I:.*]]:2 = hlfir.declare %[[VAL_0]] +! CHECK-DAG: %[[C:.*]]:2 = hlfir.declare %[[VAL_1]] +! CHECK: %[[VAL_2:.*]] = fir.load %[[C]]#0 : !fir.ref>>>> ! CHECK: %[[VAL_3:.*]] = fir.box_elesize %[[VAL_2]] : (!fir.box>>>) -> index ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (index) -> i32 -! CHECK: fir.store %[[VAL_4]] to %[[VAL_0]] : !fir.ref +! CHECK: hlfir.assign %[[VAL_4]] to %[[I]]#0 : i32, !fir.ref i = len(c) end subroutine -! CHECK-LABEL: func @_QPlen_test_array_local_alloc( +! CHECK-LABEL: func.func @_QPlen_test_array_local_alloc( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "i"}) subroutine len_test_array_local_alloc(i) integer :: i character(:), allocatable :: c(:) -! CHECK: %[[VAL_5:.*]] = fir.alloca index {uniq_name = "_QFlen_test_array_local_allocEc.len"} -! CHECK: %[[VAL_7:.*]] = arith.constant 10 : i32 -! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_7]] : (i32) -> index -! CHECK: fir.store %[[VAL_10]] to %[[VAL_5]] : !fir.ref +! CHECK: %[[I:.*]]:2 = hlfir.declare %[[VAL_0]] +! CHECK: %[[C10:.*]] = arith.constant 10 : i32 allocate(character(10):: c(100)) -! CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_5]] : !fir.ref -! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (index) -> i32 -! CHECK: fir.store %[[VAL_14]] to %[[VAL_0]] : !fir.ref +! CHECK: %[[C_LOADED:.*]] = fir.load %{{.*}} : !fir.ref>>>> +! CHECK: %[[ELESIZE:.*]] = fir.box_elesize %[[C_LOADED]] : (!fir.box>>>) -> index +! CHECK: %[[RESULT:.*]] = fir.convert %[[ELESIZE]] : (index) -> i32 +! CHECK: hlfir.assign %[[RESULT]] to %[[I]]#0 : i32, !fir.ref i = len(c) end subroutine -! CHECK-LABEL: func @_QPlen_test_alloc_explicit_len( +! CHECK-LABEL: func.func @_QPlen_test_alloc_explicit_len( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "i"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref {fir.bindc_name = "n"}, ! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref>>>> {fir.bindc_name = "c"}) { @@ -70,40 +80,46 @@ subroutine len_test_alloc_explicit_len(i, n, c) integer :: i integer :: n character(n), allocatable :: c(:) -! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]] : !fir.ref +! CHECK-DAG: %[[N:.*]]:2 = hlfir.declare %[[VAL_1]] +! CHECK-DAG: %[[I:.*]]:2 = hlfir.declare %[[VAL_0]] +! CHECK: %[[VAL_3:.*]] = fir.load %[[N]]#0 : !fir.ref ! CHECK: %[[c0_i32:.*]] = arith.constant 0 : i32 ! CHECK: %[[cmp:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[c0_i32]] : i32 ! CHECK: %[[len:.*]] = arith.select %[[cmp]], %[[VAL_3]], %[[c0_i32]] : i32 -! CHECK: fir.store %[[len]] to %[[VAL_0]] : !fir.ref +! CHECK: hlfir.assign %[[len]] to %[[I]]#0 : i32, !fir.ref i = len(c) end subroutine -! CHECK-LABEL: func @_QPlen_test_pointer_explicit_len( +! CHECK-LABEL: func.func @_QPlen_test_pointer_explicit_len( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "i"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref {fir.bindc_name = "n"}, subroutine len_test_pointer_explicit_len(i, n, c) integer :: i integer :: n character(n), pointer :: c(:) -! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]] : !fir.ref +! CHECK-DAG: %[[N:.*]]:2 = hlfir.declare %[[VAL_1]] +! CHECK-DAG: %[[I:.*]]:2 = hlfir.declare %[[VAL_0]] +! CHECK: %[[VAL_3:.*]] = fir.load %[[N]]#0 : !fir.ref ! CHECK: %[[c0_i32:.*]] = arith.constant 0 : i32 ! CHECK: %[[cmp:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[c0_i32]] : i32 ! CHECK: %[[len:.*]] = arith.select %[[cmp]], %[[VAL_3]], %[[c0_i32]] : i32 -! CHECK: fir.store %[[len]] to %[[VAL_0]] : !fir.ref +! CHECK: hlfir.assign %[[len]] to %[[I]]#0 : i32, !fir.ref i = len(c) end subroutine -! CHECK-LABEL: func @_QPlen_test_assumed_shape_explicit_len( +! CHECK-LABEL: func.func @_QPlen_test_assumed_shape_explicit_len( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "i"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref {fir.bindc_name = "n"}, subroutine len_test_assumed_shape_explicit_len(i, n, c) integer :: i integer :: n character(n) :: c(:) -! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]] : !fir.ref +! CHECK-DAG: %[[N:.*]]:2 = hlfir.declare %[[VAL_1]] +! CHECK-DAG: %[[I:.*]]:2 = hlfir.declare %[[VAL_0]] +! CHECK: %[[VAL_3:.*]] = fir.load %[[N]]#0 : !fir.ref ! CHECK: %[[c0_i32:.*]] = arith.constant 0 : i32 ! CHECK: %[[cmp:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[c0_i32]] : i32 ! CHECK: %[[len:.*]] = arith.select %[[cmp]], %[[VAL_3]], %[[c0_i32]] : i32 -! CHECK: fir.store %[[len]] to %[[VAL_0]] : !fir.ref +! CHECK: hlfir.assign %[[len]] to %[[I]]#0 : i32, !fir.ref i = len(c) end subroutine diff --git a/flang/test/Lower/Intrinsics/lge_lgt_lle_llt.f90 b/flang/test/Lower/Intrinsics/lge_lgt_lle_llt.f90 index 71e5c6da64c1..4d429ead8851 100644 --- a/flang/test/Lower/Intrinsics/lge_lgt_lle_llt.f90 +++ b/flang/test/Lower/Intrinsics/lge_lgt_lle_llt.f90 @@ -1,33 +1,30 @@ -! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s +! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s subroutine lge_test character*3 :: c1(3) character*7 :: c2(3) - ! c1(1) = 'a'; c1(2) = 'B'; c1(3) = 'c'; - ! c2(1) = 'A'; c2(2) = 'b'; c2(3) = 'c'; ! CHECK: BeginExternalListOutput - ! CHECK: fir.do_loop - ! CHECK: CharacterCompareScalar1 + ! CHECK: hlfir.elemental + ! CHECK: hlfir.cmpchar sge ! CHECK: OutputDescriptor ! CHECK: EndIoStatement print*, lge(c1, c2) ! CHECK: BeginExternalListOutput - ! CHECK: fir.do_loop - ! CHECK: CharacterCompareScalar1 + ! CHECK: hlfir.elemental + ! CHECK: hlfir.cmpchar sgt ! CHECK: OutputDescriptor ! CHECK: EndIoStatement print*, lgt(c1, c2) ! CHECK: BeginExternalListOutput - ! CHECK: fir.do_loop - ! CHECK: CharacterCompareScalar1 + ! CHECK: hlfir.elemental + ! CHECK: hlfir.cmpchar sle ! CHECK: OutputDescriptor ! CHECK: EndIoStatement print*, lle(c1, c2) ! CHECK: BeginExternalListOutput - ! CHECK: fir.do_loop - ! CHECK: CharacterCompareScalar1 + ! CHECK: hlfir.elemental + ! CHECK: hlfir.cmpchar slt ! CHECK: OutputDescriptor ! CHECK: EndIoStatement print*, llt(c1, c2) end - diff --git a/flang/test/Lower/Intrinsics/log.f90 b/flang/test/Lower/Intrinsics/log.f90 index 0e8d173fd8e0..e82bc7f559b0 100644 --- a/flang/test/Lower/Intrinsics/log.f90 +++ b/flang/test/Lower/Intrinsics/log.f90 @@ -1,68 +1,77 @@ -! RUN: bbc -emit-fir -hlfir=false -outline-intrinsics %s -o - | FileCheck %s --check-prefixes=%if system-aix %{"CHECK,CMPLX,CMPLX-PRECISE,AIX-LOG"%} %else %{"CHECK,CMPLX,CMPLX-PRECISE,COMMON-LOG"%} -! RUN: bbc -emit-fir -hlfir=false --math-runtime=precise -outline-intrinsics %s -o - | FileCheck %s --check-prefixes=%if system-aix %{"CMPLX,CMPLX-PRECISE,AIX-LOG"%} %else %{"CMPLX,CMPLX-PRECISE,COMMON-LOG"%} -! RUN: bbc -emit-fir -hlfir=false --force-mlir-complex -outline-intrinsics %s -o - | FileCheck %s --check-prefixes="CMPLX,CMPLX-FAST,CMPLX-MLIR" -! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -mllvm -outline-intrinsics %s -o - | FileCheck %s --check-prefixes=%if system-aix %{"CHECK,CMPLX,CMPLX-PRECISE,AIX-LOG"%} %else %{"CHECK,CMPLX,CMPLX-PRECISE,COMMON-LOG"%} -! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -mllvm -outline-intrinsics -mllvm --math-runtime=precise %s -o - | FileCheck %s --check-prefixes=%if system-aix %{"CMPLX,CMPLX-PRECISE,AIX-LOG"%} %else %{"CMPLX,CMPLX-PRECISE,COMMON-LOG"%} -! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -mllvm -outline-intrinsics -mllvm --force-mlir-complex %s -o - | FileCheck %s --check-prefixes="CMPLX,CMPLX-FAST,CMPLX-MLIR" -! RUN: %flang_fc1 -fapprox-func -emit-fir -flang-deprecated-no-hlfir -mllvm -outline-intrinsics %s -o - | FileCheck %s --check-prefixes="CMPLX,CMPLX-APPROX" +! RUN: %flang_fc1 -emit-hlfir -mllvm -outline-intrinsics %s -o - | FileCheck %s --check-prefixes=%if system-aix %{"CHECK,CMPLX,CMPLX-PRECISE,AIX-LOG"%} %else %{"CHECK,CMPLX,CMPLX-PRECISE,COMMON-LOG"%} +! RUN: %flang_fc1 -emit-hlfir -mllvm -outline-intrinsics -mllvm --math-runtime=precise %s -o - | FileCheck %s --check-prefixes=%if system-aix %{"CMPLX,CMPLX-PRECISE,AIX-LOG"%} %else %{"CMPLX,CMPLX-PRECISE,COMMON-LOG"%} +! RUN: %flang_fc1 -emit-hlfir -mllvm -outline-intrinsics -mllvm --force-mlir-complex %s -o - | FileCheck %s --check-prefixes="CMPLX,CMPLX-FAST,CMPLX-MLIR" +! RUN: %flang_fc1 -fapprox-func -emit-hlfir -mllvm -outline-intrinsics %s -o - | FileCheck %s --check-prefixes="CMPLX,CMPLX-APPROX" -! CHECK-LABEL: log_testr -! CHECK-SAME: (%[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) +! CHECK-LABEL: func.func @_QPlog_testr( +! CHECK-SAME: %[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) subroutine log_testr(a, b) real :: a, b -! CHECK: %[[A:.*]] = fir.load %[[AREF:.*]] : !fir.ref -! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.f32.f32(%[[A]]) {{.*}}: (f32) -> f32 -! CHECK: fir.store %[[RES]] to %[[BREF]] : !fir.ref +! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[AREF]] +! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[BREF]] +! CHECK: %[[AVAL:.*]] = fir.load %[[A]]#0 : !fir.ref +! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.f32.f32(%[[AVAL]]) {{.*}}: (f32) -> f32 +! CHECK: hlfir.assign %[[RES]] to %[[B]]#0 : f32, !fir.ref b = log(a) end subroutine -! CHECK-LABEL: log_testd -! CHECK-SAME: (%[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) +! CHECK-LABEL: func.func @_QPlog_testd( +! CHECK-SAME: %[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) subroutine log_testd(a, b) real(kind=8) :: a, b -! CHECK: %[[A:.*]] = fir.load %[[AREF:.*]] : !fir.ref -! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.f64.f64(%[[A]]) {{.*}}: (f64) -> f64 -! CHECK: fir.store %[[RES]] to %[[BREF]] : !fir.ref +! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[AREF]] +! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[BREF]] +! CHECK: %[[AVAL:.*]] = fir.load %[[A]]#0 : !fir.ref +! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.f64.f64(%[[AVAL]]) {{.*}}: (f64) -> f64 +! CHECK: hlfir.assign %[[RES]] to %[[B]]#0 : f64, !fir.ref b = log(a) end subroutine -! CHECK-LABEL: log_testc -! CHECK-SAME: (%[[AREF:.*]]: !fir.ref> {{.*}}, %[[BREF:.*]]: !fir.ref> {{.*}}) +! CHECK-LABEL: func.func @_QPlog_testc( +! CHECK-SAME: %[[AREF:.*]]: !fir.ref> {{.*}}, %[[BREF:.*]]: !fir.ref> {{.*}}) subroutine log_testc(a, b) complex :: a, b -! CHECK: %[[A:.*]] = fir.load %[[AREF:.*]] : !fir.ref> -! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.z32.z32(%[[A]]) {{.*}}: (complex) -> complex -! CHECK: fir.store %[[RES]] to %[[BREF]] : !fir.ref> +! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[AREF]] +! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[BREF]] +! CHECK: %[[AVAL:.*]] = fir.load %[[A]]#0 : !fir.ref> +! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.z32.z32(%[[AVAL]]) {{.*}}: (complex) -> complex +! CHECK: hlfir.assign %[[RES]] to %[[B]]#0 : complex, !fir.ref> b = log(a) end subroutine -! CHECK-LABEL: log_testcd -! CHECK-SAME: (%[[AREF:.*]]: !fir.ref> {{.*}}, %[[BREF:.*]]: !fir.ref> {{.*}}) +! CHECK-LABEL: func.func @_QPlog_testcd( +! CHECK-SAME: %[[AREF:.*]]: !fir.ref> {{.*}}, %[[BREF:.*]]: !fir.ref> {{.*}}) subroutine log_testcd(a, b) complex(kind=8) :: a, b -! CHECK: %[[A:.*]] = fir.load %[[AREF:.*]] : !fir.ref> -! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.z64.z64(%[[A]]) {{.*}}: (complex) -> complex -! CHECK: fir.store %[[RES]] to %[[BREF]] : !fir.ref> +! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[AREF]] +! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[BREF]] +! CHECK: %[[AVAL:.*]] = fir.load %[[A]]#0 : !fir.ref> +! CHECK: %[[RES:.*]] = fir.call @fir.log.contract.z64.z64(%[[AVAL]]) {{.*}}: (complex) -> complex +! CHECK: hlfir.assign %[[RES]] to %[[B]]#0 : complex, !fir.ref> b = log(a) end subroutine -! CHECK-LABEL: log10_testr -! CHECK-SAME: (%[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) +! CHECK-LABEL: func.func @_QPlog10_testr( +! CHECK-SAME: %[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) subroutine log10_testr(a, b) real :: a, b -! CHECK: %[[A:.*]] = fir.load %[[AREF:.*]] : !fir.ref -! CHECK: %[[RES:.*]] = fir.call @fir.log10.contract.f32.f32(%[[A]]) {{.*}}: (f32) -> f32 -! CHECK: fir.store %[[RES]] to %[[BREF]] : !fir.ref +! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[AREF]] +! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[BREF]] +! CHECK: %[[AVAL:.*]] = fir.load %[[A]]#0 : !fir.ref +! CHECK: %[[RES:.*]] = fir.call @fir.log10.contract.f32.f32(%[[AVAL]]) {{.*}}: (f32) -> f32 +! CHECK: hlfir.assign %[[RES]] to %[[B]]#0 : f32, !fir.ref b = log10(a) end subroutine -! CHECK-LABEL: log10_testd -! CHECK-SAME: (%[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) +! CHECK-LABEL: func.func @_QPlog10_testd( +! CHECK-SAME: %[[AREF:.*]]: !fir.ref {{.*}}, %[[BREF:.*]]: !fir.ref {{.*}}) subroutine log10_testd(a, b) real(kind=8) :: a, b -! CHECK: %[[A:.*]] = fir.load %[[AREF:.*]] : !fir.ref -! CHECK: %[[RES:.*]] = fir.call @fir.log10.contract.f64.f64(%[[A]]) {{.*}}: (f64) -> f64 -! CHECK: fir.store %[[RES]] to %[[BREF]] : !fir.ref +! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[AREF]] +! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[BREF]] +! CHECK: %[[AVAL:.*]] = fir.load %[[A]]#0 : !fir.ref +! CHECK: %[[RES:.*]] = fir.call @fir.log10.contract.f64.f64(%[[AVAL]]) {{.*}}: (f64) -> f64 +! CHECK: hlfir.assign %[[RES]] to %[[B]]#0 : f64, !fir.ref b = log10(a) end subroutine diff --git a/flang/test/Lower/Intrinsics/matmul.f90 b/flang/test/Lower/Intrinsics/matmul.f90 index 77e7fa213717..d3e4b7e67c5d 100644 --- a/flang/test/Lower/Intrinsics/matmul.f90 +++ b/flang/test/Lower/Intrinsics/matmul.f90 @@ -1,68 +1,31 @@ -! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s -! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir %s -o - | FileCheck %s +! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s ! Test matmul intrinsic -! CHECK-LABEL: matmul_test -! CHECK-SAME: (%[[X:.*]]: !fir.ref>{{.*}}, %[[Y:.*]]: !fir.ref>{{.*}}, %[[Z:.*]]: !fir.ref>{{.*}}) -! CHECK: %[[RESULT_BOX_ADDR:.*]] = fir.alloca !fir.box>> -! CHECK: %[[C3:.*]] = arith.constant 3 : index -! CHECK: %[[C1:.*]] = arith.constant 1 : index -! CHECK: %[[C1_0:.*]] = arith.constant 1 : index -! CHECK: %[[C3_1:.*]] = arith.constant 3 : index -! CHECK: %[[Z_BOX:.*]] = fir.array_load %[[Z]]({{.*}}) : (!fir.ref>, !fir.shape<2>) -> !fir.array<3x3xf32> -! CHECK: %[[X_SHAPE:.*]] = fir.shape %[[C3]], %[[C1]] : (index, index) -> !fir.shape<2> -! CHECK: %[[X_BOX:.*]] = fir.embox %[[X]](%[[X_SHAPE]]) : (!fir.ref>, !fir.shape<2>) -> !fir.box> -! CHECK: %[[Y_SHAPE:.*]] = fir.shape %[[C1_0]], %[[C3_1]] : (index, index) -> !fir.shape<2> -! CHECK: %[[Y_BOX:.*]] = fir.embox %[[Y]](%[[Y_SHAPE]]) : (!fir.ref>, !fir.shape<2>) -> !fir.box> -! CHECK: %[[ZERO_INIT:.*]] = fir.zero_bits !fir.heap> -! CHECK: %[[C0:.*]] = arith.constant 0 : index -! CHECK: %[[RESULT_SHAPE:.*]] = fir.shape %[[C0]], %[[C0]] : (index, index) -> !fir.shape<2> -! CHECK: %[[RESULT_BOX_VAL:.*]] = fir.embox %[[ZERO_INIT]](%[[RESULT_SHAPE]]) : (!fir.heap>, !fir.shape<2>) -> !fir.box>> -! CHECK: fir.store %[[RESULT_BOX_VAL]] to %[[RESULT_BOX_ADDR]] : !fir.ref>>> -! CHECK: %[[RESULT_BOX_ADDR_RUNTIME:.*]] = fir.convert %[[RESULT_BOX_ADDR]] : (!fir.ref>>>) -> !fir.ref> -! CHECK: %[[X_BOX_RUNTIME:.*]] = fir.convert %[[X_BOX]] : (!fir.box>) -> !fir.box -! CHECK: %[[Y_BOX_RUNTIME:.*]] = fir.convert %[[Y_BOX]] : (!fir.box>) -> !fir.box -! CHECK: {{.*}}fir.call @_FortranAMatmulReal4Real4(%[[RESULT_BOX_ADDR_RUNTIME]], %[[X_BOX_RUNTIME]], %[[Y_BOX_RUNTIME]], {{.*}}, {{.*}} {{.*}}: (!fir.ref>, !fir.box, !fir.box, !fir.ref, i32) -> () -! CHECK: %[[RESULT_BOX:.*]] = fir.load %[[RESULT_BOX_ADDR]] : !fir.ref>>> -! CHECK: %[[RESULT_TMP:.*]] = fir.box_addr %[[RESULT_BOX]] : (!fir.box>>) -> !fir.heap> -! CHECK: %[[Z_COPY_FROM_RESULT:.*]] = fir.do_loop -! CHECK: {{.*}}fir.array_fetch -! CHECK: {{.*}}fir.array_update -! CHECK: fir.result -! CHECK: } -! CHECK: fir.array_merge_store %[[Z_BOX]], %[[Z_COPY_FROM_RESULT]] to %[[Z]] : !fir.array<3x3xf32>, !fir.array<3x3xf32>, !fir.ref> -! CHECK: fir.freemem %[[RESULT_TMP]] : !fir.heap> +! CHECK-LABEL: func.func @_QPmatmul_test( +! CHECK-SAME: %[[X:.*]]: !fir.ref>{{.*}}, %[[Y:.*]]: !fir.ref>{{.*}}, %[[Z:.*]]: !fir.ref>{{.*}}) subroutine matmul_test(x,y,z) real :: x(3,1), y(1,3), z(3,3) +! CHECK-DAG: %[[XDECL:.*]]:2 = hlfir.declare %[[X]] +! CHECK-DAG: %[[YDECL:.*]]:2 = hlfir.declare %[[Y]] +! CHECK-DAG: %[[ZDECL:.*]]:2 = hlfir.declare %[[Z]] +! CHECK: %[[RESULT:.*]] = hlfir.matmul %[[XDECL]]#0 %[[YDECL]]#0 {{.*}} : (!fir.ref>, !fir.ref>) -> !hlfir.expr<3x3xf32> +! CHECK: hlfir.assign %[[RESULT]] to %[[ZDECL]]#0 : !hlfir.expr<3x3xf32>, !fir.ref> +! CHECK: hlfir.destroy %[[RESULT]] : !hlfir.expr<3x3xf32> z = matmul(x,y) end subroutine -! CHECK-LABEL: matmul_test2 -! CHECK-SAME: (%[[X_BOX:.*]]: !fir.box>>{{.*}}, %[[Y_BOX:.*]]: !fir.box>>{{.*}}, %[[Z_BOX:.*]]: !fir.box>>{{.*}}) -!CHECK: %[[RESULT_BOX_ADDR:.*]] = fir.alloca !fir.box>>> -!CHECK: %[[Z:.*]] = fir.array_load %[[Z_BOX]] : (!fir.box>>) -> !fir.array> -!CHECK: %[[ZERO_INIT:.*]] = fir.zero_bits !fir.heap>> -!CHECK: %[[C0:.*]] = arith.constant 0 : index -!CHECK: %[[RESULT_SHAPE:.*]] = fir.shape %[[C0]] : (index) -> !fir.shape<1> -!CHECK: %[[RESULT_BOX:.*]] = fir.embox %[[ZERO_INIT]](%[[RESULT_SHAPE]]) : (!fir.heap>>, !fir.shape<1>) -> !fir.box>>> -!CHECK: fir.store %[[RESULT_BOX]] to %[[RESULT_BOX_ADDR]] : !fir.ref>>>> -!CHECK: %[[RESULT_BOX_RUNTIME:.*]] = fir.convert %[[RESULT_BOX_ADDR]] : (!fir.ref>>>>) -> !fir.ref> -!CHECK: %[[X_BOX_RUNTIME:.*]] = fir.convert %[[X_BOX]] : (!fir.box>>) -> !fir.box -!CHECK: %[[Y_BOX_RUNTIME:.*]] = fir.convert %[[Y_BOX]] : (!fir.box>>) -> !fir.box -!CHECK: {{.*}}fir.call @_FortranAMatmulLogical4Logical4(%[[RESULT_BOX_RUNTIME]], %[[X_BOX_RUNTIME]], %[[Y_BOX_RUNTIME]], {{.*}}, {{.*}}) {{.*}}: (!fir.ref>, !fir.box, !fir.box, !fir.ref, i32) -> () -!CHECK: %[[RESULT_BOX:.*]] = fir.load %[[RESULT_BOX_ADDR]] : !fir.ref>>>> -!CHECK: %[[RESULT_TMP:.*]] = fir.box_addr %[[RESULT_BOX]] : (!fir.box>>>) -> !fir.heap>> -!CHECK: %[[Z_COPY_FROM_RESULT:.*]] = fir.do_loop -!CHECK: {{.*}}fir.array_fetch -!CHECK: {{.*}}fir.array_update -!CHECK: fir.result -!CHECK: } -!CHECK: fir.array_merge_store %[[Z]], %[[Z_COPY_FROM_RESULT]] to %[[Z_BOX]] : !fir.array>, !fir.array>, !fir.box>> -!CHECK: fir.freemem %[[RESULT_TMP]] : !fir.heap>> +! CHECK-LABEL: func.func @_QPmatmul_test2( +! CHECK-SAME: %[[X_BOX:.*]]: !fir.box>>{{.*}}, %[[Y_BOX:.*]]: !fir.box>>{{.*}}, %[[Z_BOX:.*]]: !fir.box>>{{.*}}) subroutine matmul_test2(X, Y, Z) logical :: X(:,:) logical :: Y(:) logical :: Z(:) +! CHECK-DAG: %[[XDECL:.*]]:2 = hlfir.declare %[[X_BOX]] +! CHECK-DAG: %[[YDECL:.*]]:2 = hlfir.declare %[[Y_BOX]] +! CHECK-DAG: %[[ZDECL:.*]]:2 = hlfir.declare %[[Z_BOX]] +! CHECK: %[[RESULT:.*]] = hlfir.matmul %[[XDECL]]#0 %[[YDECL]]#0 {{.*}} : (!fir.box>>, !fir.box>>) -> !hlfir.expr> +! CHECK: hlfir.assign %[[RESULT]] to %[[ZDECL]]#0 : !hlfir.expr>, !fir.box>> +! CHECK: hlfir.destroy %[[RESULT]] : !hlfir.expr> Z = matmul(X, Y) end subroutine diff --git a/flang/test/Lower/Intrinsics/max.f90 b/flang/test/Lower/Intrinsics/max.f90 index 9c83d2ec6ead..4231069023ad 100644 --- a/flang/test/Lower/Intrinsics/max.f90 +++ b/flang/test/Lower/Intrinsics/max.f90 @@ -1,37 +1,34 @@ -! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s +! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s module max_test contains - ! CHECK-LABEL: func @_QMmax_testPdynamic_optional( + ! CHECK-LABEL: func.func @_QMmax_testPdynamic_optional( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.box> {fir.bindc_name = "a"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.box> {fir.bindc_name = "b"}, ! CHECK-SAME: %[[VAL_2:.*]]: !fir.box> {fir.bindc_name = "c", fir.optional}) { subroutine dynamic_optional(a, b, c) integer :: a(:), b(:) integer, optional :: c(:) - ! CHECK: %[[VAL_10:.*]] = fir.array_load %[[VAL_0]] : (!fir.box>) -> !fir.array - ! CHECK: %[[VAL_11:.*]] = fir.array_load %[[VAL_1]] : (!fir.box>) -> !fir.array - ! CHECK: %[[VAL_12:.*]] = fir.is_present %[[VAL_2]] : (!fir.box>) -> i1 - ! CHECK: %[[VAL_17:.*]] = arith.select %[[VAL_12]], %[[VAL_2]], %{{.*}} : !fir.box> - ! CHECK: %[[VAL_18:.*]] = fir.array_load %[[VAL_17]] {fir.optional} : (!fir.box>) -> !fir.array - ! CHECK: fir.do_loop %[[VAL_26:.*]] = %{{.*}} to %{{.*}} step %{{.*}} unordered iter_args(%[[VAL_27:.*]] = %{{.*}}) -> (!fir.array) { - ! CHECK: %[[VAL_28:.*]] = fir.array_fetch %[[VAL_10]], %[[VAL_26]] : (!fir.array, index) -> i32 - ! CHECK: %[[VAL_29:.*]] = fir.array_fetch %[[VAL_11]], %[[VAL_26]] : (!fir.array, index) -> i32 - ! CHECK: %[[VAL_31:.*]] = arith.maxsi %[[VAL_28]], %[[VAL_29]] : i32 - ! CHECK: %[[VAL_32:.*]] = fir.if %[[VAL_12]] -> (i32) { - ! CHECK: %[[VAL_33:.*]] = fir.array_fetch %[[VAL_18]], %[[VAL_26]] : (!fir.array, index) -> i32 - ! CHECK: %[[VAL_35:.*]] = arith.maxsi %[[VAL_31]], %[[VAL_33]] : i32 - ! CHECK: fir.result %[[VAL_35]] : i32 - ! CHECK: } else { - ! CHECK: fir.result %[[VAL_31]] : i32 + ! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[VAL_0]] + ! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[VAL_1]] + ! CHECK-DAG: %[[C:.*]]:2 = hlfir.declare %[[VAL_2]] + ! CHECK: %[[IS_PRESENT:.*]] = fir.is_present %[[C]]#0 : (!fir.box>) -> i1 + ! CHECK: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1> + ! CHECK: hlfir.elemental %[[SHAPE]] unordered : (!fir.shape<1>) -> !hlfir.expr { + ! CHECK: %[[A_ELT:.*]] = fir.load %{{.*}} : !fir.ref + ! CHECK: %[[B_ELT:.*]] = fir.load %{{.*}} : !fir.ref + ! CHECK: %[[MAX_AB:.*]] = arith.maxsi %[[A_ELT]], %[[B_ELT]] : i32 + ! CHECK: fir.if %[[IS_PRESENT]] -> (i32) { + ! CHECK: %[[C_ELT:.*]] = fir.load %{{.*}} : !fir.ref + ! CHECK: arith.maxsi %[[MAX_AB]], %[[C_ELT]] : i32 ! CHECK: } - ! CHECK: %[[VAL_36:.*]] = fir.array_update %[[VAL_27]], %[[VAL_32]], %[[VAL_26]] : (!fir.array, i32, index) -> !fir.array - ! CHECK: fir.result %[[VAL_36]] : !fir.array ! CHECK: } + ! CHECK: OutputDescriptor + ! CHECK: EndIoStatement print *, max(a, b, c) end subroutine - ! CHECK-LABEL: func @_QMmax_testPdynamic_optional_array_expr_scalar_optional( + ! CHECK-LABEL: func.func @_QMmax_testPdynamic_optional_array_expr_scalar_optional( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.box> {fir.bindc_name = "a"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.box> {fir.bindc_name = "b"}, ! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref {fir.bindc_name = "c", fir.optional}) { @@ -39,26 +36,24 @@ module max_test integer :: a(:), b(:) integer, optional :: c print *, max(a, b, c) - ! CHECK: %[[VAL_10:.*]] = fir.array_load %[[VAL_0]] : (!fir.box>) -> !fir.array - ! CHECK: %[[VAL_11:.*]] = fir.array_load %[[VAL_1]] : (!fir.box>) -> !fir.array - ! CHECK: %[[VAL_12:.*]] = fir.is_present %[[VAL_2]] : (!fir.ref) -> i1 - ! CHECK: fir.do_loop %[[VAL_20:.*]] = %{{.*}} to %{{.*}} step %{{.*}} unordered iter_args(%[[VAL_21:.*]] = %{{.*}}) -> (!fir.array) { - ! CHECK: %[[VAL_22:.*]] = fir.array_fetch %[[VAL_10]], %[[VAL_20]] : (!fir.array, index) -> i32 - ! CHECK: %[[VAL_23:.*]] = fir.array_fetch %[[VAL_11]], %[[VAL_20]] : (!fir.array, index) -> i32 - ! CHECK: %[[VAL_25:.*]] = arith.maxsi %[[VAL_22]], %[[VAL_23]] : i32 - ! CHECK: %[[VAL_26:.*]] = fir.if %[[VAL_12]] -> (i32) { - ! CHECK: %[[VAL_27:.*]] = fir.load %[[VAL_2]] : !fir.ref - ! CHECK: %[[VAL_29:.*]] = arith.maxsi %[[VAL_25]], %[[VAL_27]] : i32 - ! CHECK: fir.result %[[VAL_29]] : i32 - ! CHECK: } else { - ! CHECK: fir.result %[[VAL_25]] : i32 + ! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[VAL_0]] + ! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[VAL_1]] + ! CHECK-DAG: %[[C:.*]]:2 = hlfir.declare %[[VAL_2]] + ! CHECK: %[[IS_PRESENT:.*]] = fir.is_present %[[C]]#0 : (!fir.ref) -> i1 + ! CHECK: hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr { + ! CHECK: %[[A_ELT:.*]] = fir.load %{{.*}} : !fir.ref + ! CHECK: %[[B_ELT:.*]] = fir.load %{{.*}} : !fir.ref + ! CHECK: %[[MAX_AB:.*]] = arith.maxsi %[[A_ELT]], %[[B_ELT]] : i32 + ! CHECK: fir.if %[[IS_PRESENT]] -> (i32) { + ! CHECK: %[[C_VAL:.*]] = fir.load %[[C]]#0 : !fir.ref + ! CHECK: arith.maxsi %[[MAX_AB]], %[[C_VAL]] : i32 ! CHECK: } - ! CHECK: %[[VAL_30:.*]] = fir.array_update %[[VAL_21]], %[[VAL_26]], %[[VAL_20]] : (!fir.array, i32, index) -> !fir.array - ! CHECK: fir.result %[[VAL_30]] : !fir.array ! CHECK: } + ! CHECK: OutputDescriptor + ! CHECK: EndIoStatement end subroutine - ! CHECK-LABEL: func @_QMmax_testPdynamic_optional_scalar( + ! CHECK-LABEL: func.func @_QMmax_testPdynamic_optional_scalar( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "a"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref {fir.bindc_name = "b"}, ! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref {fir.bindc_name = "c", fir.optional}) { @@ -66,21 +61,24 @@ module max_test integer :: a, b integer, optional :: c print *, max(a, b, c) - ! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_0]] : !fir.ref - ! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_1]] : !fir.ref - ! CHECK: %[[VAL_10:.*]] = fir.is_present %[[VAL_2]] : (!fir.ref) -> i1 - ! CHECK: %[[VAL_12:.*]] = arith.maxsi %[[VAL_8]], %[[VAL_9]] : i32 - ! CHECK: %[[VAL_13:.*]] = fir.if %[[VAL_10]] -> (i32) { - ! CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_2]] : !fir.ref - ! CHECK: %[[VAL_16:.*]] = arith.maxsi %[[VAL_12]], %[[VAL_14]] : i32 - ! CHECK: fir.result %[[VAL_16]] : i32 + ! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[VAL_0]] + ! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[VAL_1]] + ! CHECK-DAG: %[[C:.*]]:2 = hlfir.declare %[[VAL_2]] + ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]]#0 : !fir.ref + ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]]#0 : !fir.ref + ! CHECK: %[[IS_PRESENT:.*]] = fir.is_present %[[C]]#0 : (!fir.ref) -> i1 + ! CHECK: %[[MAX_AB:.*]] = arith.maxsi %[[A_VAL]], %[[B_VAL]] : i32 + ! CHECK: %[[RESULT:.*]] = fir.if %[[IS_PRESENT]] -> (i32) { + ! CHECK: %[[C_VAL:.*]] = fir.load %[[C]]#0 : !fir.ref + ! CHECK: %[[MAX_ABC:.*]] = arith.maxsi %[[MAX_AB]], %[[C_VAL]] : i32 + ! CHECK: fir.result %[[MAX_ABC]] : i32 ! CHECK: } else { - ! CHECK: fir.result %[[VAL_12]] : i32 + ! CHECK: fir.result %[[MAX_AB]] : i32 ! CHECK: } - ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[VAL_13]]) {{.*}}: (!fir.ref, i32) -> i1 + ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[RESULT]]) {{.*}}: (!fir.ref, i32) -> i1 end subroutine - ! CHECK-LABEL: func @_QMmax_testPdynamic_optional_weird( + ! CHECK-LABEL: func.func @_QMmax_testPdynamic_optional_weird( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "a"}, ! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref {fir.bindc_name = "b"}, ! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref {fir.bindc_name = "c", fir.optional}, @@ -91,28 +89,33 @@ module max_test integer, optional :: c, e ! a3, a4, a6, a8 statically missing. a5, a9 dynamically optional. print *, max(a1=a, a2=b, a5=c, a7=d, a9 = e) - ! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_0]] : !fir.ref - ! CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_1]] : !fir.ref - ! CHECK: %[[VAL_12:.*]] = fir.is_present %[[VAL_2]] : (!fir.ref) -> i1 - ! CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_3]] : !fir.ref - ! CHECK: %[[VAL_14:.*]] = fir.is_present %[[VAL_4]] : (!fir.ref) -> i1 - ! CHECK: %[[VAL_16:.*]] = arith.maxsi %[[VAL_10]], %[[VAL_11]] : i32 - ! CHECK: %[[VAL_17:.*]] = fir.if %[[VAL_12]] -> (i32) { - ! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_2]] : !fir.ref - ! CHECK: %[[VAL_20:.*]] = arith.maxsi %[[VAL_16]], %[[VAL_18]] : i32 - ! CHECK: fir.result %[[VAL_20]] : i32 + ! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[VAL_0]] + ! CHECK-DAG: %[[B:.*]]:2 = hlfir.declare %[[VAL_1]] + ! CHECK-DAG: %[[C:.*]]:2 = hlfir.declare %[[VAL_2]] + ! CHECK-DAG: %[[D:.*]]:2 = hlfir.declare %[[VAL_3]] + ! CHECK-DAG: %[[E:.*]]:2 = hlfir.declare %[[VAL_4]] + ! CHECK: %[[A_VAL:.*]] = fir.load %[[A]]#0 : !fir.ref + ! CHECK: %[[B_VAL:.*]] = fir.load %[[B]]#0 : !fir.ref + ! CHECK: %[[IS_C:.*]] = fir.is_present %[[C]]#0 : (!fir.ref) -> i1 + ! CHECK: %[[D_VAL:.*]] = fir.load %[[D]]#0 : !fir.ref + ! CHECK: %[[IS_E:.*]] = fir.is_present %[[E]]#0 : (!fir.ref) -> i1 + ! CHECK: %[[MAX_AB:.*]] = arith.maxsi %[[A_VAL]], %[[B_VAL]] : i32 + ! CHECK: %[[MAX_ABC:.*]] = fir.if %[[IS_C]] -> (i32) { + ! CHECK: %[[C_VAL:.*]] = fir.load %[[C]]#0 : !fir.ref + ! CHECK: %[[R:.*]] = arith.maxsi %[[MAX_AB]], %[[C_VAL]] : i32 + ! CHECK: fir.result %[[R]] : i32 ! CHECK: } else { - ! CHECK: fir.result %[[VAL_16]] : i32 + ! CHECK: fir.result %[[MAX_AB]] : i32 ! CHECK: } - ! CHECK: %[[VAL_23:.*]] = arith.maxsi %[[VAL_17]], %[[VAL_13]] : i32 - ! CHECK: %[[VAL_24:.*]] = fir.if %[[VAL_14]] -> (i32) { - ! CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_4]] : !fir.ref - ! CHECK: %[[VAL_27:.*]] = arith.maxsi %[[VAL_23]], %[[VAL_25]] : i32 - ! CHECK: fir.result %[[VAL_27]] : i32 + ! CHECK: %[[MAX_ABCD:.*]] = arith.maxsi %[[MAX_ABC]], %[[D_VAL]] : i32 + ! CHECK: %[[MAX_ABCDE:.*]] = fir.if %[[IS_E]] -> (i32) { + ! CHECK: %[[E_VAL:.*]] = fir.load %[[E]]#0 : !fir.ref + ! CHECK: %[[R:.*]] = arith.maxsi %[[MAX_ABCD]], %[[E_VAL]] : i32 + ! CHECK: fir.result %[[R]] : i32 ! CHECK: } else { - ! CHECK: fir.result %[[VAL_23]] : i32 + ! CHECK: fir.result %[[MAX_ABCD]] : i32 ! CHECK: } - ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[VAL_24]]) {{.*}}: (!fir.ref, i32) -> i1 + ! CHECK: fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[MAX_ABCDE]]) {{.*}}: (!fir.ref, i32) -> i1 end subroutine end module