From 8f2085f455bda416adf9bf62617da10fe12ab2ba Mon Sep 17 00:00:00 2001 From: "Bushi, Lorenc" Date: Thu, 10 Oct 2024 21:23:59 +0200 Subject: [PATCH 1/2] Lowerv LLVM IR Type of array of zero length to spirv type of array of length 1 --- llvm-spirv/lib/SPIRV/SPIRVWriter.cpp | 13 ++++--------- llvm-spirv/lib/SPIRV/libSPIRV/SPIRVErrorEnum.h | 1 - llvm-spirv/test/negative/zero-length-array.ll | 6 ++++-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/llvm-spirv/lib/SPIRV/SPIRVWriter.cpp b/llvm-spirv/lib/SPIRV/SPIRVWriter.cpp index b5ba78aec867a..ecd2539abd7ed 100644 --- a/llvm-spirv/lib/SPIRV/SPIRVWriter.cpp +++ b/llvm-spirv/lib/SPIRV/SPIRVWriter.cpp @@ -453,24 +453,19 @@ SPIRVType *LLVMToSPIRVBase::transType(Type *T) { if (T->isArrayTy()) { // SPIR-V 1.3 s3.32.6: Length is the number of elements in the array. // It must be at least 1. - if (T->getArrayNumElements() < 1) { - std::string Str; - llvm::raw_string_ostream OS(Str); - OS << *T; - SPIRVCK(T->getArrayNumElements() >= 1, InvalidArraySize, OS.str()); - } + const auto ArraySize = + T->getArrayNumElements() ? T->getArrayNumElements() : 1; Type *ElTy = T->getArrayElementType(); SPIRVType *TransType = BM->addArrayType( transType(ElTy), static_cast(transValue( - ConstantInt::get(getSizetType(), T->getArrayNumElements(), false), - nullptr))); + ConstantInt::get(getSizetType(), ArraySize, false), nullptr))); mapType(T, TransType); if (ElTy->isPointerTy()) { mapType( ArrayType::get(TypedPointerType::get(Type::getInt8Ty(*Ctx), ElTy->getPointerAddressSpace()), - T->getArrayNumElements()), + ArraySize), TransType); } return TransType; diff --git a/llvm-spirv/lib/SPIRV/libSPIRV/SPIRVErrorEnum.h b/llvm-spirv/lib/SPIRV/libSPIRV/SPIRVErrorEnum.h index 9273f01c6199a..147622a5202c9 100644 --- a/llvm-spirv/lib/SPIRV/libSPIRV/SPIRVErrorEnum.h +++ b/llvm-spirv/lib/SPIRV/libSPIRV/SPIRVErrorEnum.h @@ -10,7 +10,6 @@ _SPIRV_OP(InvalidMemoryModel, "Expects 0-3.") _SPIRV_OP(InvalidFunctionControlMask, "") _SPIRV_OP(InvalidBuiltinSetName, "Expects OpenCL.std.") _SPIRV_OP(InvalidFunctionCall, "Unexpected llvm intrinsic:\n") -_SPIRV_OP(InvalidArraySize, "Array size must be at least 1:") _SPIRV_OP(InvalidBitWidth, "Invalid bit width in input:") _SPIRV_OP(InvalidModule, "Invalid SPIR-V module:") _SPIRV_OP(InvalidLlvmModule, "Invalid LLVM module:") diff --git a/llvm-spirv/test/negative/zero-length-array.ll b/llvm-spirv/test/negative/zero-length-array.ll index 3689093fa68fe..75fce368a47ad 100644 --- a/llvm-spirv/test/negative/zero-length-array.ll +++ b/llvm-spirv/test/negative/zero-length-array.ll @@ -1,7 +1,9 @@ ; RUN: llvm-as %s -o %t.bc -; RUN: not llvm-spirv %t.bc -o %t.spv 2>&1 | FileCheck %s +; RUN: llvm-spirv %t.bc -o %t.spv +; RUN: spirv-dis %t.spv | FileCheck %s -; CHECK: InvalidArraySize: Array size must be at least 1: [0 x i32] +; CHECK: [[REGISTER:%[a-zA-Z0-9_]+]] = OpConstant %uint 1 +; CHECK: OpTypeArray %uint [[REGISTER]] source_filename = "test.cl" target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" From 7273f916d7cc3c38a1a494c683245a5c21db29a3 Mon Sep 17 00:00:00 2001 From: "Bushi, Lorenc" Date: Fri, 11 Oct 2024 07:00:33 +0200 Subject: [PATCH 2/2] Add requirement for spirv-dis to test --- llvm-spirv/test/{negative => }/zero-length-array.ll | 1 + 1 file changed, 1 insertion(+) rename llvm-spirv/test/{negative => }/zero-length-array.ll (98%) diff --git a/llvm-spirv/test/negative/zero-length-array.ll b/llvm-spirv/test/zero-length-array.ll similarity index 98% rename from llvm-spirv/test/negative/zero-length-array.ll rename to llvm-spirv/test/zero-length-array.ll index 75fce368a47ad..80a8166361c7d 100644 --- a/llvm-spirv/test/negative/zero-length-array.ll +++ b/llvm-spirv/test/zero-length-array.ll @@ -1,3 +1,4 @@ +; REQUIRES: spirv-dis ; RUN: llvm-as %s -o %t.bc ; RUN: llvm-spirv %t.bc -o %t.spv ; RUN: spirv-dis %t.spv | FileCheck %s