1 // Test fir.box_offset code generation.
2 // RUN: tco %s | FileCheck %s
3 // RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s
5 func.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>>>
9 // CHECK-LABEL: define ptr @scalar_addr(
10 // CHECK-SAME: ptr nocapture %[[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]]
14 func.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>>>
18 // CHECK-LABEL: define ptr @scalar_tdesc(
19 // CHECK-SAME: ptr nocapture %[[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]]
23 func.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>>>>
27 // CHECK-LABEL: define ptr @array_addr(
28 // CHECK-SAME: ptr nocapture %[[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]]
32 func.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>>>
36 // CHECK-LABEL: define ptr @array_tdesc(
37 // CHECK-SAME: ptr nocapture %[[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]]