This fixes the prioritization of address spaces when choosing a constructor, stopping them from being considered equally good, which made the construction of types that could be constructed by more than one of the constructors. It does this by preferring the most specific address space, which is decided by seeing if one of the address spaces is a superset of the other, and preferring the other. Fixes: PR50329 Reviewed By: Anastasia Differential Revision: https://reviews.llvm.org/D102850
41 lines
1.2 KiB
Plaintext
41 lines
1.2 KiB
Plaintext
// RUN: %clang_cc1 %s -emit-llvm -o - -O0 -triple spir-unknown-unknown | FileCheck %s
|
|
|
|
// CHECK: %struct.X = type { i32 }
|
|
|
|
// CHECK: @ci ={{.*}} addrspace(2) constant i32 0
|
|
// CHECK: @gi ={{.*}} addrspace(1) global i32 0
|
|
__constant int ci = 0;
|
|
__global int gi = 0;
|
|
|
|
struct X {
|
|
int x;
|
|
|
|
// Local variables are handled in local_addrspace_init.clcpp
|
|
X() /*__generic*/ : x(0) {}
|
|
X() __private : x(0) {}
|
|
X() __global : x(0) {}
|
|
constexpr X() __constant : x(0) {}
|
|
constexpr X(int x) __constant : x(x) {}
|
|
};
|
|
|
|
// CHECK: @cx1 ={{.*}} addrspace(2) constant %struct.X zeroinitializer
|
|
// CHECK: @cx2 ={{.*}} addrspace(2) constant %struct.X { i32 1 }
|
|
// CHECK: @gx ={{.*}} addrspace(1) global %struct.X zeroinitializer
|
|
__constant X cx1;
|
|
__constant X cx2(1);
|
|
__global X gx;
|
|
|
|
// CHECK: @_ZZ1kE3cx1 = internal addrspace(2) constant %struct.X zeroinitializer
|
|
// CHECK: @_ZZ1kE3cx2 = internal addrspace(2) constant %struct.X { i32 1 }
|
|
|
|
kernel void k() {
|
|
// Check that the constructor for px calls the __private constructor.
|
|
// CHECK: %px = alloca %struct.X
|
|
// CHECK-NEXT: call spir_func void @_ZN1XC1Ev(%struct.X* {{.*}}%px)
|
|
__private X px;
|
|
|
|
__constant X cx1;
|
|
__constant X cx2(1);
|
|
// CHECK-NEXT: ret void
|
|
}
|