Break circular dependency between FIR dialect and utilities
[llvm-project.git] / flang / test / Fir / coordinateof.fir
blobc605f43a154373fbcc538d7a6421d1a73e7144e7
1 // RUN: fir-opt %s | tco | FileCheck %s
3 // tests on coordinate_of op
5 // CHECK-LABEL: @foo1
6 func.func @foo1(%i : i32, %j : i32, %k : i32) -> !fir.ref<f32> {
7   %1 = fir.alloca !fir.array<10 x 20 x 30 x f32>
8   // CHECK: %[[alloca:.*]] = alloca [30 x [20 x [10 x float]]]
9   %2 = fir.convert %1 : (!fir.ref<!fir.array<10 x 20 x 30 x f32>>) -> !fir.ref<!fir.array<10 x 20 x ? x f32>>
10   // CHECK: getelementptr [20 x [10 x float]], ptr %[[alloca]]
11   %3 = fir.coordinate_of %2, %i, %j, %k : (!fir.ref<!fir.array<10 x 20 x ? x f32>>, i32, i32, i32) -> !fir.ref<f32>
12   return %3 : !fir.ref<f32>
15 // CHECK-LABEL: @foo2
16 func.func @foo2(%i : i32, %j : i32, %k : i32) -> !fir.ref<f32> {
17   %1 = fir.alloca !fir.array<10 x 20 x 30 x f32>
18   // CHECK: %[[alloca:.*]] = alloca [30 x [20 x [10 x float]]]
19   %2 = fir.convert %1 : (!fir.ref<!fir.array<10 x 20 x 30 x f32>>) -> !fir.ref<!fir.array<?xf32>>
20   // CHECK: getelementptr float, ptr %[[alloca]]
21   %3 = fir.coordinate_of %2, %i : (!fir.ref<!fir.array<?xf32>>, i32) -> !fir.ref<f32>
22   return %3 : !fir.ref<f32>
25 // CHECK-LABEL: @foo3
26 func.func @foo3(%box : !fir.box<!fir.array<?xi32>>, %i : i32) -> i32 {
27   // CHECK: %[[cvt:.*]] = sext i32 %
28   %ii = fir.convert %i : (i32) -> index
29   // CHECK: %[[gep0:.*]] = getelementptr { ptr
30   // CHECK: %[[boxptr:.*]] = load ptr, ptr %[[gep0]]
31   // CHECK: %[[gep1:.*]] = getelementptr { ptr, i64, {{.*}} i32 7
32   // CHECK: %[[stride:.*]] = load i64, ptr %[[gep1]]
33   // CHECK: %[[dimoffset:.*]] = mul i64 %[[cvt]], %[[stride]]
34   // CHECK: %[[offset:.*]] = add i64 %[[dimoffset]], 0
35   // CHECK: %[[gep2:.*]] = getelementptr i8, ptr %[[boxptr]], i64 %[[offset]]
36   %1 = fir.coordinate_of %box, %ii : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
37   // CHECK: load i32, ptr %[[gep2]]
38   %rv = fir.load %1 : !fir.ref<i32>
39   return %rv : i32
42 // CHECK-LABEL: @foo4
43 func.func @foo4(%a : !fir.ptr<!fir.array<5x15x25xi32>>, %i : i32, %j : i64, %k : index) -> i32 {
44   // CHECK: getelementptr [25 x [15 x [5 x
45   %1 = fir.coordinate_of %a, %k : (!fir.ptr<!fir.array<5x15x25xi32>>, index) -> !fir.ref<!fir.array<5x15xi32>>
46   // CHECK: getelementptr [15 x [5 x
47   %2 = fir.coordinate_of %1, %j : (!fir.ref<!fir.array<5x15xi32>>, i64) -> !fir.ref<!fir.array<5xi32>>
48   // CHECK: %[[ref:.*]] = getelementptr [5 x
49   %3 = fir.coordinate_of %2, %i : (!fir.ref<!fir.array<5xi32>>, i32) -> !fir.ref<i32>
50   // CHECK: load i32, ptr %[[ref]]
51   %4 = fir.load %3 : !fir.ref<i32>
52   return %4 : i32
55 // CHECK-LABEL: @foo5
56 func.func @foo5(%box : !fir.box<!fir.ptr<!fir.array<?xi32>>>, %i : index) -> i32 {
57   // similar to foo3 test. Just check that the ptr type is not disturbing codegen.
58   %1 = fir.coordinate_of %box, %i : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>
59   // CHECK: load i32, ptr %{{.*}}
60   %rv = fir.load %1 : !fir.ref<i32>
61   return %rv : i32
64 // CHECK-LABEL: @foo6
65 // CHECK-SAME: (ptr %[[box:.*]], i64 %{{.*}}, ptr %{{.*}}) 
66 func.func @foo6(%box : !fir.box<!fir.ptr<!fir.array<?x!fir.char<1>>>>, %i : i64 , %res : !fir.ref<!fir.char<1>>) {
67   // CHECK: %[[addr_gep:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[box]], i32 0, i32 0
68   // CHECK: %[[addr:.*]] = load ptr, ptr %[[addr_gep]]
69   // CHECK: %[[stride_gep:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[box]], i32 0, i32 7, i32 0, i32 2
70   // CHECK: %[[stride:.*]] = load i64, ptr %[[stride_gep]]
71   // CHECK: %[[mul:.*]] = mul i64 %{{.*}}, %[[stride]]
72   // CHECK: %[[offset:.*]] = add i64 %[[mul]], 0
73   // CHECK: %[[gep:.*]] = getelementptr i8, ptr %[[addr]], i64 %[[offset]]
74   %coor = fir.coordinate_of %box, %i : (!fir.box<!fir.ptr<!fir.array<?x!fir.char<1>>>>, i64) -> !fir.ref<!fir.char<1>>
76   // CHECK: load [1 x i8], ptr %[[gep]]
77   %load = fir.load %coor : !fir.ref<!fir.char<1>>
78   fir.store %load to %res : !fir.ref<!fir.char<1>>
79   return