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