aboutsummaryrefslogtreecommitdiff
path: root/clang/test/CodeGenOpenCL/addr-space-struct-arg.cl
blob: 6ea0aff0a0746a68ab6f857379f9f490a50a9ccd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// RUN: %clang_cc1 %s -emit-llvm -o - -O0 -finclude-default-header -ffake-address-space-map -triple i686-pc-darwin | FileCheck -check-prefixes=COM,X86 %s
// RUN: %clang_cc1 %s -emit-llvm -o - -O0 -finclude-default-header -triple amdgcn-amdhsa-amd-amdgizcl | FileCheck -check-prefixes=COM,AMD %s

typedef struct {
  int cells[9];
} Mat3X3;

typedef struct {
  int cells[16];
} Mat4X4;

struct StructOneMember {
  int2 x;
};

struct StructTwoMember {
  int2 x;
  int2 y;
};

// COM-LABEL: define void @foo
Mat4X4 __attribute__((noinline)) foo(Mat3X3 in) {
  Mat4X4 out;
  return out;
}

// COM-LABEL: define {{.*}} void @ker
// Expect two mem copies: one for the argument "in", and one for
// the return value.
// X86: call void @llvm.memcpy.p0i8.p1i8.i32(i8*
// X86: call void @llvm.memcpy.p1i8.p0i8.i32(i8 addrspace(1)*
// AMD: call void @llvm.memcpy.p5i8.p1i8.i64(i8 addrspace(5)*
// AMD: call void @llvm.memcpy.p1i8.p5i8.i64(i8 addrspace(1)*
kernel void ker(global Mat3X3 *in, global Mat4X4 *out) {
  out[0] = foo(in[1]);
}

// AMD-LABEL: define void @FuncOneMember(%struct.StructOneMember addrspace(5)* byval align 8 %u)
void FuncOneMember(struct StructOneMember u) {
  u.x = (int2)(0, 0);
}

// AMD-LABEL: define amdgpu_kernel void @KernelOneMember
// AMD-SAME:  (<2 x i32> %[[u_coerce:.*]])
// AMD:  %[[u:.*]] = alloca %struct.StructOneMember, align 8, addrspace(5)
// AMD:  %[[coerce_dive:.*]] = getelementptr inbounds %struct.StructOneMember, %struct.StructOneMember addrspace(5)* %[[u]], i32 0, i32 0
// AMD:  store <2 x i32> %[[u_coerce]], <2 x i32> addrspace(5)* %[[coerce_dive]]
// AMD:  call void @FuncOneMember(%struct.StructOneMember addrspace(5)* byval align 8 %[[u]])
kernel void KernelOneMember(struct StructOneMember u) {
  FuncOneMember(u);
}

// AMD-LABEL: define void @FuncTwoMember(%struct.StructTwoMember addrspace(5)* byval align 8 %u)
void FuncTwoMember(struct StructTwoMember u) {
  u.x = (int2)(0, 0);
}

// AMD-LABEL: define amdgpu_kernel void @KernelTwoMember
// AMD-SAME:  (%struct.StructTwoMember %[[u_coerce:.*]])
// AMD:  %[[u:.*]] = alloca %struct.StructTwoMember, align 8, addrspace(5)
// AMD:  store %struct.StructTwoMember %[[u_coerce]], %struct.StructTwoMember addrspace(5)* %[[u]]
// AMD:  call void @FuncTwoMember(%struct.StructTwoMember addrspace(5)* byval align 8 %[[u]])
kernel void KernelTwoMember(struct StructTwoMember u) {
  FuncTwoMember(u);
}