[flang-commits] [flang] aa8e292 - [flang] Converted five tests from old lowering to new lowering (part 9) (#176310)
via flang-commits
flang-commits at lists.llvm.org
Wed Jan 28 07:09:20 PST 2026
Author: Eugene Epshteyn
Date: 2026-01-28T10:09:15-05:00
New Revision: aa8e292e616ef8905afc09044d56f22b196a893a
URL: https://github.com/llvm/llvm-project/commit/aa8e292e616ef8905afc09044d56f22b196a893a
DIFF: https://github.com/llvm/llvm-project/commit/aa8e292e616ef8905afc09044d56f22b196a893a.diff
LOG: [flang] Converted five tests from old lowering to new lowering (part 9) (#176310)
Tests converted from test/Lower: c-interoperability-c-pointer.f90,
c-interoperability.f90, character-elemental.f90,
character-local-variables.f90, complex-operations.f90
Added:
Modified:
flang/test/Lower/c-interoperability-c-pointer.f90
flang/test/Lower/c-interoperability.f90
flang/test/Lower/character-elemental.f90
flang/test/Lower/character-local-variables.f90
flang/test/Lower/complex-operations.f90
Removed:
################################################################################
diff --git a/flang/test/Lower/c-interoperability-c-pointer.f90 b/flang/test/Lower/c-interoperability-c-pointer.f90
index c62f48fa9a1be..7332802de98c0 100644
--- a/flang/test/Lower/c-interoperability-c-pointer.f90
+++ b/flang/test/Lower/c-interoperability-c-pointer.f90
@@ -1,15 +1,18 @@
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! CHECK-LABEL: func.func @_QPtest(
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>> {fir.bindc_name = "ptr1"},
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>> {fir.bindc_name = "ptr2"}) {
-! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_0]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<i64>
-! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i64) -> !fir.ref<i64>
-! CHECK: %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_1]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64>
-! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> !fir.ref<i64>
-! CHECK: fir.call @c_func(%[[VAL_5]], %[[VAL_9]]) {{.*}}: (!fir.ref<i64>, !fir.ref<i64>) -> ()
+! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
+! CHECK: %[[VAL_131:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_2]] arg 1 {uniq_name = "_QFtestEptr1"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.dscope) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>)
+! CHECK: %[[VAL_132:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %[[VAL_2]] arg 2 {uniq_name = "_QFtestEptr2"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.dscope) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>)
+! CHECK: %[[VAL_133:.*]] = fir.coordinate_of %[[VAL_131]]#0, __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> !fir.ref<i64>
+! CHECK: %[[VAL_134:.*]] = fir.load %[[VAL_133]] : !fir.ref<i64>
+! CHECK: %[[VAL_135:.*]] = fir.convert %[[VAL_134]] : (i64) -> !fir.ref<i64>
+! CHECK: %[[VAL_136:.*]] = fir.coordinate_of %[[VAL_132]]#0, __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>) -> !fir.ref<i64>
+! CHECK: %[[VAL_137:.*]] = fir.load %[[VAL_136]] : !fir.ref<i64>
+! CHECK: %[[VAL_138:.*]] = fir.convert %[[VAL_137]] : (i64) -> !fir.ref<i64>
+! CHECK: fir.call @c_func(%[[VAL_135]], %[[VAL_138]]) {{.*}}: (!fir.ref<i64>, !fir.ref<i64>) -> ()
! CHECK: return
! CHECK: }
@@ -31,15 +34,15 @@ subroutine c_func(c_t1, c_t2) bind(c, name="c_func")
! CHECK-LABEL: func.func @test_callee_c_ptr(
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64>
+! CHECK: %[[VAL_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}> {bindc_name = "local", uniq_name = "_QFtest_callee_c_ptrElocal"}
-! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
-! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_1]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64
-! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64>
-! CHECK: %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_1]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_9:.*]] = fir.coordinate_of %[[VAL_5]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64>
-! CHECK: fir.store %[[VAL_10]] to %[[VAL_9]] : !fir.ref<i64>
+! CHECK: %[[VAL_132:.*]]:2 = hlfir.declare %[[VAL_5]] {uniq_name = "_QFtest_callee_c_ptrElocal"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>)
+! CHECK: %[[VAL_133:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
+! CHECK: %[[VAL_134:.*]] = fir.coordinate_of %[[VAL_133]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> !fir.ref<i64>
+! CHECK: %[[VAL_135:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64
+! CHECK: fir.store %[[VAL_135]] to %[[VAL_134]] : !fir.ref<i64>
+! CHECK: %[[VAL_136:.*]]:2 = hlfir.declare %[[VAL_133]] dummy_scope %[[VAL_1]] arg 1 {fortran_attrs = #fir.var_attrs<value>, uniq_name = "_QFtest_callee_c_ptrEptr1"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.dscope) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>)
+! CHECK: hlfir.assign %[[VAL_136]]#0 to %[[VAL_132]]#0 : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>
! CHECK: return
! CHECK: }
@@ -52,16 +55,15 @@ subroutine test_callee_c_ptr(ptr1) bind(c)
! CHECK-LABEL: func.func @test_callee_c_funptr(
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i64>
+! CHECK: %[[VAL_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}> {bindc_name = "local", uniq_name = "_QFtest_callee_c_funptrElocal"}
-! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>
-! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_1]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64
-! CHECK: fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ref<i64>
-
-! CHECK: %[[VAL_7:.*]] = fir.coordinate_of %[[VAL_1]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_9:.*]] = fir.coordinate_of %[[VAL_5]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>) -> !fir.ref<i64>
-! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_7]] : !fir.ref<i64>
-! CHECK: fir.store %[[VAL_10]] to %[[VAL_9]] : !fir.ref<i64>
+! CHECK: %[[VAL_132:.*]]:2 = hlfir.declare %[[VAL_5]] {uniq_name = "_QFtest_callee_c_funptrElocal"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>)
+! CHECK: %[[VAL_133:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>
+! CHECK: %[[VAL_134:.*]] = fir.coordinate_of %[[VAL_133]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>) -> !fir.ref<i64>
+! CHECK: %[[VAL_135:.*]] = fir.convert %[[VAL_0]] : (!fir.ref<i64>) -> i64
+! CHECK: fir.store %[[VAL_135]] to %[[VAL_134]] : !fir.ref<i64>
+! CHECK: %[[VAL_136:.*]]:2 = hlfir.declare %[[VAL_133]] dummy_scope %[[VAL_1]] arg 1 {fortran_attrs = #fir.var_attrs<value>, uniq_name = "_QFtest_callee_c_funptrEptr1"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.dscope) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>)
+! CHECK: hlfir.assign %[[VAL_136]]#0 to %[[VAL_132]]#0 : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_funptr{__address:i64}>>
! CHECK: return
! CHECK: }
diff --git a/flang/test/Lower/c-interoperability.f90 b/flang/test/Lower/c-interoperability.f90
index 613f8747aa5f6..64ffd8b0994d7 100644
--- a/flang/test/Lower/c-interoperability.f90
+++ b/flang/test/Lower/c-interoperability.f90
@@ -1,21 +1,29 @@
-! RUN: bbc -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! CHECK-LABEL: fir.global @_QMc_interoperability_testEthis_thing : !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}> {
-! CHECK: %[[VAL_0:.*]] = arith.constant 0 : i64
-! CHECK: %[[VAL_1:.*]] = fir.undefined !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
-! CHECK: %[[VAL_2:.*]] = fir.undefined !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
-! CHECK: %[[VAL_3:.*]] = fir.insert_value %[[VAL_2]], %[[VAL_0]], ["__address", !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>] : (!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>, i64) -> !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
-! CHECK: %[[VAL_4:.*]] = fir.insert_value %[[VAL_1]], %[[VAL_3]], ["cptr", !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>] : (!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>) -> !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
-! CHECK: fir.has_value %[[VAL_4]] : !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
+! CHECK: %[[VAL_0:.*]] = fir.undefined !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
+! CHECK: %[[VAL_1:.*]] = fir.undefined !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
+! CHECK: %[[VAL_2:.*]] = fir.field_index __address, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
+! CHECK: %[[VAL_3:.*]] = arith.constant 0 : i64
+! CHECK: %[[VAL_4:.*]] = fir.insert_value %[[VAL_1]], %[[VAL_3]], ["__address", !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>] : (!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>, i64) -> !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>
+! CHECK: %[[VAL_5:.*]] = fir.field_index cptr, !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
+! CHECK: %[[VAL_6:.*]] = fir.insert_value %[[VAL_0]], %[[VAL_4]], ["cptr", !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>] : (!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>, !fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>) -> !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
+! CHECK: fir.has_value %[[VAL_6]] : !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
! CHECK: }
! CHECK-LABEL: func @_QMc_interoperability_testPget_a_thing() -> !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}> {
-! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
+! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+! CHECK: %[[VAL_1:.*]] = fir.address_of(@_QM__fortran_builtinsEC__builtin_c_null_ptr) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>
+! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QM__fortran_builtinsEC__builtin_c_null_ptr"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>)
! CHECK: %[[VAL_3:.*]] = fir.address_of(@_QMc_interoperability_testEthis_thing) : !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
-! CHECK: %[[VAL_4:.*]] = fir.alloca !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}> {bindc_name = "get_a_thing", uniq_name = "_QMc_interoperability_testFget_a_thingEget_a_thing"}
-! CHECK: %[[VAL_5:.*]] = fir.embox %[[VAL_4]] : (!fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>) -> !fir.box<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
-! CHECK: %[[VAL_10:.*]] = fir.embox %[[VAL_3]] : (!fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>) -> !fir.box<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
-! CHECK: return %{{.*}} : !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
+! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_3]] {uniq_name = "_QMc_interoperability_testEthis_thing"} : (!fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>) -> (!fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>, !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>)
+! CHECK: %[[VAL_5:.*]] = fir.alloca !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}> {bindc_name = "get_a_thing", uniq_name = "_QMc_interoperability_testFget_a_thingEget_a_thing"}
+! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_5]] {uniq_name = "_QMc_interoperability_testFget_a_thingEget_a_thing"} : (!fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>) -> (!fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>, !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>)
+! CHECK: %[[VAL_7:.*]] = fir.address_of(@_QQ_QMc_interoperability_testTthing_with_pointer.DerivedInit) : !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
+! CHECK: fir.copy %[[VAL_7]] to %[[VAL_6]]#0 no_overlap : !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>, !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
+! CHECK: hlfir.assign %[[VAL_4]]#0 to %[[VAL_6]]#0 : !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>, !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
+! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<!fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>>
+! CHECK: return %[[VAL_8]] : !fir.type<_QMc_interoperability_testTthing_with_pointer{cptr:!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>}>
! CHECK: }
module c_interoperability_test
diff --git a/flang/test/Lower/character-elemental.f90 b/flang/test/Lower/character-elemental.f90
index 9a9cf8bf2d9c6..a6a7912063fe8 100644
--- a/flang/test/Lower/character-elemental.f90
+++ b/flang/test/Lower/character-elemental.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! CHECK-LABEL: substring_main
subroutine substring_main
@@ -13,26 +13,23 @@ end function inner
end interface
ival = 1
- ! CHECK: %[[a0:.*]] = fir.alloca i32 {bindc_name = "ival", uniq_name = "_QFsubstring_mainEival"}
- ! CHECK: %[[a2:.*]] = fir.address_of(@_QFsubstring_mainEstring) : !fir.ref<!fir.array<2x!fir.char<1,7>>>
- ! CHECK: fir.store {{.*}} to %[[a0]] : !fir.ref<i32>
- ! CHECK: %[[a3:.*]] = fir.shape {{.*}} : (index) -> !fir.shape<1>
- ! CHECK: %[[a4:.*]] = fir.slice {{.*}}, {{.*}}, {{.*}} : (index, index, index) -> !fir.slice<1>
- ! CHECK: br ^bb1({{.*}}, {{.*}} : index, index)
- ! CHECK: ^bb1(%[[a5:.*]]: index, %[[a6:.*]]: index): // 2 preds: ^bb0, ^bb2
- ! CHECK: %[[a7:.*]] = arith.cmpi sgt, %[[a6]], {{.*}} : index
- ! CHECK: cond_br %[[a7]], ^bb2, ^bb3
- ! CHECK: ^bb2: // pred: ^bb1
- ! CHECK: %[[a8:.*]] = arith.addi %[[a5]], {{.*}} : index
- ! CHECK: %[[a9:.*]] = fir.array_coor %[[a2]](%[[a3]]) [%[[a4]]] %[[a8]] : (!fir.ref<!fir.array<2x!fir.char<1,7>>>, !fir.shape<1>, !fir.slice<1>, index) -> !fir.ref<!fir.char<1,7>>
- ! CHECK: %[[a10:.*]] = fir.load %[[a0]] : !fir.ref<i32>
- ! CHECK: %[[a11:.*]] = fir.convert %[[a10]] : (i32) -> index
- ! CHECK: %[[a12:.*]] = arith.subi %[[a11]], {{.*}} : index
- ! CHECK: %[[a13:.*]] = fir.convert %[[a9]] : (!fir.ref<!fir.char<1,7>>) -> !fir.ref<!fir.array<7x!fir.char<1>>>
- ! CHECK: %[[a14:.*]] = fir.coordinate_of %[[a13]], %[[a12]] : (!fir.ref<!fir.array<7x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>>
- ! CHECK: %[[a15:.*]] = fir.convert %[[a14]] : (!fir.ref<!fir.char<1>>) -> !fir.ref<!fir.char<1,?>>
- ! CHECK: %[[a16:.*]] = fir.emboxchar %[[a15]], {{.*}} : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
- ! CHECK: %[[a17:.*]] = fir.call @_QPinner(%[[a16]]) {{.*}}: (!fir.boxchar<1>) -> i32
+ ! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "ival", uniq_name = "_QFsubstring_mainEival"}
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFsubstring_mainEival"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ ! CHECK: %[[VAL_6:.*]] = fir.address_of(@_QFsubstring_mainEstring) : !fir.ref<!fir.array<2x!fir.char<1,7>>>
+ ! CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_6]](%{{.*}}) typeparams %{{.*}} {uniq_name = "_QFsubstring_mainEstring"} : (!fir.ref<!fir.array<2x!fir.char<1,7>>>, !fir.shape<1>, index) -> (!fir.ref<!fir.array<2x!fir.char<1,7>>>, !fir.ref<!fir.array<2x!fir.char<1,7>>>)
+ ! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<i32>
+ ! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i32) -> i64
+ ! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<i32>
+ ! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i32) -> i64
+ ! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_11]] : (i64) -> index
+ ! CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_13]] : (i64) -> index
+ ! CHECK: %[[VAL_20:.*]] = hlfir.designate %[[VAL_8]]#0 (%{{.*}}:%{{.*}}:%{{.*}}) substr %[[VAL_14]], %[[VAL_15]] shape %{{.*}} typeparams %{{.*}} : (!fir.ref<!fir.array<2x!fir.char<1,7>>>, index, index, index, index, index, !fir.shape<1>, index) -> !fir.box<!fir.array<2x!fir.char<1,?>>>
+ ! CHECK: %[[VAL_21:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<2xi32> {
+ ! CHECK: ^bb0(%[[VAL_22:.*]]: index):
+ ! CHECK: %[[VAL_23:.*]] = hlfir.designate %[[VAL_20]] (%[[VAL_22]]) typeparams %{{.*}} : (!fir.box<!fir.array<2x!fir.char<1,?>>>, index, index) -> !fir.boxchar<1>
+ ! CHECK: %[[VAL_24:.*]] = fir.call @_QPinner(%[[VAL_23]]) {{.*}} : (!fir.boxchar<1>) -> i32
+ ! CHECK: hlfir.yield_element %[[VAL_24]] : i32
+ ! CHECK: }
result = inner(string(1:2)(ival:ival))
print *, result
end subroutine substring_main
diff --git a/flang/test/Lower/character-local-variables.f90 b/flang/test/Lower/character-local-variables.f90
index 6325229993a25..915101195aafb 100644
--- a/flang/test/Lower/character-local-variables.f90
+++ b/flang/test/Lower/character-local-variables.f90
@@ -1,125 +1,185 @@
-! RUN: bbc -hlfir=false %s -o - | FileCheck %s
-! RUN: bbc -hlfir=false --enable-constant-argument-globalisation %s -o - \
-! RUN: | FileCheck %s --check-prefix=CHECK-CONST
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! Test lowering of local character variables
! CHECK-LABEL: func @_QPscalar_cst_len
subroutine scalar_cst_len()
character(10) :: c
- ! CHECK: fir.alloca !fir.char<1,10> {{{.*}}uniq_name = "_QFscalar_cst_lenEc"}
+ ! CHECK: %[[VAL_0:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.char<1,10> {bindc_name = "c", uniq_name = "_QFscalar_cst_lenEc"}
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] typeparams %[[VAL_0]] {uniq_name = "_QFscalar_cst_lenEc"} : (!fir.ref<!fir.char<1,10>>, index) -> (!fir.ref<!fir.char<1,10>>, !fir.ref<!fir.char<1,10>>)
print *, c
end subroutine
! CHECK-LABEL: func @_QPscalar_dyn_len
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i32>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32>
subroutine scalar_dyn_len(l)
integer :: l
character(l) :: c
- ! CHECK: %[[lexpr:.*]] = fir.load %[[arg0]] : !fir.ref<i32>
- ! CHECK: %[[is_positive:.*]] = arith.cmpi sgt, %[[lexpr]], %c0{{.*}} : i32
- ! CHECK: %[[l:.*]] = arith.select %[[is_positive]], %[[lexpr]], %c0{{.*}} : i32
- ! CHECK: fir.alloca !fir.char<1,?>(%[[l]] : i32) {{{.*}}uniq_name = "_QFscalar_dyn_lenEc"}
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFscalar_dyn_lenEl"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
+ ! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i32>
+ ! CHECK: %[[VAL_3:.*]] = arith.constant 0 : i32
+ ! CHECK: %[[VAL_4:.*]] = arith.cmpi sgt, %[[VAL_2]], %[[VAL_3]] : i32
+ ! CHECK: %[[VAL_5:.*]] = arith.select %[[VAL_4]], %[[VAL_2]], %[[VAL_3]] : i32
+ ! CHECK: %[[VAL_6:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_5]] : i32) {bindc_name = "c", uniq_name = "_QFscalar_dyn_lenEc"}
+ ! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]] typeparams %[[VAL_5]] {uniq_name = "_QFscalar_dyn_lenEc"} : (!fir.ref<!fir.char<1,?>>, i32) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
print *, c
end subroutine
! CHECK-LABEL: func @_QPcst_array_cst_len
subroutine cst_array_cst_len()
character(10) :: c(20)
- ! CHECK: fir.alloca !fir.array<20x!fir.char<1,10>> {{{.*}}uniq_name = "_QFcst_array_cst_lenEc"}
+ ! CHECK: %[[VAL_0:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_1:.*]] = arith.constant 20 : index
+ ! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.array<20x!fir.char<1,10>> {bindc_name = "c", uniq_name = "_QFcst_array_cst_lenEc"}
+ ! CHECK: %[[VAL_3:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>
+ ! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_3]]) typeparams %[[VAL_0]] {uniq_name = "_QFcst_array_cst_lenEc"} : (!fir.ref<!fir.array<20x!fir.char<1,10>>>, !fir.shape<1>, index) -> (!fir.ref<!fir.array<20x!fir.char<1,10>>>, !fir.ref<!fir.array<20x!fir.char<1,10>>>)
print *, c(1)
end subroutine
! CHECK-LABEL: func @_QPcst_array_dyn_len
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i32>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32>
subroutine cst_array_dyn_len(l)
integer :: l
character(l) :: c(10)
- ! CHECK: %[[lexpr:.*]] = fir.load %[[arg0]] : !fir.ref<i32>
- ! CHECK: %[[is_positive:.*]] = arith.cmpi sgt, %[[lexpr]], %c0{{.*}} : i32
- ! CHECK: %[[l:.*]] = arith.select %[[is_positive]], %[[lexpr]], %c0{{.*}} : i32
- ! CHECK: fir.alloca !fir.array<10x!fir.char<1,?>>(%[[l]] : i32) {{{.*}}uniq_name = "_QFcst_array_dyn_lenEc"}
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFcst_array_dyn_lenEl"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
+ ! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i32>
+ ! CHECK: %[[VAL_3:.*]] = arith.constant 0 : i32
+ ! CHECK: %[[VAL_4:.*]] = arith.cmpi sgt, %[[VAL_2]], %[[VAL_3]] : i32
+ ! CHECK: %[[VAL_5:.*]] = arith.select %[[VAL_4]], %[[VAL_2]], %[[VAL_3]] : i32
+ ! CHECK: %[[VAL_6:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_7:.*]] = fir.alloca !fir.array<10x!fir.char<1,?>>(%[[VAL_5]] : i32) {bindc_name = "c", uniq_name = "_QFcst_array_dyn_lenEc"}
+ ! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
+ ! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_7]](%[[VAL_8]]) typeparams %[[VAL_5]] {uniq_name = "_QFcst_array_dyn_lenEc"} : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shape<1>, i32) -> (!fir.box<!fir.array<10x!fir.char<1,?>>>, !fir.ref<!fir.array<10x!fir.char<1,?>>>)
print *, c(1)
end subroutine
! CHECK-LABEL: func @_QPdyn_array_cst_len
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i32>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32>
subroutine dyn_array_cst_len(n)
integer :: n
character(10) :: c(n)
- ! CHECK: %[[n:.*]] = fir.load %[[arg0]] : !fir.ref<i32>
- ! CHECK: %[[ni:.*]] = fir.convert %[[n]] : (i32) -> index
- ! CHECK: %[[is_positive:.*]] = arith.cmpi sgt, %[[ni]], %c0{{.*}} : index
- ! CHECK: %[[extent:.*]] = arith.select %[[is_positive]], %[[ni]], %c0{{.*}} : index
- ! CHECK: fir.alloca !fir.array<?x!fir.char<1,10>>, %[[extent]] {{{.*}}uniq_name = "_QFdyn_array_cst_lenEc"}
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdyn_array_cst_lenEn"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
+ ! CHECK: %[[VAL_2:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i32>
+ ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> i64
+ ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i64) -> index
+ ! CHECK: %[[VAL_6:.*]] = arith.constant 0 : index
+ ! CHECK: %[[VAL_7:.*]] = arith.cmpi sgt, %[[VAL_5]], %[[VAL_6]] : index
+ ! CHECK: %[[VAL_8:.*]] = arith.select %[[VAL_7]], %[[VAL_5]], %[[VAL_6]] : index
+ ! CHECK: %[[VAL_9:.*]] = fir.alloca !fir.array<?x!fir.char<1,10>>, %[[VAL_8]] {bindc_name = "c", uniq_name = "_QFdyn_array_cst_lenEc"}
+ ! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_8]] : (index) -> !fir.shape<1>
+ ! CHECK: %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_9]](%[[VAL_10]]) typeparams %[[VAL_2]] {uniq_name = "_QFdyn_array_cst_lenEc"} : (!fir.ref<!fir.array<?x!fir.char<1,10>>>, !fir.shape<1>, index) -> (!fir.box<!fir.array<?x!fir.char<1,10>>>, !fir.ref<!fir.array<?x!fir.char<1,10>>>)
print *, c(1)
end subroutine
-! CHECK: func @_QPdyn_array_dyn_len
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i32>{{.*}}, %[[arg1:.*]]: !fir.ref<i32>
+! CHECK-LABEL: func @_QPdyn_array_dyn_len
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32>{{.*}}, %[[ARG1:.*]]: !fir.ref<i32>
subroutine dyn_array_dyn_len(l, n)
integer :: l, n
character(l) :: c(n)
- ! CHECK-DAG: %[[lexpr:.*]] = fir.load %[[arg0]] : !fir.ref<i32>
- ! CHECK-DAG: %[[is_positive:.*]] = arith.cmpi sgt, %[[lexpr]], %c0{{.*}} : i32
- ! CHECK-DAG: %[[l:.*]] = arith.select %[[is_positive]], %[[lexpr]], %c0{{.*}} : i32
- ! CHECK-DAG: %[[n:.*]] = fir.load %[[arg1]] : !fir.ref<i32>
- ! CHECK: %[[ni:.*]] = fir.convert %[[n]] : (i32) -> index
- ! CHECK: %[[is_positive:.*]] = arith.cmpi sgt, %[[ni]], %c0{{.*}} : index
- ! CHECK: %[[extent:.*]] = arith.select %[[is_positive]], %[[ni]], %c0{{.*}} : index
- ! CHECK: fir.alloca !fir.array<?x!fir.char<1,?>>(%[[l]] : i32), %[[extent]] {{{.*}}uniq_name = "_QFdyn_array_dyn_lenEc"}
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdyn_array_dyn_lenEl"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdyn_array_dyn_lenEn"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
+ ! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i32>
+ ! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i32
+ ! CHECK: %[[VAL_5:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[VAL_4]] : i32
+ ! CHECK: %[[VAL_6:.*]] = arith.select %[[VAL_5]], %[[VAL_3]], %[[VAL_4]] : i32
+ ! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<i32>
+ ! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> i64
+ ! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
+ ! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index
+ ! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_9]], %[[VAL_10]] : index
+ ! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_9]], %[[VAL_10]] : index
+ ! CHECK: %[[VAL_13:.*]] = fir.alloca !fir.array<?x!fir.char<1,?>>(%[[VAL_6]] : i32), %[[VAL_12]] {bindc_name = "c", uniq_name = "_QFdyn_array_dyn_lenEc"}
+ ! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_12]] : (index) -> !fir.shape<1>
+ ! CHECK: %[[VAL_15:.*]]:2 = hlfir.declare %[[VAL_13]](%[[VAL_14]]) typeparams %[[VAL_6]] {uniq_name = "_QFdyn_array_dyn_lenEc"} : (!fir.ref<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, i32) -> (!fir.box<!fir.array<?x!fir.char<1,?>>>, !fir.ref<!fir.array<?x!fir.char<1,?>>>)
print *, c(1)
end subroutine
! CHECK-LABEL: func @_QPcst_array_cst_len_lb
subroutine cst_array_cst_len_lb()
character(10) :: c(11:30)
- ! CHECK: fir.alloca !fir.array<20x!fir.char<1,10>> {{{.*}}uniq_name = "_QFcst_array_cst_len_lbEc"}
+ ! CHECK: %[[VAL_0:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_1:.*]] = arith.constant 11 : index
+ ! CHECK: %[[VAL_2:.*]] = arith.constant 20 : index
+ ! CHECK: %[[VAL_3:.*]] = fir.alloca !fir.array<20x!fir.char<1,10>> {bindc_name = "c", uniq_name = "_QFcst_array_cst_len_lbEc"}
+ ! CHECK: %[[VAL_4:.*]] = fir.shape_shift %[[VAL_1]], %[[VAL_2]] : (index, index) -> !fir.shapeshift<1>
+ ! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_3]](%[[VAL_4]]) typeparams %[[VAL_0]] {uniq_name = "_QFcst_array_cst_len_lbEc"} : (!fir.ref<!fir.array<20x!fir.char<1,10>>>, !fir.shapeshift<1>, index) -> (!fir.box<!fir.array<20x!fir.char<1,10>>>, !fir.ref<!fir.array<20x!fir.char<1,10>>>)
print *, c(11)
end subroutine
! CHECK-LABEL: func @_QPcst_array_dyn_len_lb
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i64>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i64>
subroutine cst_array_dyn_len_lb(l)
integer(8) :: l
character(l) :: c(11:20)
- ! CHECK: %[[lexpr:.*]] = fir.load %[[arg0]] : !fir.ref<i64>
- ! CHECK: %[[is_positive:.*]] = arith.cmpi sgt, %[[lexpr]], %c0{{.*}} : i64
- ! CHECK: %[[l:.*]] = arith.select %[[is_positive]], %[[lexpr]], %c0{{.*}} : i64
- ! CHECK: fir.alloca !fir.array<10x!fir.char<1,?>>(%[[l]] : i64) {{{.*}}uniq_name = "_QFcst_array_dyn_len_lbEc"}
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFcst_array_dyn_len_lbEl"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
+ ! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i64>
+ ! CHECK: %[[VAL_3:.*]] = arith.constant 0 : i64
+ ! CHECK: %[[VAL_4:.*]] = arith.cmpi sgt, %[[VAL_2]], %[[VAL_3]] : i64
+ ! CHECK: %[[VAL_5:.*]] = arith.select %[[VAL_4]], %[[VAL_2]], %[[VAL_3]] : i64
+ ! CHECK: %[[VAL_6:.*]] = arith.constant 11 : index
+ ! CHECK: %[[VAL_7:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.array<10x!fir.char<1,?>>(%[[VAL_5]] : i64) {bindc_name = "c", uniq_name = "_QFcst_array_dyn_len_lbEc"}
+ ! CHECK: %[[VAL_9:.*]] = fir.shape_shift %[[VAL_6]], %[[VAL_7]] : (index, index) -> !fir.shapeshift<1>
+ ! CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_8]](%[[VAL_9]]) typeparams %[[VAL_5]] {uniq_name = "_QFcst_array_dyn_len_lbEc"} : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shapeshift<1>, i64) -> (!fir.box<!fir.array<10x!fir.char<1,?>>>, !fir.ref<!fir.array<10x!fir.char<1,?>>>)
print *, c(11)
end subroutine
! CHECK-LABEL: func @_QPdyn_array_cst_len_lb
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i64>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i64>
subroutine dyn_array_cst_len_lb(n)
integer(8) :: n
character(10) :: c(11:n)
- ! CHECK-DAG: %[[cm10:.*]] = arith.constant -10 : index
- ! CHECK-DAG: %[[n:.*]] = fir.load %[[arg0]] : !fir.ref<i64>
- ! CHECK-DAG: %[[ni:.*]] = fir.convert %[[n]] : (i64) -> index
- ! CHECK: %[[raw_extent:.*]] = arith.addi %[[ni]], %[[cm10]] : index
- ! CHECK: %[[is_positive:.*]] = arith.cmpi sgt, %[[raw_extent]], %c0{{.*}} : index
- ! CHECK: %[[extent:.*]] = arith.select %[[is_positive]], %[[raw_extent]], %c0{{.*}} : index
- ! CHECK: fir.alloca !fir.array<?x!fir.char<1,10>>, %[[extent]] {{{.*}}uniq_name = "_QFdyn_array_cst_len_lbEc"}
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdyn_array_cst_len_lbEn"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
+ ! CHECK: %[[VAL_2:.*]] = arith.constant 10 : index
+ ! CHECK: %[[VAL_3:.*]] = arith.constant 11 : i64
+ ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i64) -> index
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i64>
+ ! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i64) -> index
+ ! CHECK: %[[VAL_7:.*]] = arith.constant 1 : index
+ ! CHECK: %[[VAL_8:.*]] = arith.constant 0 : index
+ ! CHECK: %[[VAL_9:.*]] = arith.subi %[[VAL_6]], %[[VAL_4]] : index
+ ! CHECK: %[[VAL_10:.*]] = arith.addi %[[VAL_9]], %[[VAL_7]] : index
+ ! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_10]], %[[VAL_8]] : index
+ ! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_10]], %[[VAL_8]] : index
+ ! CHECK: %[[VAL_13:.*]] = fir.alloca !fir.array<?x!fir.char<1,10>>, %[[VAL_12]] {bindc_name = "c", uniq_name = "_QFdyn_array_cst_len_lbEc"}
+ ! CHECK: %[[VAL_14:.*]] = fir.shape_shift %[[VAL_4]], %[[VAL_12]] : (index, index) -> !fir.shapeshift<1>
+ ! CHECK: %[[VAL_15:.*]]:2 = hlfir.declare %[[VAL_13]](%[[VAL_14]]) typeparams %[[VAL_2]] {uniq_name = "_QFdyn_array_cst_len_lbEc"} : (!fir.ref<!fir.array<?x!fir.char<1,10>>>, !fir.shapeshift<1>, index) -> (!fir.box<!fir.array<?x!fir.char<1,10>>>, !fir.ref<!fir.array<?x!fir.char<1,10>>>)
print *, c(11)
end subroutine
! CHECK-LABEL: func @_QPdyn_array_dyn_len_lb
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<i64>{{.*}}, %[[arg1:.*]]: !fir.ref<i64>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i64>{{.*}}, %[[ARG1:.*]]: !fir.ref<i64>
subroutine dyn_array_dyn_len_lb(l, n)
integer(8) :: l, n
character(l) :: c(11:n)
- ! CHECK-DAG: %[[cm10:.*]] = arith.constant -10 : index
- ! CHECK-DAG: %[[lexpr:.*]] = fir.load %[[arg0]] : !fir.ref<i64>
- ! CHECK-DAG: %[[is_positive:.*]] = arith.cmpi sgt, %[[lexpr]], %c0{{.*}} : i64
- ! CHECK-DAG: %[[l:.*]] = arith.select %[[is_positive]], %[[lexpr]], %c0{{.*}} : i64
- ! CHECK-DAG: %[[n:.*]] = fir.load %[[arg1]] : !fir.ref<i64>
- ! CHECK-DAG: %[[ni:.*]] = fir.convert %[[n]] : (i64) -> index
- ! CHECK: %[[raw_extent:.*]] = arith.addi %[[ni]], %[[cm10]] : index
- ! CHECK: %[[is_positive:.*]] = arith.cmpi sgt, %[[raw_extent]], %c0{{.*}} : index
- ! CHECK: %[[extent:.*]] = arith.select %[[is_positive]], %[[raw_extent]], %c0{{.*}} : index
- ! CHECK: fir.alloca !fir.array<?x!fir.char<1,?>>(%[[l]] : i64), %[[extent]] {{{.*}}uniq_name = "_QFdyn_array_dyn_len_lbEc"}
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdyn_array_dyn_len_lbEl"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdyn_array_dyn_len_lbEn"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
+ ! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i64>
+ ! CHECK: %[[VAL_4:.*]] = arith.constant 0 : i64
+ ! CHECK: %[[VAL_5:.*]] = arith.cmpi sgt, %[[VAL_3]], %[[VAL_4]] : i64
+ ! CHECK: %[[VAL_6:.*]] = arith.select %[[VAL_5]], %[[VAL_3]], %[[VAL_4]] : i64
+ ! CHECK: %[[VAL_7:.*]] = arith.constant 11 : i64
+ ! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i64) -> index
+ ! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<i64>
+ ! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i64) -> index
+ ! CHECK: %[[VAL_11:.*]] = arith.constant 1 : index
+ ! CHECK: %[[VAL_12:.*]] = arith.constant 0 : index
+ ! CHECK: %[[VAL_13:.*]] = arith.subi %[[VAL_10]], %[[VAL_8]] : index
+ ! CHECK: %[[VAL_14:.*]] = arith.addi %[[VAL_13]], %[[VAL_11]] : index
+ ! CHECK: %[[VAL_15:.*]] = arith.cmpi sgt, %[[VAL_14]], %[[VAL_12]] : index
+ ! CHECK: %[[VAL_16:.*]] = arith.select %[[VAL_15]], %[[VAL_14]], %[[VAL_12]] : index
+ ! CHECK: %[[VAL_17:.*]] = fir.alloca !fir.array<?x!fir.char<1,?>>(%[[VAL_6]] : i64), %[[VAL_16]] {bindc_name = "c", uniq_name = "_QFdyn_array_dyn_len_lbEc"}
+ ! CHECK: %[[VAL_18:.*]] = fir.shape_shift %[[VAL_8]], %[[VAL_16]] : (index, index) -> !fir.shapeshift<1>
+ ! CHECK: %[[VAL_19:.*]]:2 = hlfir.declare %[[VAL_17]](%[[VAL_18]]) typeparams %[[VAL_6]] {uniq_name = "_QFdyn_array_dyn_len_lbEc"} : (!fir.ref<!fir.array<?x!fir.char<1,?>>>, !fir.shapeshift<1>, i64) -> (!fir.box<!fir.array<?x!fir.char<1,?>>>, !fir.ref<!fir.array<?x!fir.char<1,?>>>)
print *, c(11)
end subroutine
@@ -128,16 +188,17 @@ subroutine dyn_array_dyn_len_lb(l, n)
subroutine assumed_length_param(n)
character(*), parameter :: c(1)=(/"abcd"/)
integer :: n
- ! CHECK: %[[c4:.*]] = arith.constant 4 : i64
- ! CHECK: fir.store %[[c4]] to %[[tmp:.*]] : !fir.ref<i64>
- ! CHECK-CONST: %[[tmp:.*]] = fir.address_of(@_global_const_.{{.*}}) : !fir.ref<i64>
- ! CHECK-CONST: fir.call @_QPtake_int(%[[tmp]]) {{.*}}: (!fir.ref<i64>) -> ()
+ ! CHECK: %[[VAL_0:.*]] = arith.constant 4 : i64
+ ! CHECK: %[[VAL_1:.*]]:3 = hlfir.associate %[[VAL_0]] {adapt.valuebyref} : (i64) -> (!fir.ref<i64>, !fir.ref<i64>, i1)
+ ! CHECK: fir.call @_QPtake_int(%[[VAL_1]]#0) {{.*}} : (!fir.ref<i64>) -> ()
call take_int(len(c(n), kind=8))
end
! CHECK-LABEL: func @_QPscalar_cst_neg_len
subroutine scalar_cst_neg_len()
character(-1) :: c
- ! CHECK: fir.alloca !fir.char<1,0> {{{.*}}uniq_name = "_QFscalar_cst_neg_lenEc"}
+ ! CHECK: %[[VAL_0:.*]] = arith.constant 0 : index
+ ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.char<1,0> {bindc_name = "c", uniq_name = "_QFscalar_cst_neg_lenEc"}
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]] typeparams %[[VAL_0]] {uniq_name = "_QFscalar_cst_neg_lenEc"} : (!fir.ref<!fir.char<1,0>>, index) -> (!fir.ref<!fir.char<1,0>>, !fir.ref<!fir.char<1,0>>)
print *, c
end subroutine
diff --git a/flang/test/Lower/complex-operations.f90 b/flang/test/Lower/complex-operations.f90
index 38954626e77ee..fbc905d697547 100644
--- a/flang/test/Lower/complex-operations.f90
+++ b/flang/test/Lower/complex-operations.f90
@@ -1,112 +1,154 @@
! REQUIRES: flang-supports-f128-math
! REQUIRES: x86-registered-target
-! RUN: bbc -target x86_64-unknown-linux-gnu -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir -triple x86_64-unknown-linux-gnu %s -o - | FileCheck %s
! CHECK-LABEL: @_QPadd_test
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f32>> {{.*}})
subroutine add_test(a,b,c)
complex :: a, b, c
- ! CHECK-NOT: fir.extract_value
- ! CHECK-NOT: fir.insert_value
- ! CHECK: fir.addc {{.*}}: complex
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFadd_testEa"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFadd_testEb"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFadd_testEc"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_6:.*]] = fir.addc %[[VAL_4]], %[[VAL_5]] {fastmath = #arith.fastmath<contract>} : complex<f32>
+ ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : complex<f32>, !fir.ref<complex<f32>>
a = b + c
end subroutine add_test
! CHECK-LABEL: @_QPsub_test
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f32>> {{.*}})
subroutine sub_test(a,b,c)
complex :: a, b, c
- ! CHECK-NOT: fir.extract_value
- ! CHECK-NOT: fir.insert_value
- ! CHECK: fir.subc {{.*}}: complex
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFsub_testEa"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFsub_testEb"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFsub_testEc"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_6:.*]] = fir.subc %[[VAL_4]], %[[VAL_5]] {fastmath = #arith.fastmath<contract>} : complex<f32>
+ ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : complex<f32>, !fir.ref<complex<f32>>
a = b - c
end subroutine sub_test
! CHECK-LABEL: @_QPmul_test
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f32>> {{.*}})
subroutine mul_test(a,b,c)
complex :: a, b, c
- ! CHECK-NOT: fir.extract_value
- ! CHECK-NOT: fir.insert_value
- ! CHECK: fir.mulc {{.*}}: complex
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFmul_testEa"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFmul_testEb"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFmul_testEc"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_6:.*]] = fir.mulc %[[VAL_4]], %[[VAL_5]] {fastmath = #arith.fastmath<contract>} : complex<f32>
+ ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : complex<f32>, !fir.ref<complex<f32>>
a = b * c
end subroutine mul_test
! CHECK-LABEL: @_QPdiv_test_half
-! CHECK-SAME: %[[AREF:.*]]: !fir.ref<complex<f16>> {{.*}}, %[[BREF:.*]]: !fir.ref<complex<f16>> {{.*}}, %[[CREF:.*]]: !fir.ref<complex<f16>> {{.*}})
-! CHECK: %[[BVAL:.*]] = fir.load %[[BREF]] : !fir.ref<complex<f16>>
-! CHECK: %[[CVAL:.*]] = fir.load %[[CREF]] : !fir.ref<complex<f16>>
-! CHECK: %[[AVAL:.*]] = complex.div %[[BVAL]], %[[CVAL]] fastmath<contract> : complex<f16>
-! CHECK: fir.store %[[AVAL]] to %[[AREF]] : !fir.ref<complex<f16>>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f16>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f16>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f16>> {{.*}})
subroutine div_test_half(a,b,c)
complex(kind=2) :: a, b, c
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdiv_test_halfEa"} : (!fir.ref<complex<f16>>, !fir.dscope) -> (!fir.ref<complex<f16>>, !fir.ref<complex<f16>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdiv_test_halfEb"} : (!fir.ref<complex<f16>>, !fir.dscope) -> (!fir.ref<complex<f16>>, !fir.ref<complex<f16>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFdiv_test_halfEc"} : (!fir.ref<complex<f16>>, !fir.dscope) -> (!fir.ref<complex<f16>>, !fir.ref<complex<f16>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f16>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f16>>
+ ! CHECK: %[[VAL_6:.*]] = complex.div %[[VAL_4]], %[[VAL_5]] fastmath<contract> : complex<f16>
+ ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : complex<f16>, !fir.ref<complex<f16>>
a = b / c
end subroutine div_test_half
! CHECK-LABEL: @_QPdiv_test_bfloat
-! CHECK-SAME: %[[AREF:.*]]: !fir.ref<complex<bf16>> {{.*}}, %[[BREF:.*]]: !fir.ref<complex<bf16>> {{.*}}, %[[CREF:.*]]: !fir.ref<complex<bf16>> {{.*}})
-! CHECK: %[[BVAL:.*]] = fir.load %[[BREF]] : !fir.ref<complex<bf16>>
-! CHECK: %[[CVAL:.*]] = fir.load %[[CREF]] : !fir.ref<complex<bf16>>
-! CHECK: %[[AVAL:.*]] = complex.div %[[BVAL]], %[[CVAL]] fastmath<contract> : complex<bf16>
-! CHECK: fir.store %[[AVAL]] to %[[AREF]] : !fir.ref<complex<bf16>>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<bf16>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<bf16>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<bf16>> {{.*}})
subroutine div_test_bfloat(a,b,c)
complex(kind=3) :: a, b, c
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdiv_test_bfloatEa"} : (!fir.ref<complex<bf16>>, !fir.dscope) -> (!fir.ref<complex<bf16>>, !fir.ref<complex<bf16>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdiv_test_bfloatEb"} : (!fir.ref<complex<bf16>>, !fir.dscope) -> (!fir.ref<complex<bf16>>, !fir.ref<complex<bf16>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFdiv_test_bfloatEc"} : (!fir.ref<complex<bf16>>, !fir.dscope) -> (!fir.ref<complex<bf16>>, !fir.ref<complex<bf16>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<bf16>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<bf16>>
+ ! CHECK: %[[VAL_6:.*]] = complex.div %[[VAL_4]], %[[VAL_5]] fastmath<contract> : complex<bf16>
+ ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : complex<bf16>, !fir.ref<complex<bf16>>
a = b / c
end subroutine div_test_bfloat
! CHECK-LABEL: @_QPdiv_test_single
-! CHECK-SAME: %[[AREF:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[BREF:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[CREF:.*]]: !fir.ref<complex<f32>> {{.*}})
-! CHECK: %[[BVAL:.*]] = fir.load %[[BREF]] : !fir.ref<complex<f32>>
-! CHECK: %[[CVAL:.*]] = fir.load %[[CREF]] : !fir.ref<complex<f32>>
-! CHECK: %[[BREAL:.*]] = fir.extract_value %[[BVAL]], [0 : index] : (complex<f32>) -> f32
-! CHECK: %[[BIMAG:.*]] = fir.extract_value %[[BVAL]], [1 : index] : (complex<f32>) -> f32
-! CHECK: %[[CREAL:.*]] = fir.extract_value %[[CVAL]], [0 : index] : (complex<f32>) -> f32
-! CHECK: %[[CIMAG:.*]] = fir.extract_value %[[CVAL]], [1 : index] : (complex<f32>) -> f32
-! CHECK: %[[AVAL:.*]] = fir.call @__divsc3(%[[BREAL]], %[[BIMAG]], %[[CREAL]], %[[CIMAG]]) fastmath<contract> : (f32, f32, f32, f32) -> complex<f32>
-! CHECK: fir.store %[[AVAL]] to %[[AREF]] : !fir.ref<complex<f32>>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f32>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f32>> {{.*}})
subroutine div_test_single(a,b,c)
complex(kind=4) :: a, b, c
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdiv_test_singleEa"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdiv_test_singleEb"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFdiv_test_singleEc"} : (!fir.ref<complex<f32>>, !fir.dscope) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f32>>
+ ! CHECK: %[[VAL_6:.*]] = fir.extract_value %[[VAL_4]], [0 : index] : (complex<f32>) -> f32
+ ! CHECK: %[[VAL_7:.*]] = fir.extract_value %[[VAL_4]], [1 : index] : (complex<f32>) -> f32
+ ! CHECK: %[[VAL_8:.*]] = fir.extract_value %[[VAL_5]], [0 : index] : (complex<f32>) -> f32
+ ! CHECK: %[[VAL_9:.*]] = fir.extract_value %[[VAL_5]], [1 : index] : (complex<f32>) -> f32
+ ! CHECK: %[[VAL_10:.*]] = fir.call @__divsc3(%[[VAL_6]], %[[VAL_7]], %[[VAL_8]], %[[VAL_9]]) fastmath<contract> : (f32, f32, f32, f32) -> complex<f32>
+ ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : complex<f32>, !fir.ref<complex<f32>>
a = b / c
end subroutine div_test_single
! CHECK-LABEL: @_QPdiv_test_double
-! CHECK-SAME: %[[AREF:.*]]: !fir.ref<complex<f64>> {{.*}}, %[[BREF:.*]]: !fir.ref<complex<f64>> {{.*}}, %[[CREF:.*]]: !fir.ref<complex<f64>> {{.*}})
-! CHECK: %[[BVAL:.*]] = fir.load %[[BREF]] : !fir.ref<complex<f64>>
-! CHECK: %[[CVAL:.*]] = fir.load %[[CREF]] : !fir.ref<complex<f64>>
-! CHECK: %[[BREAL:.*]] = fir.extract_value %[[BVAL]], [0 : index] : (complex<f64>) -> f64
-! CHECK: %[[BIMAG:.*]] = fir.extract_value %[[BVAL]], [1 : index] : (complex<f64>) -> f64
-! CHECK: %[[CREAL:.*]] = fir.extract_value %[[CVAL]], [0 : index] : (complex<f64>) -> f64
-! CHECK: %[[CIMAG:.*]] = fir.extract_value %[[CVAL]], [1 : index] : (complex<f64>) -> f64
-! CHECK: %[[AVAL:.*]] = fir.call @__divdc3(%[[BREAL]], %[[BIMAG]], %[[CREAL]], %[[CIMAG]]) fastmath<contract> : (f64, f64, f64, f64) -> complex<f64>
-! CHECK: fir.store %[[AVAL]] to %[[AREF]] : !fir.ref<complex<f64>>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f64>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f64>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f64>> {{.*}})
subroutine div_test_double(a,b,c)
complex(kind=8) :: a, b, c
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdiv_test_doubleEa"} : (!fir.ref<complex<f64>>, !fir.dscope) -> (!fir.ref<complex<f64>>, !fir.ref<complex<f64>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdiv_test_doubleEb"} : (!fir.ref<complex<f64>>, !fir.dscope) -> (!fir.ref<complex<f64>>, !fir.ref<complex<f64>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFdiv_test_doubleEc"} : (!fir.ref<complex<f64>>, !fir.dscope) -> (!fir.ref<complex<f64>>, !fir.ref<complex<f64>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f64>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f64>>
+ ! CHECK: %[[VAL_6:.*]] = fir.extract_value %[[VAL_4]], [0 : index] : (complex<f64>) -> f64
+ ! CHECK: %[[VAL_7:.*]] = fir.extract_value %[[VAL_4]], [1 : index] : (complex<f64>) -> f64
+ ! CHECK: %[[VAL_8:.*]] = fir.extract_value %[[VAL_5]], [0 : index] : (complex<f64>) -> f64
+ ! CHECK: %[[VAL_9:.*]] = fir.extract_value %[[VAL_5]], [1 : index] : (complex<f64>) -> f64
+ ! CHECK: %[[VAL_10:.*]] = fir.call @__divdc3(%[[VAL_6]], %[[VAL_7]], %[[VAL_8]], %[[VAL_9]]) fastmath<contract> : (f64, f64, f64, f64) -> complex<f64>
+ ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : complex<f64>, !fir.ref<complex<f64>>
a = b / c
end subroutine div_test_double
! CHECK-LABEL: @_QPdiv_test_extended
-! CHECK-SAME: %[[AREF:.*]]: !fir.ref<complex<f80>> {{.*}}, %[[BREF:.*]]: !fir.ref<complex<f80>> {{.*}}, %[[CREF:.*]]: !fir.ref<complex<f80>> {{.*}})
-! CHECK: %[[BVAL:.*]] = fir.load %[[BREF]] : !fir.ref<complex<f80>>
-! CHECK: %[[CVAL:.*]] = fir.load %[[CREF]] : !fir.ref<complex<f80>>
-! CHECK: %[[BREAL:.*]] = fir.extract_value %[[BVAL]], [0 : index] : (complex<f80>) -> f80
-! CHECK: %[[BIMAG:.*]] = fir.extract_value %[[BVAL]], [1 : index] : (complex<f80>) -> f80
-! CHECK: %[[CREAL:.*]] = fir.extract_value %[[CVAL]], [0 : index] : (complex<f80>) -> f80
-! CHECK: %[[CIMAG:.*]] = fir.extract_value %[[CVAL]], [1 : index] : (complex<f80>) -> f80
-! CHECK: %[[AVAL:.*]] = fir.call @__divxc3(%[[BREAL]], %[[BIMAG]], %[[CREAL]], %[[CIMAG]]) fastmath<contract> : (f80, f80, f80, f80) -> complex<f80>
-! CHECK: fir.store %[[AVAL]] to %[[AREF]] : !fir.ref<complex<f80>>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f80>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f80>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f80>> {{.*}})
subroutine div_test_extended(a,b,c)
complex(kind=10) :: a, b, c
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdiv_test_extendedEa"} : (!fir.ref<complex<f80>>, !fir.dscope) -> (!fir.ref<complex<f80>>, !fir.ref<complex<f80>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdiv_test_extendedEb"} : (!fir.ref<complex<f80>>, !fir.dscope) -> (!fir.ref<complex<f80>>, !fir.ref<complex<f80>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFdiv_test_extendedEc"} : (!fir.ref<complex<f80>>, !fir.dscope) -> (!fir.ref<complex<f80>>, !fir.ref<complex<f80>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f80>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f80>>
+ ! CHECK: %[[VAL_6:.*]] = fir.extract_value %[[VAL_4]], [0 : index] : (complex<f80>) -> f80
+ ! CHECK: %[[VAL_7:.*]] = fir.extract_value %[[VAL_4]], [1 : index] : (complex<f80>) -> f80
+ ! CHECK: %[[VAL_8:.*]] = fir.extract_value %[[VAL_5]], [0 : index] : (complex<f80>) -> f80
+ ! CHECK: %[[VAL_9:.*]] = fir.extract_value %[[VAL_5]], [1 : index] : (complex<f80>) -> f80
+ ! CHECK: %[[VAL_10:.*]] = fir.call @__divxc3(%[[VAL_6]], %[[VAL_7]], %[[VAL_8]], %[[VAL_9]]) fastmath<contract> : (f80, f80, f80, f80) -> complex<f80>
+ ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : complex<f80>, !fir.ref<complex<f80>>
a = b / c
end subroutine div_test_extended
! CHECK-LABEL: @_QPdiv_test_quad
-! CHECK-SAME: %[[AREF:.*]]: !fir.ref<complex<f128>> {{.*}}, %[[BREF:.*]]: !fir.ref<complex<f128>> {{.*}}, %[[CREF:.*]]: !fir.ref<complex<f128>> {{.*}})
-! CHECK: %[[BVAL:.*]] = fir.load %[[BREF]] : !fir.ref<complex<f128>>
-! CHECK: %[[CVAL:.*]] = fir.load %[[CREF]] : !fir.ref<complex<f128>>
-! CHECK: %[[BREAL:.*]] = fir.extract_value %[[BVAL]], [0 : index] : (complex<f128>) -> f128
-! CHECK: %[[BIMAG:.*]] = fir.extract_value %[[BVAL]], [1 : index] : (complex<f128>) -> f128
-! CHECK: %[[CREAL:.*]] = fir.extract_value %[[CVAL]], [0 : index] : (complex<f128>) -> f128
-! CHECK: %[[CIMAG:.*]] = fir.extract_value %[[CVAL]], [1 : index] : (complex<f128>) -> f128
-! CHECK: %[[AVAL:.*]] = fir.call @__divtc3(%[[BREAL]], %[[BIMAG]], %[[CREAL]], %[[CIMAG]]) fastmath<contract> : (f128, f128, f128, f128) -> complex<f128>
-! CHECK: fir.store %[[AVAL]] to %[[AREF]] : !fir.ref<complex<f128>>
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<complex<f128>> {{.*}}, %[[ARG1:.*]]: !fir.ref<complex<f128>> {{.*}}, %[[ARG2:.*]]: !fir.ref<complex<f128>> {{.*}})
subroutine div_test_quad(a,b,c)
complex(kind=16) :: a, b, c
+ ! CHECK: %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg 1 {uniq_name = "_QFdiv_test_quadEa"} : (!fir.ref<complex<f128>>, !fir.dscope) -> (!fir.ref<complex<f128>>, !fir.ref<complex<f128>>)
+ ! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg 2 {uniq_name = "_QFdiv_test_quadEb"} : (!fir.ref<complex<f128>>, !fir.dscope) -> (!fir.ref<complex<f128>>, !fir.ref<complex<f128>>)
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg 3 {uniq_name = "_QFdiv_test_quadEc"} : (!fir.ref<complex<f128>>, !fir.dscope) -> (!fir.ref<complex<f128>>, !fir.ref<complex<f128>>)
+ ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]]#0 : !fir.ref<complex<f128>>
+ ! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<complex<f128>>
+ ! CHECK: %[[VAL_6:.*]] = fir.extract_value %[[VAL_4]], [0 : index] : (complex<f128>) -> f128
+ ! CHECK: %[[VAL_7:.*]] = fir.extract_value %[[VAL_4]], [1 : index] : (complex<f128>) -> f128
+ ! CHECK: %[[VAL_8:.*]] = fir.extract_value %[[VAL_5]], [0 : index] : (complex<f128>) -> f128
+ ! CHECK: %[[VAL_9:.*]] = fir.extract_value %[[VAL_5]], [1 : index] : (complex<f128>) -> f128
+ ! CHECK: %[[VAL_10:.*]] = fir.call @__divtc3(%[[VAL_6]], %[[VAL_7]], %[[VAL_8]], %[[VAL_9]]) fastmath<contract> : (f128, f128, f128, f128) -> complex<f128>
+ ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : complex<f128>, !fir.ref<complex<f128>>
a = b / c
end subroutine div_test_quad
More information about the flang-commits
mailing list