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
3 changes: 1 addition & 2 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1288,8 +1288,7 @@ void CodeGenModule::EmitCtorList(CtorList &Fns, const char *GlobalName) {
ctor.addInt(Int32Ty, I.Priority);
ctor.add(llvm::ConstantExpr::getBitCast(I.Initializer, CtorPFTy));
if (I.AssociatedData)
ctor.add(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
I.AssociatedData, VoidPtrTy));
ctor.add(llvm::ConstantExpr::getBitCast(I.AssociatedData, VoidPtrTy));
else
ctor.addNullPointer(VoidPtrTy);
ctor.finishAndAddTo(ctors);
Expand Down
5 changes: 4 additions & 1 deletion clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5255,7 +5255,10 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
// Do not explicitly emit non-const static data member definitions
// on SYCL device.
if (!SemaRef.getLangOpts().SYCLIsDevice || !Var->isStaticDataMember() ||
Var->isConstexpr() || Var->getType().isConstQualified())
Var->isConstexpr() ||
(Var->getType().isConstQualified() && Var->getInit() &&
Var->getInit()->isConstantInitializer(SemaRef.getASTContext(),
false)))
Consumer.HandleCXXStaticMemberVarInstantiation(Var);
}
} PassToConsumerRAII(*this, Consumer, Var);
Expand Down
91 changes: 91 additions & 0 deletions clang/test/CodeGenSYCL/sycl-device-const-sdm.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// RUN: %clang_cc1 -fsycl -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s
// Tests that static data members that are not constant-initialized are not
// emitted in device code.

// CHECK:%struct._ZTS1B.B = type { i8 }
// CHECK:%struct._ZTS1C.C = type { i32, i32 }
// CHECK:%struct._ZTS1D.D = type { i8 }
// CHECK:$_ZN2TTIiE2c1E = comdat any
// CHECK:$_ZN2TTIiE2d1E = comdat any
// CHECK:$_ZN2TTIiE4var1E = comdat any
// CHECK:$_ZN2TTIiE4var3E = comdat any
// CHECK:@_ZN1S2b1E = addrspace(1) global %struct._ZTS1B.B zeroinitializer, align 1
// CHECK:@_ZN1S2c1E = addrspace(1) constant %struct._ZTS1C.C { i32 2, i32 5 }, align 4
// CHECK:@_ZN1S2d1E = addrspace(1) constant %struct._ZTS1D.D zeroinitializer, align 1
// CHECK:@_ZN1S4var1E = addrspace(1) constant i32 1, align 4
// CHECK:@_ZN1S4var2E = available_externally addrspace(1) constant i32 3, align 4
// CHECK:@_ZN1S4var3E = addrspace(1) constant i32 4, align 4
// CHECK:@_ZN2TTIiE2b1E = external addrspace(1) global %struct._ZTS1B.B, align 1
// CHECK:@_ZN2TTIiE2c1E = linkonce_odr addrspace(1) constant %struct._ZTS1C.C { i32 2, i32 5 }, comdat, align 4
// CHECK:@_ZN2TTIiE2d1E = linkonce_odr addrspace(1) constant %struct._ZTS1D.D zeroinitializer, comdat, align 1
// CHECK:@_ZN2TTIiE4var1E = linkonce_odr addrspace(1) constant i32 1, comdat, align 4
// CHECK:@_ZN2TTIiE4var2E = available_externally addrspace(1) constant i32 3, align 4
// CHECK:@_ZN2TTIiE4var3E = linkonce_odr addrspace(1) constant i32 4, comdat, align 4
// CHECK:@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535
// CHECK-NOT: addrspacecast
// CHECK: define spir_kernel void @_ZTSZ4mainE11fake_kernel()

struct TestBaseType {};
struct B {
B();
};
struct C {
int i, j;
};
struct D {
};

struct S {
static const B b1;
static const int var1;
static constexpr const int var2 = 3;
static const int var3;
static const C c1;
static const D d1;
};
const B S::b1;
const C S::c1{2, 5};
const int S::var1 = 1;
const int S::var3 = 1 + 3;
const D S::d1;

template <typename T>
struct TT {
static const B b1;
static const int var1;
static constexpr const int var2 = 3;
static const int var3;
static const C c1;
static const D d1;
};
template <typename T>
const B TT<T>::b1;
template <typename T>
const C TT<T>::c1{2, 5};
template <typename T>
const int TT<T>::var1 = 1;
template <typename T>
const int TT<T>::var3 = 1 + 3;
template <typename T>
const D TT<T>::d1;

template <typename name, typename Func>
__attribute__((sycl_kernel)) void kernel_single_task(Func kernelFunc) {
kernelFunc();
(void)S::b1;
(void)S::c1;
(void)S::d1;
(void)S::var1;
(void)S::var2;
(void)S::var3;
(void)TT<int>::b1;
(void)TT<int>::c1;
(void)TT<int>::d1;
(void)TT<int>::var1;
(void)TT<int>::var2;
(void)TT<int>::var3;
}
int main() {
kernel_single_task<class fake_kernel>([=]() {});
return 0;
}
3 changes: 1 addition & 2 deletions clang/test/CodeGenSYCL/sycl-device-static-init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
// CHECK: %struct._ZTS16RegisterBaseInit.RegisterBaseInit = type { i8 }
// CHECK-NOT: $_ZN8BaseInitI12TestBaseTypeE15s_regbase_ncsdmE = comdat any
// CHECK: $_ZN8BaseInitI12TestBaseTypeE3varE = comdat any
// CHECK: @_ZN8BaseInitI12TestBaseTypeE3varE = weak_odr addrspace(1) constant i32 9, comdat, align 4
// CHECK: @_ZN8BaseInitI12TestBaseTypeE9s_regbaseE = {{.*}} global %struct._ZTS16RegisterBaseInit.RegisterBaseInit
// CHECK-NOT: @_ZN8BaseInitI12TestBaseTypeE15s_regbase_ncsdmE = weak_odr addrspace(1) global %struct._ZTS16RegisterBaseInit.RegisterBaseInit zeroinitializer, comdat, align 1
// CHECK: @_ZN8BaseInitI12TestBaseTypeE3varE = weak_odr addrspace(1) constant i32 9, comdat, align 4
// CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @__cxx_global_var_init, i8* addrspacecast (i8 addrspace(1)* getelementptr inbounds (%struct._ZTS16RegisterBaseInit.RegisterBaseInit, %struct._ZTS16RegisterBaseInit.RegisterBaseInit addrspace(1)* @_ZN8BaseInitI12TestBaseTypeE9s_regbaseE, i32 0, i32 0) to i8*) }]
// CHECK-NOT: @_ZGVN8BaseInitI12TestBaseTypeE15s_regbase_ncsdmE = weak_odr global i64 0, comdat($_ZN8BaseInitI12TestBaseTypeE9s_regbaseE), align 8
// CHECK: define spir_kernel void @_ZTSZ4mainE11fake_kernel()
// CHECK: call spir_func void @"_ZZ4mainENK3$_0clE16RegisterBaseInit
Expand Down