From 03039920d3765cb2afead7e0bcdcddcaf60d583a Mon Sep 17 00:00:00 2001 From: Marcos Maronas Date: Wed, 17 Jul 2024 04:59:16 -0700 Subject: [PATCH] [Backport to 15] Don't add initializer to local variables with external linkage. (#2643) If a variable is external, it will be defined during linking, the translator should not do it. Signed-off-by: Marcos Maronas --- lib/SPIRV/SPIRVReader.cpp | 3 ++- test/local_var_keeps_external.ll | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 test/local_var_keeps_external.ll diff --git a/lib/SPIRV/SPIRVReader.cpp b/lib/SPIRV/SPIRVReader.cpp index a612425d99..963ecdca80 100644 --- a/lib/SPIRV/SPIRVReader.cpp +++ b/lib/SPIRV/SPIRVReader.cpp @@ -1674,7 +1674,8 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F, else if (LinkageTy == GlobalValue::CommonLinkage) // In LLVM, variables with common linkage type must be initialized to 0. Initializer = Constant::getNullValue(Ty); - else if (BS == SPIRVStorageClassKind::StorageClassWorkgroup) + else if (BS == SPIRVStorageClassKind::StorageClassWorkgroup && + LinkageTy != GlobalValue::ExternalLinkage) Initializer = dyn_cast(UndefValue::get(Ty)); else if ((LinkageTy != GlobalValue::ExternalLinkage) && (BS == SPIRVStorageClassKind::StorageClassCrossWorkgroup)) diff --git a/test/local_var_keeps_external.ll b/test/local_var_keeps_external.ll new file mode 100644 index 0000000000..47156bd591 --- /dev/null +++ b/test/local_var_keeps_external.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as %s -o %t.bc -opaque-pointers +; RUN: llvm-spirv %t.bc -o %t.spv -opaque-pointers +; RUN: llvm-spirv -r %t.spv -o %t.rev.bc -emit-opaque-pointers +; RUN: llvm-dis %t.rev.bc -o %t.rev.ll -opaque-pointers +; RUN: FileCheck < %t.rev.ll %s --check-prefix CHECK-LLVM + +target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64-G1" +target triple = "spir64-unknown-unknown" +@__LocalVar = external addrspace(3) global ptr addrspace(1) +; CHECK-LLVM:@__LocalVar = external addrspace(3) global ptr addrspace(1)