xref: /llvm-project/flang/test/Lower/Intrinsics/norm2.f90 (revision 12ba74e181bd6641b532e271f3bfabf53066b1c0)
1! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
2! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir %s -o - | FileCheck %s
3
4! CHECK-LABEL: func @_QPnorm2_test_4(
5! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?xf32>>{{.*}}) -> f32
6real(4) function norm2_test_4(a)
7  real(4) :: a(:)
8  ! CHECK-DAG:  %[[c0:.*]] = arith.constant 0 : index
9  ! CHECK-DAG:  %[[arr:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?xf32>>) -> !fir.box<none>
10  ! CHECK:  %[[dim:.*]] = fir.convert %[[c0]] : (index) -> i32
11  norm2_test_4 = norm2(a)
12  ! CHECK:  %{{.*}} = fir.call @_FortranANorm2_4(%[[arr]], %{{.*}}, %{{.*}}, %[[dim]]) {{.*}} : (!fir.box<none>, !fir.ref<i8>, i32, i32) -> f32
13end function norm2_test_4
14
15! CHECK-LABEL: func @_QPnorm2_test_8(
16! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?xf64>>{{.*}}) -> f64
17real(8) function norm2_test_8(a)
18  real(8) :: a(:,:)
19  ! CHECK-DAG:  %[[c0:.*]] = arith.constant 0 : index
20  ! CHECK-DAG:  %[[arr:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?xf64>>) -> !fir.box<none>
21  ! CHECK:  %[[dim:.*]] = fir.convert %[[c0]] : (index) -> i32
22  norm2_test_8 = norm2(a)
23  ! CHECK:  %{{.*}} = fir.call @_FortranANorm2_8(%[[arr]], %{{.*}}, %{{.*}}, %[[dim]]) {{.*}} : (!fir.box<none>, !fir.ref<i8>, i32, i32) -> f64
24end function norm2_test_8
25
26! CHECK-LABEL: func @_QPnorm2_test_10(
27! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x?xf80>>{{.*}}) -> f80
28real(10) function norm2_test_10(a)
29  real(10) :: a(:,:,:)
30  ! CHECK-DAG:  %[[c0:.*]] = arith.constant 0 : index
31  ! CHECK-DAG:  %[[arr:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?x?xf80>>) -> !fir.box<none>
32  ! CHECK:  %[[dim:.*]] = fir.convert %[[c0]] : (index) -> i32
33  norm2_test_10 = norm2(a)
34  ! CHECK:  %{{.*}} = fir.call @_FortranANorm2_10(%[[arr]], %{{.*}}, %{{.*}}, %[[dim]]) {{.*}} : (!fir.box<none>, !fir.ref<i8>, i32, i32) -> f80
35end function norm2_test_10
36
37! CHECK-LABEL: func @_QPnorm2_test_16(
38! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x?xf128>>{{.*}}) -> f128
39real(16) function norm2_test_16(a)
40  real(16) :: a(:,:,:)
41  ! CHECK-DAG:  %[[c0:.*]] = arith.constant 0 : index
42  ! CHECK-DAG:  %[[arr:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?x?xf128>>) -> !fir.box<none>
43  ! CHECK:  %[[dim:.*]] = fir.convert %[[c0]] : (index) -> i32
44  norm2_test_16 = norm2(a)
45  ! CHECK:  %{{.*}} = fir.call @_FortranANorm2_16(%[[arr]], %{{.*}}, %{{.*}}, %[[dim]]) {{.*}} : (!fir.box<none>, !fir.ref<i8>, i32, i32) -> f128
46end function norm2_test_16
47
48! CHECK-LABEL: func @_QPnorm2_test_dim_2(
49! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?xf32>>{{.*}}, %[[arg1:.*]]: !fir.box<!fir.array<?xf32>>{{.*}})
50subroutine norm2_test_dim_2(a,r)
51  real :: a(:,:)
52  real :: r(:)
53  ! CHECK-DAG:  %[[dim:.*]] = arith.constant 1 : i32
54  ! CHECK-DAG:  %[[r:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xf32>>>
55  ! CHECK-DAG:  %[[res:.*]] = fir.convert %[[r]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>>
56  ! CHECK:  %[[arr:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
57  r = norm2(a,dim=1)
58  ! CHECK:  fir.call @_FortranANorm2Dim(%[[res]], %[[arr]], %[[dim]], %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, !fir.ref<i8>, i32) -> ()
59  ! CHECK:  %[[box:.*]] = fir.load %[[r]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
60  ! CHECK-DAG:  %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
61  ! CHECK-DAG:  fir.freemem %[[addr]]
62end subroutine norm2_test_dim_2
63
64! CHECK-LABEL: func @_QPnorm2_test_dim_3(
65! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x?xf32>>{{.*}}, %[[arg1:.*]]: !fir.box<!fir.array<?x?xf32>>{{.*}})
66subroutine norm2_test_dim_3(a,r)
67  real :: a(:,:,:)
68  real :: r(:,:)
69  ! CHECK-DAG:  %[[dim:.*]] = arith.constant 3 : i32
70  ! CHECK-DAG:  %[[r:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x?xf32>>>
71  ! CHECK-DAG:  %[[res:.*]] = fir.convert %[[r]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>) -> !fir.ref<!fir.box<none>>
72  ! CHECK:  %[[arr:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?x?xf32>>) -> !fir.box<none>
73  r = norm2(a,dim=3)
74  ! CHECK:  fir.call @_FortranANorm2Dim(%[[res]], %[[arr]], %[[dim]], %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, !fir.ref<i8>, i32) -> ()
75  ! CHECK:  %[[box:.*]] = fir.load %[[r]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>
76  ! CHECK-DAG:  %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>) -> !fir.heap<!fir.array<?x?xf32>>
77  ! CHECK-DAG:  fir.freemem %[[addr]]
78end subroutine norm2_test_dim_3
79
80! CHECK-LABEL: func @_QPnorm2_test_real16(
81! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x?xf128>>{{.*}}, %[[arg1:.*]]: !fir.box<!fir.array<?x?xf128>>{{.*}})
82subroutine norm2_test_real16(a,r)
83  real(16) :: a(:,:,:)
84  real(16) :: r(:,:)
85  ! CHECK-DAG:  %[[dim:.*]] = arith.constant 3 : i32
86  ! CHECK-DAG:  %[[r:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x?xf128>>>
87  ! CHECK-DAG:  %[[res:.*]] = fir.convert %[[r]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf128>>>>) -> !fir.ref<!fir.box<none>>
88  ! CHECK:  %[[arr:.*]] = fir.convert %[[arg0]] : (!fir.box<!fir.array<?x?x?xf128>>) -> !fir.box<none>
89  r = norm2(a,dim=3)
90  ! CHECK:  fir.call @_FortranANorm2DimReal16(%[[res]], %[[arr]], %[[dim]], %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, !fir.ref<i8>, i32) -> ()
91  ! CHECK:  %[[box:.*]] = fir.load %[[r]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf128>>>>
92  ! CHECK-DAG:  %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?x?xf128>>>) -> !fir.heap<!fir.array<?x?xf128>>
93  ! CHECK-DAG:  fir.freemem %[[addr]]
94end subroutine norm2_test_real16
95