1// RUN: fir-opt --split-input-file --target-rewrite="target=i386-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=I32,ALL 2// RUN: fir-opt --split-input-file --target-rewrite="target=x86_64-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=X64,ALL 3// RUN: fir-opt --split-input-file --target-rewrite="target=aarch64-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=AARCH64,ALL 4// RUN: fir-opt --split-input-file --target-rewrite="target=powerpc64le-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=PPC,ALL 5// RUN: fir-opt --split-input-file --target-rewrite="target=sparc64-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=SPARCV9,ALL 6// RUN: fir-opt --split-input-file --target-rewrite="target=sparcv9-sun-solaris2.11" %s | FileCheck %s --check-prefixes=SPARCV9,ALL 7// RUN: fir-opt --split-input-file --target-rewrite="target=loongarch64-unknown-linux-gnu" %s | FileCheck %s --check-prefixes=LOONGARCH64,ALL 8 9// ----- 10 11// subroutine test_i1(x) 12// logical x 13// print *, x 14// end subroutine test_i1 15 16// ALL-LABEL: @_QPtest_i1 17// I32: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext}) 18// X64: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext}) 19// AARCH64: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext}) 20// PPC: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext}) 21// SPARCV9: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext}) 22// LOONGARCH64: func.func{{.*}}@_FortranAioOutputLogical({{.*}}i1 {llvm.zeroext}) -> (i1 {llvm.zeroext}) 23func.func @_QPtest_i1(%arg0: !fir.ref<!fir.logical<4>> {fir.bindc_name = "x"}) { 24 %c3_i32 = arith.constant 3 : i32 25 %c-1_i32 = arith.constant -1 : i32 26 %0 = fir.address_of(@_QQclX2E2F746573742E66393000) : !fir.ref<!fir.char<1,11>> 27 %1 = fir.convert %0 : (!fir.ref<!fir.char<1,11>>) -> !fir.ref<i8> 28 %2 = fir.call @_FortranAioBeginExternalListOutput(%c-1_i32, %1, %c3_i32) : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8> 29 %3 = fir.load %arg0 : !fir.ref<!fir.logical<4>> 30 %4 = fir.convert %3 : (!fir.logical<4>) -> i1 31 %5 = fir.call @_FortranAioOutputLogical(%2, %4) : (!fir.ref<i8>, i1) -> i1 32 %6 = fir.call @_FortranAioEndIoStatement(%2) : (!fir.ref<i8>) -> i32 33 return 34} 35func.func private @_FortranAioBeginExternalListOutput(i32, !fir.ref<i8>, i32) -> !fir.ref<i8> attributes {fir.io, fir.runtime} 36fir.global linkonce @_QQclX2E2F746573742E66393000 constant : !fir.char<1,11> { 37 %0 = fir.string_lit "./test.f90\00"(11) : !fir.char<1,11> 38 fir.has_value %0 : !fir.char<1,11> 39} 40func.func private @_FortranAioOutputLogical(!fir.ref<i8>, i1) -> i1 attributes {fir.io, fir.runtime} 41func.func private @_FortranAioEndIoStatement(!fir.ref<i8>) -> i32 attributes {fir.io, fir.runtime} 42 43// ----- 44 45// Manually created test with 'si1' argument/return type. 46// Flang does not use 'si1' type currently. 47 48// ALL-LABEL: @_QPtest_si1 49// I32: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext}) 50// X64: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext}) 51// AARCH64: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext}) 52// PPC: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext}) 53// SPARCV9: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext}) 54// LOONGARCH64: func.func{{.*}}@_SomeFunc_si1(si1 {llvm.signext}) -> (si1 {llvm.signext}) 55func.func @_QPtest_si1(%arg0: !fir.ref<!fir.logical<4>> {fir.bindc_name = "x"}) { 56 %0 = fir.load %arg0 : !fir.ref<!fir.logical<4>> 57 %1 = fir.convert %0 : (!fir.logical<4>) -> si1 58 %2 = fir.call @_SomeFunc_si1(%1) : (si1) -> si1 59 return 60} 61func.func private @_SomeFunc_si1(si1) -> si1 attributes {fir.runtime} 62 63// ----- 64 65// Manually created test with 'ui1' argument/return type. 66// Flang does not use 'ui1' type currently. 67 68// ALL-LABEL: @_QPtest_ui1 69// I32: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext}) 70// X64: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext}) 71// AARCH64: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext}) 72// PPC: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext}) 73// SPARCV9: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext}) 74// LOONGARCH64: func.func{{.*}}@_SomeFunc_ui1(ui1 {llvm.zeroext}) -> (ui1 {llvm.zeroext}) 75func.func @_QPtest_ui1(%arg0: !fir.ref<!fir.logical<4>> {fir.bindc_name = "x"}) { 76 %0 = fir.load %arg0 : !fir.ref<!fir.logical<4>> 77 %1 = fir.convert %0 : (!fir.logical<4>) -> ui1 78 %2 = fir.call @_SomeFunc_ui1(%1) : (ui1) -> ui1 79 return 80} 81func.func private @_SomeFunc_ui1(ui1) -> ui1 attributes {fir.runtime} 82 83// ----- 84 85// subroutine test(x, y) 86// use iso_c_binding 87// interface 88// integer(c_int8_t) function cfun8(x) bind(C) 89// integer(c_int8_t),value :: x 90// end function cfun8 91// integer(c_int16_t) function cfun16(x) bind(C) 92// integer(c_int16_t),value :: x 93// end function cfun16 94// end interface 95// integer(c_int8_t) :: x 96// integer(c_int16_t) :: y 97// x = cfun8(x) 98// y = cfun16(y) 99// end subroutine test 100 101// ALL-LABEL: @_QPtest_bindc 102// ALL: func.func private @cfun8(i8 {llvm.signext}) -> (i8 {llvm.signext}) attributes {fir.bindc_name = "cfun8"} 103// ALL: func.func private @cfun16(i16 {llvm.signext}) -> (i16 {llvm.signext}) attributes {fir.bindc_name = "cfun16"} 104func.func @_QPtest_bindc(%arg0: !fir.ref<i8> {fir.bindc_name = "x"}, %arg1: !fir.ref<i16> {fir.bindc_name = "y"}) { 105 %0 = fir.load %arg0 : !fir.ref<i8> 106 %1 = fir.call @cfun8(%0) fastmath<contract> : (i8) -> i8 107 fir.store %1 to %arg0 : !fir.ref<i8> 108 %2 = fir.load %arg1 : !fir.ref<i16> 109 %3 = fir.call @cfun16(%2) fastmath<contract> : (i16) -> i16 110 fir.store %3 to %arg1 : !fir.ref<i16> 111 return 112} 113func.func private @cfun8(i8) -> i8 attributes {fir.bindc_name = "cfun8"} 114func.func private @cfun16(i16) -> i16 attributes {fir.bindc_name = "cfun16"} 115