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