Issue 185357
Summary [MLIR] Crash during GPU kernel outlining when cloning operation
Labels mlir
Assignees
Reporter Zustin
    Hi, I found a crash bug when lowering an MLIR program with the Vulkan pipeline. See the following code example:

Git version: da8d1b52d0d344068a8bd3e46a8af3a692d2efc2

```llvm
module attributes {gpu.container_module} {
  gpu.module @kernels {
    gpu.func @increment_kernel(%arg0: memref<?xi32>, %arg1: i32, %arg2: memref<?xi1>) kernel {
      %c0 = arith.constant 0 : i32
      %tid = gpu.thread_id x
 %bid = gpu.block_id x
      %bdim = gpu.block_dim x
      %tid_i32 = arith.index_cast %tid : index to i32
      %bid_i32 = arith.index_cast %bid : index to i32
      %bdim_i32 = arith.index_cast %bdim : index to i32
 %idx = arith.addi %bid, %tid : index
      %val = memref.load %arg0[%idx] : memref<?xi32>
      %cond = arith.cmpi slt, %val, %arg1 : i32
 memref.store %cond, %arg2[%idx] : memref<?xi1>
      %new_val = arith.addi %val, %arg1 : i32
      memref.store %new_val, %arg0[%idx] : memref<?xi32>
 gpu.return
    }
  }
  func.func @main() {
    %zero = arith.constant 0 : i32
    %blocksz = arith.constant 32 : i32
    %_one_ = arith.constant 1 : i32
    %total = arith.constant 131072 : i32
 %threshold = arith.constant 50 : i32

    %h_data = memref.alloc() : memref<131072xi32>
    %d_data = gpu.alloc() : memref<131072xi32>
 %h_flag = memref.alloc() : memref<131072xi1>
    %d_flag = gpu.alloc() : memref<131072xi1>

    %grid = arith.divsi %total, %blocksz : i32
 %grid_mod = arith.remsi %grid, %threshold : i32
    %st = gpu.wait async []

    %memcpy_token0 = gpu.memcpy async [%st] %d_data, %h_data : memref<131072xi32>, memref<131072xi32>
    %memcpy_token1 = gpu.memcpy async [%st] %d_flag, %h_flag : memref<131072xi1>, memref<131072xi1>

 %grid_mod_index = arith.index_cast %grid_mod : i32 to index
 %blocksz_index = arith.index_cast %blocksz : i32 to index
    %_one_index_ = arith.index_cast %one : i32 to index
    %total_index = arith.index_cast %total : i32 to index

    %launch_token = gpu.launch async [%memcpy_token1]
        blocks(%bX, %bY, %bZ) in (%g1 = %grid_mod_index, %g2 = %one_index, %g3 = %one_index)
        threads(%tX, %tY, %tZ) in (%b1 = %blocksz_index, %b2 = %one_index, %b3 = %one_index) {
      gpu.launch_func @kernels::@increment_kernel
          blocks in (%bX, %bY, %bZ)
 threads in (%tX, %tY, %tZ)
          args(%d_data : memref<131072xi32>, %threshold : i32, %d_flag : memref<131072xi1>)
      gpu.terminator
 }

    %memcpy_token2 = gpu.memcpy async [%launch_token] %h_data, %d_data : memref<131072xi32>, memref<131072xi32>
    %memcpy_token3 = gpu.memcpy async [%launch_token] %h_flag, %d_flag : memref<131072xi1>, memref<131072xi1>

 %init_val = arith.constant 0 : i32
    %zero_index = arith.index_cast %zero : i32 to index
    %_one_index_2_ = arith.index_cast %one : i32 to index
 %loop_result = scf.for %i = %zero_index to %total_index step %one_index_2 iter_args(%acc = %init_val) -> i32 {
      %wait_token = gpu.wait async [%memcpy_token2]
      %new_acc = arith.addi %acc, %one : i32
 scf.yield %new_acc : i32
    }

    %final_wait = gpu.wait async [%memcpy_token3]
    memref.dealloc %h_data : memref<131072xi32>
 gpu.dealloc %d_data : memref<131072xi32>
    memref.dealloc %h_flag : memref<131072xi1>
    gpu.dealloc %d_flag : memref<131072xi1>
    return
 }
}
```

#### Stack Trace
```bash
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0.	Program arguments: mlir-opt asyncAPI.mlir -test-vulkan-runner-pipeline
 #0 0x000056c677f30dbd llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm/lib/Support/Unix/Signals.inc:880:11
 #1 0x000056c677f312eb PrintStackTraceSignalHandler(void*) /llvm/lib/Support/Unix/Signals.inc:962:1
 #2 0x000056c677f2f184 llvm::sys::RunSignalHandlers() /llvm/lib/Support/Signals.cpp:108:5
 #3 0x000056c677f31a89 SignalHandler(int, siginfo_t*, void*) /llvm/lib/Support/Unix/Signals.inc:448:38
 #4 0x000070a08a445330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #5 0x000056c67813eee4 mlir::Operation::getNumOperands() /mlir/include/mlir/IR/Operation.h:376:24
 #6 0x000056c686dc7306 mlir::Operation::clone(mlir::IRMapping&, mlir::Operation::CloneOptions const&) /mlir/lib/IR/Operation.cpp:731:22
 #7 0x000056c686dc7825 mlir::Operation::clone(mlir::Operation::CloneOptions const&) /mlir/lib/IR/Operation.cpp:763:10
 #8 0x000056c67b20e2a6 (anonymous namespace)::GpuKernelOutliningPass::createKernelModule(mlir::gpu::LaunchOp, mlir::gpu::GPUFuncOp, mlir::SymbolTable const&) /mlir/lib/Dialect/GPU/Transforms/KernelOutlining.cpp:443:53
 #9 0x000056c67b20dd4c (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)::operator()(mlir::gpu::LaunchOp) const /mlir/lib/Dialect/GPU/Transforms/KernelOutlining.cpp:378:29
#10 0x000056c67b20db7c std::enable_if<!llvm::is_one_of<mlir::gpu::LaunchOp, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp), mlir::gpu::LaunchOp, mlir::WalkResult>(mlir::Operation*, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)&&)::'lambda'(mlir::Operation*)::operator()(mlir::Operation*) const /mlir/include/mlir/IR/Visitors.h:341:14
#11 0x000056c67b20db1d mlir::WalkResult llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::callback_fn<std::enable_if<!llvm::is_one_of<mlir::gpu::LaunchOp, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp), mlir::gpu::LaunchOp, mlir::WalkResult>(mlir::Operation*, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)&&)::'lambda'(mlir::Operation*)>(long, mlir::Operation*) /llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#12 0x000056c6780e2a81 llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::operator()(mlir::Operation*) const /llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#13 0x000056c6780e2a41 mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /mlir/include/mlir/IR/Visitors.h:246:12
#14 0x000056c6780e29d6 mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /mlir/include/mlir/IR/Visitors.h:239:13
#15 0x000056c67b20daba std::enable_if<!llvm::is_one_of<mlir::gpu::LaunchOp, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp), mlir::gpu::LaunchOp, mlir::WalkResult>(mlir::Operation*, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)&&) /mlir/include/mlir/IR/Visitors.h:344:10
#16 0x000056c67b20da5d std::enable_if<llvm::function_traits<std::decay<(anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)>::type>::num_args == 1, mlir::WalkResult>::type mlir::Operation::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp), mlir::WalkResult>((anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)&&) /mlir/include/mlir/IR/Operation.h:827:12
#17 0x000056c67b20da30 std::enable_if<llvm::function_traits<std::decay<(anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)>::type>::num_args == 1, mlir::WalkResult>::type mlir::OpState::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp), mlir::WalkResult>((anonymous namespace)::GpuKernelOutliningPass::runOnOperation()::'lambda'(mlir::gpu::LaunchOp)&&) /mlir/include/mlir/IR/OpDefinition.h:170:19
#18 0x000056c67b20d5eb (anonymous namespace)::GpuKernelOutliningPass::runOnOperation() /mlir/lib/Dialect/GPU/Transforms/KernelOutlining.cpp:360:34
#19 0x000056c6868d9fa4 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_3::operator()() const /mlir/lib/Pass/Pass.cpp:0:19
#20 0x000056c6868d9f45 void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_3>(long) /llvm/include/llvm/ADT/STLFunctionalExtras.h:46:5
#21 0x000056c677f57189 llvm::function_ref<void ()>::operator()() const /llvm/include/llvm/ADT/STLFunctionalExtras.h:69:5
#22 0x000056c6868dd44b void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) /mlir/include/mlir/IR/MLIRContext.h:291:3
#23 0x000056c6868d13ee mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /mlir/lib/Pass/Pass.cpp:619:17
#24 0x000056c6868d1b0a mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /mlir/lib/Pass/Pass.cpp:688:16
#25 0x000056c6868d73ed mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /mlir/lib/Pass/Pass.cpp:1123:10
#26 0x000056c6868d6976 mlir::PassManager::run(mlir::Operation*) /mlir/lib/Pass/Pass.cpp:1097:60
#27 0x000056c67803be7b performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) /mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:596:17
#28 0x000056c67803b551 processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, mlir::SourceMgrDiagnosticVerifierHandler*, llvm::ThreadPoolInterface*) /mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:681:12
#29 0x000056c67803b20c mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_0::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef, llvm::raw_ostream&) const /mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:779:12
#30 0x000056c67803b116 llvm::LogicalResult llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&) /llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#31 0x000056c686e436fa llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&) const /llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#32 0x000056c686e42aba mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) /mlir/lib/Support/ToolUtilities.cpp:30:12
#33 0x000056c678036dc6 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) /mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:784:26
#34 0x000056c6780371c8 mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) /mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:830:14
#35 0x000056c678037398 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) /mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:846:10
#36 0x000056c677f058d5 main /mlir/tools/mlir-opt/mlir-opt.cpp:343:33
#37 0x000070a08a42a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#38 0x000070a08a42a28b call_init ./csu/../csu/libc-start.c:128:20
#39 0x000070a08a42a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#40 0x000056c677f05745 _start (./mlir-opt+0x481e745)
Segmentation fault
```

#### Reproduction Command
```bash
mlir-opt asyncAPI.mlir -test-vulkan-runner-pipeline
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to