mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 23:46:05 +00:00

Currently, `__constant__` variables do not get unconditionally marked as `constant` in IR, which seems a bit odd given their definition. This is generally inconsequential for NVPTX/AMDGPU, since said variables get emitted in the constant address space for those BEs. However, it is potentially significant for e.g. HIP-on-SPIR-V cases, as SPIR-V does not allow casts to/from the constant AS (`UniformConstant`), which forces `__constant__` variables to be emitted in the global AS, thus making IR constness meaningful.
51 lines
1.7 KiB
Plaintext
51 lines
1.7 KiB
Plaintext
// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -fcuda-is-device \
|
|
// RUN: -emit-llvm -o - -x hip %s | FileCheck -check-prefix=DEV %s
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-gnu-linux -std=c++11 \
|
|
// RUN: -emit-llvm -o - -x hip %s | FileCheck -check-prefix=HOST %s
|
|
|
|
// Negative tests.
|
|
|
|
// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -fcuda-is-device \
|
|
// RUN: -emit-llvm -o - -x hip %s | FileCheck -check-prefix=DEV-NEG %s
|
|
|
|
#include "Inputs/cuda.h"
|
|
|
|
template <class T>
|
|
class A {
|
|
static int h_member;
|
|
__device__ static int d_member;
|
|
__constant__ static int c_member;
|
|
__managed__ static int m_member;
|
|
const static int const_member = 0;
|
|
};
|
|
|
|
template <class T>
|
|
int A<T>::h_member;
|
|
|
|
template <class T>
|
|
__device__ int A<T>::d_member;
|
|
|
|
template <class T>
|
|
__constant__ int A<T>::c_member;
|
|
|
|
template <class T>
|
|
__managed__ int A<T>::m_member;
|
|
|
|
template <class T>
|
|
const int A<T>::const_member;
|
|
|
|
template class A<int>;
|
|
|
|
//DEV-DAG: @_ZN1AIiE8d_memberE = internal addrspace(1) global i32 0, comdat, align 4
|
|
//DEV-DAG: @_ZN1AIiE8c_memberE = internal addrspace(4) constant i32 0, comdat, align 4
|
|
//DEV-DAG: @_ZN1AIiE8m_memberE = internal addrspace(1) externally_initialized global ptr addrspace(1) null
|
|
//DEV-DAG: @_ZN1AIiE12const_memberE = internal addrspace(4) constant i32 0, comdat, align 4
|
|
//DEV-NEG-NOT: @_ZN1AIiE8h_memberE
|
|
|
|
//HOST-DAG: @_ZN1AIiE8h_memberE = weak_odr global i32 0, comdat, align 4
|
|
//HOST-DAG: @_ZN1AIiE8d_memberE = internal global i32 undef, comdat, align 4
|
|
//HOST-DAG: @_ZN1AIiE8c_memberE = internal global i32 undef, comdat, align 4
|
|
//HOST-DAG: @_ZN1AIiE8m_memberE = internal externally_initialized global ptr null
|
|
//HOST-DAG: @_ZN1AIiE12const_memberE = weak_odr constant i32 0, comdat, align 4
|