2020-03-18 07:33:12 +08:00
|
|
|
// UNSUPPORTED: system-windows
|
[Clang] Undef attribute for global variables
Summary:
[Clang] Attribute to allow defining undef global variables
Initializing global variables is very cheap on hosted implementations. The
C semantics of zero initializing globals work very well there. It is not
necessarily cheap on freestanding implementations. Where there is no loader
available, code must be emitted near the start point to write the appropriate
values into memory.
At present, external variables can be declared in C++ and definitions provided
in assembly (or IR) to achive this effect. This patch provides an attribute in
order to remove this reason for writing assembly for performance sensitive
freestanding implementations.
A close analogue in tree is LDS memory for amdgcn, where the kernel is
responsible for initializing the memory after it starts executing on the gpu.
Uninitalized variables in LDS are observably cheaper than zero initialized.
Patch is loosely based on the cuda __shared__ and opencl __local variable
implementation which also produces undef global variables.
Reviewers: kcc, rjmccall, rsmith, glider, vitalybuka, pcc, eugenis, vlad.tsyrklevich, jdoerfert, gregrodgers, jfb, aaron.ballman
Reviewed By: rjmccall, aaron.ballman
Subscribers: Anastasia, aaron.ballman, davidb, Quuxplusone, dexonsmith, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D74361
2020-03-18 05:22:04 +08:00
|
|
|
// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
|
|
|
|
|
|
|
|
// CHECK: @defn = global i32 undef
|
|
|
|
int defn [[clang::loader_uninitialized]];
|
|
|
|
|
|
|
|
// CHECK: @_ZL11defn_static = internal global i32 undef
|
|
|
|
static int defn_static [[clang::loader_uninitialized]] __attribute__((used));
|
|
|
|
|
|
|
|
// CHECK: @_ZZ4funcvE4data = internal global i32 undef
|
|
|
|
int* func(void)
|
|
|
|
{
|
|
|
|
static int data [[clang::loader_uninitialized]];
|
|
|
|
return &data;
|
|
|
|
}
|
|
|
|
|
|
|
|
class trivial
|
|
|
|
{
|
|
|
|
float x;
|
|
|
|
};
|
|
|
|
|
|
|
|
// CHECK: @ut = global %class.trivial undef
|
|
|
|
trivial ut [[clang::loader_uninitialized]];
|
|
|
|
|
2020-03-18 06:14:40 +08:00
|
|
|
// CHECK: @arr = global [32 x double] undef
|
[Clang] Undef attribute for global variables
Summary:
[Clang] Attribute to allow defining undef global variables
Initializing global variables is very cheap on hosted implementations. The
C semantics of zero initializing globals work very well there. It is not
necessarily cheap on freestanding implementations. Where there is no loader
available, code must be emitted near the start point to write the appropriate
values into memory.
At present, external variables can be declared in C++ and definitions provided
in assembly (or IR) to achive this effect. This patch provides an attribute in
order to remove this reason for writing assembly for performance sensitive
freestanding implementations.
A close analogue in tree is LDS memory for amdgcn, where the kernel is
responsible for initializing the memory after it starts executing on the gpu.
Uninitalized variables in LDS are observably cheaper than zero initialized.
Patch is loosely based on the cuda __shared__ and opencl __local variable
implementation which also produces undef global variables.
Reviewers: kcc, rjmccall, rsmith, glider, vitalybuka, pcc, eugenis, vlad.tsyrklevich, jdoerfert, gregrodgers, jfb, aaron.ballman
Reviewed By: rjmccall, aaron.ballman
Subscribers: Anastasia, aaron.ballman, davidb, Quuxplusone, dexonsmith, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D74361
2020-03-18 05:22:04 +08:00
|
|
|
double arr[32] __attribute__((loader_uninitialized));
|
|
|
|
|
|
|
|
// Defining as arr2[] [[clang..]] raises the error: attribute cannot be applied to types
|
2020-03-18 06:14:40 +08:00
|
|
|
// CHECK: @arr2 = global [4 x double] undef
|
[Clang] Undef attribute for global variables
Summary:
[Clang] Attribute to allow defining undef global variables
Initializing global variables is very cheap on hosted implementations. The
C semantics of zero initializing globals work very well there. It is not
necessarily cheap on freestanding implementations. Where there is no loader
available, code must be emitted near the start point to write the appropriate
values into memory.
At present, external variables can be declared in C++ and definitions provided
in assembly (or IR) to achive this effect. This patch provides an attribute in
order to remove this reason for writing assembly for performance sensitive
freestanding implementations.
A close analogue in tree is LDS memory for amdgcn, where the kernel is
responsible for initializing the memory after it starts executing on the gpu.
Uninitalized variables in LDS are observably cheaper than zero initialized.
Patch is loosely based on the cuda __shared__ and opencl __local variable
implementation which also produces undef global variables.
Reviewers: kcc, rjmccall, rsmith, glider, vitalybuka, pcc, eugenis, vlad.tsyrklevich, jdoerfert, gregrodgers, jfb, aaron.ballman
Reviewed By: rjmccall, aaron.ballman
Subscribers: Anastasia, aaron.ballman, davidb, Quuxplusone, dexonsmith, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D74361
2020-03-18 05:22:04 +08:00
|
|
|
double arr2 [[clang::loader_uninitialized]] [4];
|
2020-08-20 01:11:34 +08:00
|
|
|
|
|
|
|
template<typename T> struct templ{T * t;};
|
|
|
|
|
|
|
|
// CHECK: @templ_int = global %struct.templ undef, align 8
|
|
|
|
templ<int> templ_int [[clang::loader_uninitialized]];
|
|
|
|
|
|
|
|
// CHECK: @templ_trivial = global %struct.templ.0 undef, align 8
|
|
|
|
templ<trivial> templ_trivial [[clang::loader_uninitialized]];
|
|
|
|
|
|
|
|
// CHECK: @templ_incomplete = global %struct.templ.1 undef, align 8
|
|
|
|
struct incomplete;
|
|
|
|
templ<incomplete> templ_incomplete [[clang::loader_uninitialized]];
|