From b2112593b7282c6fa4c65141412a7578e2ea1f60 Mon Sep 17 00:00:00 2001 From: seven-mile Date: Fri, 30 Aug 2024 18:21:08 +0000 Subject: [PATCH 1/4] [CIR][CodeGen] Fix address space of result pointer type of array decay cast op --- clang/lib/CIR/CodeGen/CIRGenBuilder.cpp | 5 ++++- clang/test/CIR/CodeGen/OpenCL/array-decay.cl | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 clang/test/CIR/CodeGen/OpenCL/array-decay.cl diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp b/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp index 6fda24084658..c4e174af010e 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp @@ -19,8 +19,11 @@ mlir::Value CIRGenBuilderTy::maybeBuildArrayDecay(mlir::Location loc, ::mlir::dyn_cast<::mlir::cir::ArrayType>(arrayPtrTy.getPointee()); if (arrayTy) { + mlir::cir::AddressSpaceAttr addrSpace = + ::mlir::cast_if_present<::mlir::cir::AddressSpaceAttr>( + arrayPtrTy.getAddrSpace()); mlir::cir::PointerType flatPtrTy = - mlir::cir::PointerType::get(getContext(), arrayTy.getEltType()); + getPointerTo(arrayTy.getEltType(), addrSpace); return create( loc, flatPtrTy, mlir::cir::CastKind::array_to_ptrdecay, arrayPtr); } diff --git a/clang/test/CIR/CodeGen/OpenCL/array-decay.cl b/clang/test/CIR/CodeGen/OpenCL/array-decay.cl new file mode 100644 index 000000000000..4a094a53113f --- /dev/null +++ b/clang/test/CIR/CodeGen/OpenCL/array-decay.cl @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -cl-std=CL3.0 -O0 -fclangir -emit-cir -triple spirv64-unknown-unknown %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR +// RUN: %clang_cc1 -cl-std=CL3.0 -O0 -fclangir -emit-llvm -triple spirv64-unknown-unknown %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s --check-prefix=LLVM + +// CIR: @func +// LLVM: @func +kernel void func(global int *data) { + local int arr[32]; + local int *ptr = arr; + // CIR: cir.cast(array_to_ptrdecay, %{{[0-9]+}} : !cir.ptr, addrspace(offload_local)>), !cir.ptr + // CIR-NEXT: cir.store %{{[0-9]+}}, %{{[0-9]+}} : !cir.ptr, !cir.ptr, addrspace(offload_private)> + // LLVM: store ptr addrspace(3) @func.arr, ptr %{{[0-9]+}} +} From 04f1cfefab59e7cf65996fcfd068f0619d81d9b2 Mon Sep 17 00:00:00 2001 From: seven-mile Date: Sat, 31 Aug 2024 04:32:42 +0000 Subject: [PATCH 2/4] [CIR][CodeGen] Another fix address space of result pointer type of array decay cast op --- clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp | 6 ++++-- clang/test/CIR/CodeGen/OpenCL/array-decay.cl | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp index 36941fc1725a..9ed791a75f83 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprAgg.cpp @@ -488,8 +488,10 @@ void AggExprEmitter::buildArrayInit(Address DestPtr, mlir::cir::ArrayType AType, QualType elementPtrType = CGF.getContext().getPointerType(elementType); auto cirElementType = CGF.convertType(elementType); - auto cirElementPtrType = mlir::cir::PointerType::get( - CGF.getBuilder().getContext(), cirElementType); + auto cirAddrSpace = mlir::cast_if_present( + DestPtr.getType().getAddrSpace()); + auto cirElementPtrType = + CGF.getBuilder().getPointerTo(cirElementType, cirAddrSpace); auto loc = CGF.getLoc(ExprToVisit->getSourceRange()); // Cast from cir.ptr to cir.ptr diff --git a/clang/test/CIR/CodeGen/OpenCL/array-decay.cl b/clang/test/CIR/CodeGen/OpenCL/array-decay.cl index 4a094a53113f..d81e425729a6 100644 --- a/clang/test/CIR/CodeGen/OpenCL/array-decay.cl +++ b/clang/test/CIR/CodeGen/OpenCL/array-decay.cl @@ -3,12 +3,23 @@ // RUN: %clang_cc1 -cl-std=CL3.0 -O0 -fclangir -emit-llvm -triple spirv64-unknown-unknown %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s --check-prefix=LLVM -// CIR: @func -// LLVM: @func -kernel void func(global int *data) { +// CIR: @func1 +// LLVM: @func1 +kernel void func1(global int *data) { local int arr[32]; + local int *ptr = arr; // CIR: cir.cast(array_to_ptrdecay, %{{[0-9]+}} : !cir.ptr, addrspace(offload_local)>), !cir.ptr // CIR-NEXT: cir.store %{{[0-9]+}}, %{{[0-9]+}} : !cir.ptr, !cir.ptr, addrspace(offload_private)> - // LLVM: store ptr addrspace(3) @func.arr, ptr %{{[0-9]+}} + + // LLVM: store ptr addrspace(3) @func1.arr, ptr %{{[0-9]+}} +} + +// CIR: @func2 +// LLVM: @func2 +kernel void func2(global int *data) { + private int arr[32] = {data[2]}; + // CIR: %{{[0-9]+}} = cir.cast(array_to_ptrdecay, %{{[0-9]+}} : !cir.ptr, addrspace(offload_private)>), !cir.ptr + + // LLVM: %{{[0-9]+}} = getelementptr i32, ptr %3, i32 0 } From 6417eebf35d41a4c20225486ae67051fdc9a7361 Mon Sep 17 00:00:00 2001 From: seven-mile Date: Sat, 31 Aug 2024 04:47:04 +0000 Subject: [PATCH 3/4] use auto instead for redundant types --- clang/lib/CIR/CodeGen/CIRGenBuilder.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp b/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp index c4e174af010e..13ec20d8eda2 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.cpp @@ -19,9 +19,8 @@ mlir::Value CIRGenBuilderTy::maybeBuildArrayDecay(mlir::Location loc, ::mlir::dyn_cast<::mlir::cir::ArrayType>(arrayPtrTy.getPointee()); if (arrayTy) { - mlir::cir::AddressSpaceAttr addrSpace = - ::mlir::cast_if_present<::mlir::cir::AddressSpaceAttr>( - arrayPtrTy.getAddrSpace()); + auto addrSpace = ::mlir::cast_if_present<::mlir::cir::AddressSpaceAttr>( + arrayPtrTy.getAddrSpace()); mlir::cir::PointerType flatPtrTy = getPointerTo(arrayTy.getEltType(), addrSpace); return create( From 40451897a49c9504160bb24ef93d5e4bf4fcfb63 Mon Sep 17 00:00:00 2001 From: seven-mile Date: Mon, 2 Sep 2024 22:51:46 +0800 Subject: [PATCH 4/4] Add verification for array_to_ptrdecay --- clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 5 +++++ clang/test/CIR/IR/invalid.cir | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index a9616ae62bc6..c8c179a75cdb 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -490,6 +490,11 @@ LogicalResult CastOp::verify() { if (!arrayPtrTy || !flatPtrTy) return emitOpError() << "requires !cir.ptr type for source and result"; + if (arrayPtrTy.getAddrSpace() != flatPtrTy.getAddrSpace()) { + return emitOpError() + << "requires same address space for source and result"; + } + auto arrayTy = mlir::dyn_cast(arrayPtrTy.getPointee()); if (!arrayTy) diff --git a/clang/test/CIR/IR/invalid.cir b/clang/test/CIR/IR/invalid.cir index 182845fa2b6f..2473082b9334 100644 --- a/clang/test/CIR/IR/invalid.cir +++ b/clang/test/CIR/IR/invalid.cir @@ -1285,3 +1285,16 @@ module { cir.return } } + +// ----- + +!s32i = !cir.int + +module { + cir.func @array_to_ptrdecay_addrspace() { + %0 = cir.alloca !cir.array, !cir.ptr, addrspace(offload_private)>, ["x", init] + // expected-error@+1 {{requires same address space for source and result}} + %1 = cir.cast(array_to_ptrdecay, %0 : !cir.ptr, addrspace(offload_private)>), !cir.ptr + cir.return + } +}