diff --git a/mlir/include/mlir/Conversion/Passes.td b/mlir/include/mlir/Conversion/Passes.td --- a/mlir/include/mlir/Conversion/Passes.td +++ b/mlir/include/mlir/Conversion/Passes.td @@ -335,7 +335,10 @@ def GpuToLLVMConversionPass : Pass<"gpu-to-llvm", "ModuleOp"> { let summary = "Convert GPU dialect to LLVM dialect with GPU runtime calls"; let constructor = "mlir::createGpuToLLVMConversionPass()"; - let dependentDialects = ["LLVM::LLVMDialect"]; + let dependentDialects = [ + "LLVM::LLVMDialect", + "memref::MemRefDialect", + ]; } def LowerHostCodeToLLVM : Pass<"lower-host-to-llvm", "ModuleOp"> { diff --git a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp --- a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp +++ b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp @@ -28,6 +28,7 @@ #include "mlir/Dialect/GPU/IR/GPUDialect.h" #include "mlir/Dialect/GPU/Transforms/Passes.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" +#include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/IR/Attributes.h" #include "mlir/IR/Builders.h" #include "mlir/IR/BuiltinOps.h" diff --git a/mlir/test/Conversion/GPUCommon/transfer_write.mlir b/mlir/test/Conversion/GPUCommon/transfer_write.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Conversion/GPUCommon/transfer_write.mlir @@ -0,0 +1,13 @@ +// RUN: mlir-opt %s --gpu-to-llvm | FileCheck %s + + func.func @warp_extract(%arg0: index, %arg1: memref<1024x1024xf32>, %arg2: index, %arg3: vector<1xf32>) { + %c0 = arith.constant 0 : index + vector.warp_execute_on_lane_0(%arg0)[32] { + // CHECK:%[[val:[0-9]+]] = llvm.extractelement + // CHECK:%[[base:[0-9]+]] = llvm.extractvalue + // CHECK:%[[ptr:[0-9]+]] = llvm.getelementptr %[[base]] + // CHECK:llvm.store %[[val]], %[[ptr]] + vector.transfer_write %arg3, %arg1[%c0, %c0] {in_bounds = [true]} : vector<1xf32>, memref<1024x1024xf32> + } + return + }