Break circular dependency between FIR dialect and utilities
[llvm-project.git] / flang / test / Fir / target-rewrite-integer.fir
blobad64ca80b47335b6bfe5098ad6796837ebcdae03
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
9 // -----
11 // subroutine test_i1(x)
12 //   logical x
13 //   print *, x
14 // end subroutine test_i1
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})
23 func.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(@_QQcl.2E2F746573742E66393000) : !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
35 func.func private @_FortranAioBeginExternalListOutput(i32, !fir.ref<i8>, i32) -> !fir.ref<i8> attributes {fir.io, fir.runtime}
36 fir.global linkonce @_QQcl.2E2F746573742E66393000 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>
40 func.func private @_FortranAioOutputLogical(!fir.ref<i8>, i1) -> i1 attributes {fir.io, fir.runtime}
41 func.func private @_FortranAioEndIoStatement(!fir.ref<i8>) -> i32 attributes {fir.io, fir.runtime}
43 // -----
45 // Manually created test with 'si1' argument/return type.
46 // Flang does not use 'si1' type currently.
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})
55 func.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
61 func.func private @_SomeFunc_si1(si1) -> si1 attributes {fir.runtime}
63 // -----
65 // Manually created test with 'ui1' argument/return type.
66 // Flang does not use 'ui1' type currently.
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})
75 func.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
81 func.func private @_SomeFunc_ui1(ui1) -> ui1 attributes {fir.runtime}
83 // -----
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
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"}
104 func.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
113 func.func private @cfun8(i8) -> i8 attributes {fir.bindc_name = "cfun8"}
114 func.func private @cfun16(i16) -> i16 attributes {fir.bindc_name = "cfun16"}