Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions clang/lib/CodeGen/CGExprAgg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,12 @@ void AggExprEmitter::EmitArrayInit(Address DestPtr, llvm::ArrayType *AType,
CodeGen::CodeGenModule &CGM = CGF.CGM;
ConstantEmitter Emitter(CGF);
LangAS AS = ArrayQTy.getAddressSpace();
if (CGM.getLangOpts().SYCLIsDevice && AS == LangAS::Default) {
// SYCL's default AS is 'generic', which can't be used to define constant
// initializer data in. It is reasonable to keep it in the same AS
// as string literals.
AS = CGM.getStringLiteralAddressSpace();
}
if (llvm::Constant *C = Emitter.tryEmitForInitializer(E, AS, ArrayQTy)) {
auto GV = new llvm::GlobalVariable(
CGM.getModule(), C->getType(),
Expand Down
34 changes: 34 additions & 0 deletions clang/test/CodeGenSYCL/local_var_big_init_as.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// RUN: %clang_cc1 -fsycl -fsycl-is-device -triple spir64-unknown-unknown-sycldevice \
// RUN: -emit-llvm -o - %s | FileCheck %s

// This test checks that data for big constant initializer lists is placed
// into the global address space by the SYCL compiler.

struct Test {
Test() : set{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
// CHECK-DAG: @constinit = private unnamed_addr addrspace(1) constant
// CHECK: [32 x i32]
// CHECK: [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7,
// CHECK: i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15,
// CHECK: i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7,
// CHECK: i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15
// CHECK ], align 4
// CHECK-NOT: @constinit = private unnamed_addr addrspace(0)
// CHECK-NOT: @constinit = private unnamed_addr addrspace(2)
// CHECK-NOT: @constinit = private unnamed_addr addrspace(3)
// CHECK-NOT: @constinit = private unnamed_addr addrspace(4)
} {};
int set[32];
};

__attribute__((sycl_device)) void bar(Test &x);

__attribute__((sycl_device)) void zoo(int *y) {
const int vec[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
Test mc;
bar(mc);
}