Files
TheRock/compiler/amd-llvm/flang/test/Lower/Intrinsics/merge.f90
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

105 lines
7.3 KiB
Fortran

! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! CHECK-LABEL: func @_QPmerge_test(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.char<1>>{{.*}}, %[[ARG1:.*]]: index{{.*}}, %[[ARG2:[^:]+]]: !fir.boxchar<1>{{.*}}, %[[ARG3:[^:]+]]: !fir.boxchar<1>{{.*}}, %[[ARG4:.*]]: !fir.ref<!fir.logical<4>>{{.*}}) -> !fir.boxchar<1> {
function merge_test(o1, o2, mask)
character :: o1, o2, merge_test
logical :: mask
merge_test = merge(o1, o2, mask)
! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG4]] dummy_scope %{{.*}} arg 3 {uniq_name = "_QFmerge_testEmask"}
! CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[ARG0]] typeparams %{{.*}} {uniq_name = "_QFmerge_testEmerge_test"}
! CHECK: %[[O1_UNBOX:.*]]:2 = fir.unboxchar %[[ARG2]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
! CHECK: %[[O1_CAST:.*]] = fir.convert %[[O1_UNBOX]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1>>
! CHECK: %[[O1:.*]]:2 = hlfir.declare %[[O1_CAST]] typeparams %{{.*}} dummy_scope %{{.*}} arg 1 {uniq_name = "_QFmerge_testEo1"}
! CHECK: %[[O2_UNBOX:.*]]:2 = fir.unboxchar %[[ARG3]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
! CHECK: %[[O2_CAST:.*]] = fir.convert %[[O2_UNBOX]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1>>
! CHECK: %[[O2:.*]]:2 = hlfir.declare %[[O2_CAST]] typeparams %{{.*}} dummy_scope %{{.*}} arg 2 {uniq_name = "_QFmerge_testEo2"}
! CHECK: %[[MASK_VAL:.*]] = fir.load %[[MASK]]#0 : !fir.ref<!fir.logical<4>>
! CHECK: %[[MASK_BOOL:.*]] = fir.convert %[[MASK_VAL]] : (!fir.logical<4>) -> i1
! CHECK: %[[SEL:.*]] = arith.select %[[MASK_BOOL]], %[[O1]]#0, %[[O2]]#0 : !fir.ref<!fir.char<1>>
! CHECK: %[[TMP:.*]]:2 = hlfir.declare %[[SEL]] typeparams %{{.*}} {uniq_name = ".tmp.intrinsic_result"}
! CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 : (!fir.ref<!fir.char<1>>) -> !hlfir.expr<!fir.char<1>>
! CHECK: hlfir.assign %[[EXPR]] to %[[RES]]#0 : !hlfir.expr<!fir.char<1>>, !fir.ref<!fir.char<1>>
! CHECK: hlfir.destroy %[[EXPR]] : !hlfir.expr<!fir.char<1>>
end
! CHECK-LABEL: func @_QPmerge_test2(
! CHECK-SAME: %[[ARG0:[^:]+]]: !fir.ref<i32>{{.*}}, %[[ARG1:[^:]+]]: !fir.ref<i32>{{.*}}, %[[ARG2:.*]]: !fir.ref<!fir.logical<4>>{{.*}}) -> i32 {
function merge_test2(o1, o2, mask)
integer :: o1, o2, merge_test2
logical :: mask
merge_test2 = merge(o1, o2, mask)
! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %{{.*}} arg 3 {uniq_name = "_QFmerge_test2Emask"}
! CHECK-DAG: %[[O1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{.*}} arg 1 {uniq_name = "_QFmerge_test2Eo1"}
! CHECK-DAG: %[[O2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %{{.*}} arg 2 {uniq_name = "_QFmerge_test2Eo2"}
! CHECK: %[[O1_VAL:.*]] = fir.load %[[O1]]#0 : !fir.ref<i32>
! CHECK: %[[O2_VAL:.*]] = fir.load %[[O2]]#0 : !fir.ref<i32>
! CHECK: %[[MASK_VAL:.*]] = fir.load %[[MASK]]#0 : !fir.ref<!fir.logical<4>>
! CHECK: %[[MASK_BOOL:.*]] = fir.convert %[[MASK_VAL]] : (!fir.logical<4>) -> i1
! CHECK: %{{.*}} = arith.select %[[MASK_BOOL]], %[[O1_VAL]], %[[O2_VAL]] : i32
end
! CHECK-LABEL: func @_QPmerge_test3(
subroutine merge_test3(result, o1, o2, mask)
type t
integer :: i
end type
type(t) :: result(10), o1, o2
logical :: mask
result = merge(o1, o2, mask)
! CHECK: %[[MASK:.*]]:2 = hlfir.declare %{{.*}} dummy_scope %{{.*}} arg 4 {uniq_name = "_QFmerge_test3Emask"}
! CHECK: %[[O1:.*]]:2 = hlfir.declare %{{.*}} dummy_scope %{{.*}} arg 2 {uniq_name = "_QFmerge_test3Eo1"}
! CHECK: %[[O2:.*]]:2 = hlfir.declare %{{.*}} dummy_scope %{{.*}} arg 3 {uniq_name = "_QFmerge_test3Eo2"}
! CHECK: %[[MASK_VAL:.*]] = fir.load %[[MASK]]#0 : !fir.ref<!fir.logical<4>>
! CHECK: %[[MASK_BOOL:.*]] = fir.convert %[[MASK_VAL]] : (!fir.logical<4>) -> i1
! CHECK: %[[SEL:.*]] = arith.select %[[MASK_BOOL]], %[[O1]]#0, %[[O2]]#0 : !fir.ref<!fir.type<_QFmerge_test3Tt{i:i32}>>
! CHECK: %[[TMP:.*]]:2 = hlfir.declare %[[SEL]] {uniq_name = ".tmp.intrinsic_result"}
! CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 : (!fir.ref<!fir.type<_QFmerge_test3Tt{i:i32}>>) -> !hlfir.expr<!fir.type<_QFmerge_test3Tt{i:i32}>>
! CHECK: hlfir.assign %[[EXPR]] to %{{.*}}#0 : !hlfir.expr<!fir.type<_QFmerge_test3Tt{i:i32}>>, !fir.ref<!fir.array<10x!fir.type<_QFmerge_test3Tt{i:i32}>>>
! CHECK: hlfir.destroy %[[EXPR]] : !hlfir.expr<!fir.type<_QFmerge_test3Tt{i:i32}>>
end
! CHECK-LABEL: func @_QPmerge_logical_var_and_expr(
subroutine merge_logical_var_and_expr(l1, l2)
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "l1"},
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "l2"}) {
logical :: l1, l2
call bar(merge(l1, .true., l2))
! CHECK-DAG: %[[L1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{.*}} arg 1 {uniq_name = "_QFmerge_logical_var_and_exprEl1"}
! CHECK-DAG: %[[L2:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %{{.*}} arg 2 {uniq_name = "_QFmerge_logical_var_and_exprEl2"}
! CHECK: %[[TRUE:.*]] = arith.constant true
! CHECK: %[[L1_VAL:.*]] = fir.load %[[L1]]#0 : !fir.ref<!fir.logical<4>>
! CHECK: %[[L2_VAL:.*]] = fir.load %[[L2]]#0 : !fir.ref<!fir.logical<4>>
! CHECK: %[[L2_BOOL:.*]] = fir.convert %[[L2_VAL]] : (!fir.logical<4>) -> i1
! CHECK: %[[TRUE_LOG:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4>
! CHECK: %[[SEL:.*]] = arith.select %[[L2_BOOL]], %[[L1_VAL]], %[[TRUE_LOG]] : !fir.logical<4>
! CHECK: %[[ASSOC:.*]]:3 = hlfir.associate %[[SEL]] {adapt.valuebyref}
! CHECK: fir.call @_QPbar(%[[ASSOC]]#0) {{.*}}: (!fir.ref<!fir.logical<4>>) -> ()
! CHECK: hlfir.end_associate %[[ASSOC]]#1, %[[ASSOC]]#2
end subroutine
! CHECK-LABEL: func @_QPmerge_cst_and_dyn_char(
subroutine merge_cst_and_dyn_char(dyn, l)
! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1> {fir.bindc_name = "dyn"},
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "l"}) {
character(4) :: cst = "abcde"
character(*) :: dyn
logical :: l
print *, merge(cst, dyn, l)
! CHECK: %[[CST:.*]]:2 = hlfir.declare %{{.*}} typeparams %{{.*}} {uniq_name = "_QFmerge_cst_and_dyn_charEcst"}
! CHECK: %[[DYN_UNBOX:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
! CHECK: %[[DYN:.*]]:2 = hlfir.declare %[[DYN_UNBOX]]#0 typeparams %[[DYN_UNBOX]]#1 dummy_scope %{{.*}} arg 1 {uniq_name = "_QFmerge_cst_and_dyn_charEdyn"}
! CHECK: %[[L:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %{{.*}} arg 2 {uniq_name = "_QFmerge_cst_and_dyn_charEl"}
! CHECK: %[[L_VAL:.*]] = fir.load %[[L]]#0 : !fir.ref<!fir.logical<4>>
! CHECK: %[[L_BOOL:.*]] = fir.convert %[[L_VAL]] : (!fir.logical<4>) -> i1
! CHECK: %[[DYN_CAST:.*]] = fir.convert %[[DYN]]#1 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,4>>
! CHECK: %[[SEL:.*]] = arith.select %[[L_BOOL]], %[[CST]]#0, %[[DYN_CAST]] : !fir.ref<!fir.char<1,4>>
! CHECK: %[[TMP:.*]]:2 = hlfir.declare %[[SEL]] typeparams %{{.*}} {uniq_name = ".tmp.intrinsic_result"}
! CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 : (!fir.ref<!fir.char<1,4>>) -> !hlfir.expr<!fir.char<1,4>>
! CHECK: %[[ASSOC:.*]]:3 = hlfir.associate %[[EXPR]] typeparams %{{.*}} {adapt.valuebyref}
! CHECK: %[[ASSOC_CAST:.*]] = fir.convert %[[ASSOC]]#0 : (!fir.ref<!fir.char<1,4>>) -> !fir.ref<i8>
! CHECK: fir.call @_FortranAioOutputAscii(%{{.*}}, %[[ASSOC_CAST]], %{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
! CHECK: hlfir.end_associate %[[ASSOC]]#1, %[[ASSOC]]#2
! CHECK: hlfir.destroy %[[EXPR]] : !hlfir.expr<!fir.char<1,4>>
end subroutine