From 4614889a936fe7a69a4760fd765c374002c207c3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Markus=20B=C3=B6ck?= Date: Fri, 10 Mar 2023 10:49:16 +0100 Subject: [PATCH] [mlir][GPUToLLVM] Fix regression introduced with opaque-pointers when generate GPU launch func parameters This has caused build failures when enabling opaque pointers for the GPU integration tests as could be seen here: https://lab.llvm.org/buildbot/#/builders/220/builds/16946 and here https://lab.llvm.org/buildbot/#/builders/61/builds/40822 The gist of the issue was the use of a wrong pointer base type within a GEP. There sadly was no test coverage for either the generating of that GEP, nor is LLVM Dialects GEP verifier currently capable of catching such issues, so it went unnoticed until the integration tests actually attempted to convert it to LLVM IR. Differential Revision: https://reviews.llvm.org/D145774 --- mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp | 3 +-- .../GPUCommon/lower-launch-func-to-gpu-runtime-calls.mlir | 9 +++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp index ec85b99..55a5e46 100644 --- a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp +++ b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp @@ -680,8 +680,7 @@ Value ConvertLaunchFuncOpToGpuRuntimeCallPattern::generateParamsArray( for (const auto &en : llvm::enumerate(arguments)) { Value fieldPtr = builder.create( loc, getTypeConverter()->getPointerType(argumentTypes[en.index()]), - argumentTypes[en.index()], structPtr, - ArrayRef{0, en.index()}); + structType, structPtr, ArrayRef{0, en.index()}); builder.create(loc, en.value(), fieldPtr); auto elementPtr = builder.create( loc, llvmPointerPointerType, llvmPointerType, arrayPtr, diff --git a/mlir/test/Conversion/GPUCommon/lower-launch-func-to-gpu-runtime-calls.mlir b/mlir/test/Conversion/GPUCommon/lower-launch-func-to-gpu-runtime-calls.mlir index 1db1dc8c..0bc1450 100644 --- a/mlir/test/Conversion/GPUCommon/lower-launch-func-to-gpu-runtime-calls.mlir +++ b/mlir/test/Conversion/GPUCommon/lower-launch-func-to-gpu-runtime-calls.mlir @@ -40,9 +40,18 @@ module attributes {gpu.container_module} { // CHECK: [[STREAM:%.*]] = llvm.call @mgpuStreamCreate + // CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) + // CHECK: %[[MEMREF:.*]] = llvm.alloca %[[ONE]] x !llvm.struct[[STRUCT_BODY:<.*>]] // CHECK: [[NUM_PARAMS:%.*]] = llvm.mlir.constant(6 : i32) : i32 // CHECK-NEXT: [[PARAMS:%.*]] = llvm.alloca [[NUM_PARAMS]] x !llvm.ptr + // CHECK: llvm.getelementptr %[[MEMREF]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct[[STRUCT_BODY:<.*>]] + // CHECK: llvm.getelementptr %[[MEMREF]][0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct[[STRUCT_BODY:<.*>]] + // CHECK: llvm.getelementptr %[[MEMREF]][0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct[[STRUCT_BODY:<.*>]] + // CHECK: llvm.getelementptr %[[MEMREF]][0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct[[STRUCT_BODY:<.*>]] + // CHECK: llvm.getelementptr %[[MEMREF]][0, 4] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct[[STRUCT_BODY:<.*>]] + // CHECK: llvm.getelementptr %[[MEMREF]][0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct[[STRUCT_BODY:<.*>]] + // CHECK: [[EXTRA_PARAMS:%.*]] = llvm.mlir.null : !llvm.ptr // CHECK: llvm.call @mgpuLaunchKernel([[FUNC]], [[C8]], [[C8]], [[C8]], -- 2.7.4