xref: /llvm-project/flang/test/Fir/box-offset-codegen.fir (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1// Test fir.box_offset code generation.
2// RUN: tco %s | FileCheck %s
3// RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s
4
5func.func @scalar_addr(%scalar : !fir.ref<!fir.box<!fir.type<t>>>) -> !fir.llvm_ptr<!fir.ref<!fir.type<t>>> {
6  %addr = fir.box_offset %scalar base_addr : (!fir.ref<!fir.box<!fir.type<t>>>) -> !fir.llvm_ptr<!fir.ref<!fir.type<t>>>
7  return %addr : !fir.llvm_ptr<!fir.ref<!fir.type<t>>>
8}
9// CHECK-LABEL: define ptr @scalar_addr(
10// CHECK-SAME: ptr captures(none) %[[BOX:.*]]){{.*}}{
11// CHECK:    %[[VAL_0:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] }, ptr %[[BOX]], i32 0, i32 0
12// CHECK:    ret ptr %[[VAL_0]]
13
14func.func @scalar_tdesc(%scalar : !fir.ref<!fir.box<!fir.type<t>>>) -> !fir.llvm_ptr<!fir.tdesc<!fir.type<t>>> {
15  %tdesc = fir.box_offset %scalar derived_type : (!fir.ref<!fir.box<!fir.type<t>>>) -> !fir.llvm_ptr<!fir.tdesc<!fir.type<t>>>
16  return %tdesc : !fir.llvm_ptr<!fir.tdesc<!fir.type<t>>>
17}
18// CHECK-LABEL: define ptr @scalar_tdesc(
19// CHECK-SAME: ptr captures(none) %[[BOX:.*]]){{.*}}{
20// CHECK:    %[[VAL_0:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] }, ptr %[[BOX]], i32 0, i32 7
21// CHECK:    ret ptr %[[VAL_0]]
22
23func.func @array_addr(%array : !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<t>>>>>) -> !fir.llvm_ptr<!fir.ptr<!fir.array<?x!fir.type<t>>>> {
24  %addr = fir.box_offset %array base_addr : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<t>>>>>) -> !fir.llvm_ptr<!fir.ptr<!fir.array<?x!fir.type<t>>>>
25  return %addr : !fir.llvm_ptr<!fir.ptr<!fir.array<?x!fir.type<t>>>>
26}
27// CHECK-LABEL: define ptr @array_addr(
28// CHECK-SAME: ptr captures(none) %[[BOX:.*]]){{.*}}{
29// CHECK:    %[[VAL_0:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %[[BOX]], i32 0, i32 0
30// CHECK:    ret ptr %[[VAL_0]]
31
32func.func @array_tdesc(%array : !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<t>>>>>) -> !fir.llvm_ptr<!fir.tdesc<!fir.type<t>>> {
33  %tdesc = fir.box_offset %array derived_type : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<t>>>>>) -> !fir.llvm_ptr<!fir.tdesc<!fir.type<t>>>
34  return %tdesc : !fir.llvm_ptr<!fir.tdesc<!fir.type<t>>>
35}
36// CHECK-LABEL: define ptr @array_tdesc(
37// CHECK-SAME: ptr captures(none) %[[BOX:.*]]){{.*}}{
38// CHECK:    %[[VAL_0:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %[[BOX]], i32 0, i32 8
39// CHECK:    ret ptr %[[VAL_0]]
40