Skip to content

Commit d36836d

Browse files
authored
[flang][cuda] Create descriptor in managed memory when emboxing fir.box_addr value (#120980)
1 parent 99dddef commit d36836d

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1728,9 +1728,12 @@ struct EmboxOpConversion : public EmboxCommonConversion<fir::EmboxOp> {
17281728
static bool isDeviceAllocation(mlir::Value val) {
17291729
if (auto loadOp = mlir::dyn_cast_or_null<fir::LoadOp>(val.getDefiningOp()))
17301730
return isDeviceAllocation(loadOp.getMemref());
1731+
if (auto boxAddrOp =
1732+
mlir::dyn_cast_or_null<fir::BoxAddrOp>(val.getDefiningOp()))
1733+
return isDeviceAllocation(boxAddrOp.getVal());
17311734
if (auto convertOp =
17321735
mlir::dyn_cast_or_null<fir::ConvertOp>(val.getDefiningOp()))
1733-
val = convertOp.getValue();
1736+
return isDeviceAllocation(convertOp.getValue());
17341737
if (auto callOp = mlir::dyn_cast_or_null<fir::CallOp>(val.getDefiningOp()))
17351738
if (callOp.getCallee() &&
17361739
(callOp.getCallee().value().getRootReference().getValue().starts_with(

flang/test/Fir/CUDA/cuda-code-gen.mlir

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,47 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<f80 = dense<128> : vector<2xi64>
126126

127127
// CHECK-LABEL: llvm.func @_QQmain()
128128
// CHECK-COUNT-4: llvm.call @_FortranACUFAllocDescriptor
129+
130+
// -----
131+
132+
module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vector<4xi64>, f128 = dense<128> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, i64 = dense<64> : vector<2xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, f80 = dense<128> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i1 = dense<8> : vector<2xi64>, "dlti.endianness" = "little", "dlti.stack_alignment" = 128 : i64>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", gpu.container_module, llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.ident = "flang version 20.0.0 ([email protected]:clementval/llvm-project.git efc2415bcce8e8a9e73e77aa122c8aba1c1fbbd2)", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
133+
func.func @_QQmain() {
134+
%c1_i32 = arith.constant 1 : i32
135+
%c2 = arith.constant 2 : index
136+
%c10 = arith.constant 10 : index
137+
%c1 = arith.constant 1 : index
138+
%c0 = arith.constant 0 : index
139+
%0 = fir.address_of(@_QQclX3C737464696E3E00) : !fir.ref<!fir.char<1,8>>
140+
%c11_i32 = arith.constant 11 : i32
141+
%c72 = arith.constant 72 : index
142+
%1 = fir.convert %c72 : (index) -> i64
143+
%2 = fir.convert %0 : (!fir.ref<!fir.char<1,8>>) -> !fir.ref<i8>
144+
%3 = fir.call @_FortranACUFAllocDescriptor(%1, %2, %c11_i32) : (i64, !fir.ref<i8>, i32) -> !fir.ref<!fir.box<none>>
145+
%4 = fir.convert %3 : (!fir.ref<!fir.box<none>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
146+
%5 = fir.zero_bits !fir.heap<!fir.array<?x?xi32>>
147+
%6 = fircg.ext_embox %5(%c0, %c0) {allocator_idx = 2 : i32} : (!fir.heap<!fir.array<?x?xi32>>, index, index) -> !fir.box<!fir.heap<!fir.array<?x?xi32>>>
148+
fir.store %6 to %4 : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
149+
%7 = fir.load %4 : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xi32>>>>
150+
%8 = fir.box_addr %7 : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>) -> !fir.heap<!fir.array<?x?xi32>>
151+
%c0_0 = arith.constant 0 : index
152+
%9:3 = fir.box_dims %7, %c0_0 : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>, index) -> (index, index, index)
153+
%c1_1 = arith.constant 1 : index
154+
%10:3 = fir.box_dims %7, %c1_1 : (!fir.box<!fir.heap<!fir.array<?x?xi32>>>, index) -> (index, index, index)
155+
%11 = fircg.ext_embox %8(%9#1, %10#1) origin %9#0, %10#0[%c1, %c10, %c1, %c1, %c2, %c1] : (!fir.heap<!fir.array<?x?xi32>>, index, index, index, index, index, index, index, index, index, index) -> !fir.box<!fir.array<10x2xi32>>
156+
return
157+
}
158+
gpu.module @cuda_device_mod {
159+
gpu.func @_QMassumedPglob(%arg0: !fir.box<!fir.array<?x?xi32>>) kernel {
160+
gpu.return
161+
}
162+
}
163+
fir.global linkonce @_QQclX3C737464696E3E00 constant : !fir.char<1,8> {
164+
%0 = fir.string_lit "<stdin>\00"(8) : !fir.char<1,8>
165+
fir.has_value %0 : !fir.char<1,8>
166+
}
167+
func.func private @_FortranACUFAllocDescriptor(i64, !fir.ref<i8>, i32) -> !fir.ref<!fir.box<none>> attributes {fir.runtime}
168+
func.func private @_FortranACUFFreeDescriptor(!fir.ref<!fir.box<none>>, !fir.ref<i8>, i32) -> none attributes {fir.runtime}
169+
}
170+
171+
// CHECK-LABEL: llvm.func @_QQmain()
172+
// CHECK-COUNT-3: llvm.call @_FortranACUFAllocDescriptor

0 commit comments

Comments
 (0)