xref: /llvm-project/clang/test/CodeGenOpenCL/amdgcn-buffer-rsrc-type.cl (revision 94473f4db6a6f5f12d7c4081455b5b596094eac5)
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature
2 // REQUIRES: amdgpu-registered-target
3 // RUN: %clang_cc1 -triple amdgcn-unknown-unknown -target-cpu verde -emit-llvm -o - %s | FileCheck %s
4
5typedef struct AA_ty {
6  int x;
7  __amdgpu_buffer_rsrc_t r;
8} AA;
9
10AA getAA(void *p);
11__amdgpu_buffer_rsrc_t getBufferImpl(void *p);
12void consumeBuffer(__amdgpu_buffer_rsrc_t);
13
14// CHECK-LABEL: define {{[^@]+}}@getBuffer
15// CHECK-SAME: (ptr addrspace(5) noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
16// CHECK-NEXT:  entry:
17// CHECK-NEXT:    [[CALL:%.*]] = tail call ptr addrspace(8) @getBufferImpl(ptr addrspace(5) noundef [[P]]) #[[ATTR2:[0-9]+]]
18// CHECK-NEXT:    ret ptr addrspace(8) [[CALL]]
19//
20__amdgpu_buffer_rsrc_t getBuffer(void *p) {
21  return getBufferImpl(p);
22}
23
24// CHECK-LABEL: define {{[^@]+}}@consumeBufferPtr
25// CHECK-SAME: (ptr addrspace(5) noundef readonly [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
26// CHECK-NEXT:  entry:
27// CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq ptr addrspace(5) [[P]], addrspacecast (ptr null to ptr addrspace(5))
28// CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
29// CHECK:       if.then:
30// CHECK-NEXT:    [[TMP0:%.*]] = load ptr addrspace(8), ptr addrspace(5) [[P]], align 16, !tbaa [[TBAA4:![0-9]+]]
31// CHECK-NEXT:    tail call void @consumeBuffer(ptr addrspace(8) [[TMP0]]) #[[ATTR2]]
32// CHECK-NEXT:    br label [[IF_END]]
33// CHECK:       if.end:
34// CHECK-NEXT:    ret void
35//
36void consumeBufferPtr(__amdgpu_buffer_rsrc_t *p) {
37  if (p)
38    consumeBuffer(*p);
39}
40
41// CHECK-LABEL: define {{[^@]+}}@test
42// CHECK-SAME: (ptr addrspace(5) noundef readonly [[A:%.*]]) local_unnamed_addr #[[ATTR0]] {
43// CHECK-NEXT:  entry:
44// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr addrspace(5) [[A]], align 16, !tbaa [[TBAA8:![0-9]+]]
45// CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
46// CHECK-NEXT:    [[TOBOOL_NOT_I:%.*]] = icmp eq ptr addrspace(5) [[A]], addrspacecast (ptr null to ptr addrspace(5))
47// CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[TOBOOL_NOT_I]], [[TOBOOL_NOT]]
48// CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_THEN_I:%.*]]
49// CHECK:       if.then.i:
50// CHECK-NEXT:    [[R:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(5) [[A]], i32 16
51// CHECK-NEXT:    [[TMP1:%.*]] = load ptr addrspace(8), ptr addrspace(5) [[R]], align 16, !tbaa [[TBAA4]]
52// CHECK-NEXT:    tail call void @consumeBuffer(ptr addrspace(8) [[TMP1]]) #[[ATTR2]]
53// CHECK-NEXT:    br label [[IF_END]]
54// CHECK:       if.end:
55// CHECK-NEXT:    ret void
56//
57void test(AA *a) {
58  if (a->x)
59    consumeBufferPtr(&(a->r));
60}
61
62// CHECK-LABEL: define {{[^@]+}}@bar
63// CHECK-SAME: (ptr addrspace(5) noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
64// CHECK-NEXT:  entry:
65// CHECK-NEXT:    [[CALL:%.*]] = tail call [[STRUCT_AA_TY:%.*]] @[[GETAA:[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*]](ptr addrspace(5) noundef [[P]]) #[[ATTR2]]
66// CHECK-NEXT:    [[TMP0:%.*]] = extractvalue [[STRUCT_AA_TY]] [[CALL]], 0
67// CHECK-NEXT:    [[CALL_I:%.*]] = tail call ptr addrspace(8) @getBufferImpl(ptr addrspace(5) noundef [[P]]) #[[ATTR2]]
68// CHECK-NEXT:    [[TOBOOL_NOT_I:%.*]] = icmp eq i32 [[TMP0]], 0
69// CHECK-NEXT:    br i1 [[TOBOOL_NOT_I]], label [[TEST_EXIT:%.*]], label [[IF_THEN_I_I:%.*]]
70// CHECK:       if.then.i.i:
71// CHECK-NEXT:    tail call void @consumeBuffer(ptr addrspace(8) [[CALL_I]]) #[[ATTR2]]
72// CHECK-NEXT:    br label [[TEST_EXIT]]
73// CHECK:       test.exit:
74// CHECK-NEXT:    [[DOTFCA_1_INSERT:%.*]] = insertvalue [[STRUCT_AA_TY]] [[CALL]], ptr addrspace(8) [[CALL_I]], 1
75// CHECK-NEXT:    ret [[STRUCT_AA_TY]] [[DOTFCA_1_INSERT]]
76//
77AA bar(void *p) {
78  AA a = getAA(p);
79  a.r = getBuffer(p);
80  test(&a);
81  return a;
82}
83