[flang-commits] [flang] [flang][cuda] Avoid crash when source is a block argument (PR #217459)

via flang-commits flang-commits at lists.llvm.org
Wed Aug 19 13:47:54 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-fir-hlfir

Author: Valentin Clement (バレンタイン クレメン) (clementval)

<details>
<summary>Changes</summary>

When the value is a block argument, getDefiningOp() returns null. Avoid crash when this is the case by checking for the defining op first. 

---
Full diff: https://github.com/llvm/llvm-project/pull/217459.diff


2 Files Affected:

- (modified) flang/lib/Optimizer/Transforms/CUDA/CUFOpConversion.cpp (+6-2) 
- (modified) flang/test/Fir/CUDA/cuda-data-transfer.fir (+16) 


``````````diff
diff --git a/flang/lib/Optimizer/Transforms/CUDA/CUFOpConversion.cpp b/flang/lib/Optimizer/Transforms/CUDA/CUFOpConversion.cpp
index 8e16473eaf982..e9e5989bee5b4 100644
--- a/flang/lib/Optimizer/Transforms/CUDA/CUFOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/CUDA/CUFOpConversion.cpp
@@ -337,14 +337,18 @@ struct CUFDataTransferOpConversion
     }
 
     auto materializeBoxIfNeeded = [&](mlir::Value val) -> mlir::Value {
-      if (mlir::isa<fir::EmboxOp, fir::ReboxOp>(val.getDefiningOp())) {
+      // val can be a block argument and therefore has no defining operation.
+      mlir::Operation *defOp = val.getDefiningOp();
+      if (!defOp)
+        return val;
+      if (mlir::isa<fir::EmboxOp, fir::ReboxOp>(defOp)) {
         // Materialize the box to memory to be able to call the runtime.
         mlir::Value box = builder.createTemporary(loc, val.getType());
         fir::StoreOp::create(builder, loc, val, box);
         return box;
       }
       if (mlir::isa<fir::BaseBoxType>(val.getType()))
-        if (auto loadOp = mlir::dyn_cast<fir::LoadOp>(val.getDefiningOp()))
+        if (auto loadOp = mlir::dyn_cast<fir::LoadOp>(defOp))
           return loadOp.getMemref();
       return val;
     };
diff --git a/flang/test/Fir/CUDA/cuda-data-transfer.fir b/flang/test/Fir/CUDA/cuda-data-transfer.fir
index 235bcae1ccf98..37f5448ba8b89 100644
--- a/flang/test/Fir/CUDA/cuda-data-transfer.fir
+++ b/flang/test/Fir/CUDA/cuda-data-transfer.fir
@@ -725,5 +725,21 @@ func.func @_QQmain() attributes {fir.bindc_name = "T"} {
 // CHECK-LABEL: func.func @_QQmain() 
 // CHECK: fir.call @_FortranACUFDataTransferDescDesc
 
+func.func @_QPdesc_block_arg(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf64>>>> {cuf.data_attr = #cuf.cuda<device>}, %arg1: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf64>>>> {cuf.data_attr = #cuf.cuda<device>}, %arg2: !fir.heap<!fir.array<?xf64>>, %arg3: index, %arg4: i1) {
+  cf.cond_br %arg4, ^bb1, ^bb2
+^bb1:
+  cf.br ^bb3(%arg0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf64>>>>)
+^bb2:
+  cf.br ^bb3(%arg1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf64>>>>)
+^bb3(%0: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf64>>>>):
+  %1 = fir.shape %arg3 : (index) -> !fir.shape<1>
+  %2 = fir.embox %arg2(%1) : (!fir.heap<!fir.array<?xf64>>, !fir.shape<1>) -> !fir.box<!fir.array<?xf64>>
+  cuf.data_transfer %0 to %2 {transfer_kind = #cuf.cuda_transfer<device_device>} : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf64>>>>, !fir.box<!fir.array<?xf64>>
+  return
+}
+
+// CHECK-LABEL: func.func @_QPdesc_block_arg
+// CHECK: fir.call @_FortranACUFDataTransferDescDesc
+
 } // end of module
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/217459


More information about the flang-commits mailing list