| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6 |
| // REQUIRES: amdgpu-registered-target |
| // RUN: %clang_cc1 -triple amdgcn-unknown-unknown -target-cpu verde -emit-llvm -o - %s | FileCheck %s |
| |
| typedef struct AA_ty { |
| int x; |
| __amdgpu_buffer_rsrc_t r; |
| } AA; |
| |
| AA getAA(void *p); |
| __amdgpu_buffer_rsrc_t getBufferImpl(void *p); |
| void consumeBuffer(__amdgpu_buffer_rsrc_t); |
| |
| // CHECK-LABEL: define dso_local ptr addrspace(8) @getBuffer( |
| // CHECK-SAME: ptr addrspace(5) noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[CALL:%.*]] = tail call ptr addrspace(8) @getBufferImpl(ptr addrspace(5) noundef [[P]]) #[[ATTR2:[0-9]+]] |
| // CHECK-NEXT: ret ptr addrspace(8) [[CALL]] |
| // |
| __amdgpu_buffer_rsrc_t getBuffer(void *p) { |
| return getBufferImpl(p); |
| } |
| |
| // CHECK-LABEL: define dso_local void @consumeBufferPtr( |
| // CHECK-SAME: ptr addrspace(5) noundef readonly captures(address) [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq ptr addrspace(5) [[P]], addrspacecast (ptr null to ptr addrspace(5)) |
| // CHECK-NEXT: br i1 [[TOBOOL_NOT]], label %[[IF_END:.*]], label %[[IF_THEN:.*]] |
| // CHECK: [[IF_THEN]]: |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(8), ptr addrspace(5) [[P]], align 16, !tbaa [[__AMDGPU_BUFFER_RSRC_T_TBAA4:![0-9]+]] |
| // CHECK-NEXT: tail call void @consumeBuffer(ptr addrspace(8) [[TMP0]]) #[[ATTR2]] |
| // CHECK-NEXT: br label %[[IF_END]] |
| // CHECK: [[IF_END]]: |
| // CHECK-NEXT: ret void |
| // |
| void consumeBufferPtr(__amdgpu_buffer_rsrc_t *p) { |
| if (p) |
| consumeBuffer(*p); |
| } |
| |
| // CHECK-LABEL: define dso_local void @test( |
| // CHECK-SAME: ptr addrspace(5) noundef readonly captures(address) [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(5) [[A]], align 16, !tbaa [[INT_TBAA8:![0-9]+]] |
| // CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0 |
| // CHECK-NEXT: [[TOBOOL_NOT_I:%.*]] = icmp eq ptr addrspace(5) [[A]], addrspacecast (ptr null to ptr addrspace(5)) |
| // CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TOBOOL_NOT]], i1 true, i1 [[TOBOOL_NOT_I]] |
| // CHECK-NEXT: br i1 [[OR_COND]], label %[[IF_END:.*]], label %[[IF_THEN_I:.*]] |
| // CHECK: [[IF_THEN_I]]: |
| // CHECK-NEXT: [[R:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(5) [[A]], i32 16 |
| // CHECK-NEXT: [[TMP1:%.*]] = load ptr addrspace(8), ptr addrspace(5) [[R]], align 16, !tbaa [[__AMDGPU_BUFFER_RSRC_T_TBAA4]] |
| // CHECK-NEXT: tail call void @consumeBuffer(ptr addrspace(8) [[TMP1]]) #[[ATTR2]] |
| // CHECK-NEXT: br label %[[IF_END]] |
| // CHECK: [[IF_END]]: |
| // CHECK-NEXT: ret void |
| // |
| void test(AA *a) { |
| if (a->x) |
| consumeBufferPtr(&(a->r)); |
| } |
| |
| // CHECK-LABEL: define dso_local %struct.AA_ty @bar( |
| // CHECK-SAME: ptr addrspace(5) noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: [[ENTRY:.*:]] |
| // 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]] |
| // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_AA_TY]] [[CALL]], 0 |
| // CHECK-NEXT: [[CALL_I:%.*]] = tail call ptr addrspace(8) @getBufferImpl(ptr addrspace(5) noundef [[P]]) #[[ATTR2]] |
| // CHECK-NEXT: [[TOBOOL_NOT_I:%.*]] = icmp eq i32 [[TMP0]], 0 |
| // CHECK-NEXT: br i1 [[TOBOOL_NOT_I]], label %[[TEST_EXIT:.*]], label %[[IF_THEN_I_I:.*]] |
| // CHECK: [[IF_THEN_I_I]]: |
| // CHECK-NEXT: tail call void @consumeBuffer(ptr addrspace(8) [[CALL_I]]) #[[ATTR2]] |
| // CHECK-NEXT: br label %[[TEST_EXIT]] |
| // CHECK: [[TEST_EXIT]]: |
| // CHECK-NEXT: [[DOTFCA_1_INSERT:%.*]] = insertvalue [[STRUCT_AA_TY]] [[CALL]], ptr addrspace(8) [[CALL_I]], 1 |
| // CHECK-NEXT: ret [[STRUCT_AA_TY]] [[DOTFCA_1_INSERT]] |
| // |
| AA bar(void *p) { |
| AA a = getAA(p); |
| a.r = getBuffer(p); |
| test(&a); |
| return a; |
| } |
| //. |
| // CHECK: [[__AMDGPU_BUFFER_RSRC_T_TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0} |
| // CHECK: [[META5]] = !{!"__amdgpu_buffer_rsrc_t", [[META6:![0-9]+]], i64 0} |
| // CHECK: [[META6]] = !{!"omnipotent char", [[META7:![0-9]+]], i64 0} |
| // CHECK: [[META7]] = !{!"Simple C/C++ TBAA"} |
| // CHECK: [[INT_TBAA8]] = !{[[META9:![0-9]+]], [[META10:![0-9]+]], i64 0} |
| // CHECK: [[META9]] = !{!"AA_ty", [[META10]], i64 0, [[META5]], i64 16} |
| // CHECK: [[META10]] = !{!"int", [[META6]], i64 0} |
| //. |