| Matt Arsenault | 607a756 | 2017-11-28 23:40:12 +0000 | [diff] [blame] | 1 | ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -enable-ipra=0 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,VI %s |
| 2 | ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -enable-ipra=0 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CI %s |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 3 | |
| 4 | %struct.ByValStruct = type { [4 x i32] } |
| 5 | |
| 6 | ; GCN-LABEL: {{^}}void_func_byval_struct: |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 7 | ; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s32{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 8 | ; GCN-NOT: s32 |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 9 | ; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 10 | ; GCN-NOT: s32 |
| 11 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 12 | ; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s32 offset:16{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 13 | ; GCN-NOT: s32 |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 14 | ; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 15 | ; GCN-NOT: s32 |
| Scott Linder | afc24ed | 2019-02-01 21:23:28 +0000 | [diff] [blame] | 16 | define hidden void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg1) #1 { |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 17 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 18 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 19 | %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 20 | %add = add nsw i32 %tmp, 1 |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 21 | store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 4 |
| 22 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 23 | %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 24 | %add3 = add nsw i32 %tmp1, 2 |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 25 | store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 26 | store volatile i32 9, i32 addrspace(1)* null, align 4 |
| 27 | ret void |
| 28 | } |
| 29 | |
| 30 | ; GCN-LABEL: {{^}}void_func_byval_struct_non_leaf: |
| 31 | ; GCN: s_mov_b32 s5, s32 |
| Matt Arsenault | 3d59e38 | 2019-05-24 18:18:51 +0000 | [diff] [blame] | 32 | ; GCN: s_add_u32 s32, s32, 0xc00{{$}} |
| Matt Arsenault | 8e8f8f4 | 2017-08-02 01:52:45 +0000 | [diff] [blame] | 33 | ; GCN-DAG: buffer_store_dword v32 |
| 34 | ; GCN-DAG: buffer_store_dword v33 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 35 | ; GCN-NOT: v_writelane_b32 v{{[0-9]+}}, s32 |
| Tim Renouf | 2a99fa2 | 2018-02-28 19:10:32 +0000 | [diff] [blame] | 36 | ; GCN-DAG: v_writelane_b32 |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 37 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s5{{$}} |
| Tim Renouf | 2a99fa2 | 2018-02-28 19:10:32 +0000 | [diff] [blame] | 38 | ; GCN-DAG: v_add_{{[iu]}}32_e32 [[ADD0:v[0-9]+]], vcc, 1, [[LOAD0]] |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 39 | ; GCN-DAG: buffer_store_dword [[ADD0]], off, s[0:3], s5{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 40 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 41 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s5 offset:16{{$}} |
| Tim Renouf | 2a99fa2 | 2018-02-28 19:10:32 +0000 | [diff] [blame] | 42 | ; GCN-DAG: v_add_{{[iu]}}32_e32 [[ADD1:v[0-9]+]], vcc, 2, [[LOAD1]] |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 43 | |
| 44 | ; GCN: s_swappc_b64 |
| 45 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 46 | ; GCN: buffer_store_dword [[ADD1]], off, s[0:3], s5 offset:16{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 47 | |
| 48 | ; GCN: v_readlane_b32 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 49 | ; GCN-NOT: v_readlane_b32 s32 |
| Matt Arsenault | dcdf3dd | 2018-11-26 17:17:07 +0000 | [diff] [blame] | 50 | ; GCN-DAG: buffer_load_dword v32, |
| 51 | ; GCN-DAG: buffer_load_dword v33, |
| Matt Arsenault | ffb132e | 2018-03-29 20:22:04 +0000 | [diff] [blame] | 52 | ; GCN: s_sub_u32 s32, s32, 0xc00{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 53 | ; GCN: s_setpc_b64 |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 54 | define void @void_func_byval_struct_non_leaf(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg1) #1 { |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 55 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 56 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 57 | %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 58 | %add = add nsw i32 %tmp, 1 |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 59 | store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 4 |
| 60 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 61 | %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 62 | %add3 = add nsw i32 %tmp1, 2 |
| 63 | call void @external_void_func_void() |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 64 | store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 65 | store volatile i32 9, i32 addrspace(1)* null, align 4 |
| 66 | ret void |
| 67 | } |
| 68 | |
| 69 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_func: |
| 70 | ; GCN: s_mov_b32 s5, s32 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 71 | ; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}} |
| 72 | ; GCN-DAG: v_writelane_b32 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 73 | |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 74 | ; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 75 | ; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| 76 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 77 | ; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s5{{$}} |
| 78 | ; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s5 offset:16 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 79 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 80 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s5{{$}} |
| 81 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s5 offset:4 |
| 82 | ; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s5 offset:8 |
| 83 | ; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s5 offset:12 |
| Matt Arsenault | 99e6f4d | 2019-05-16 15:10:27 +0000 | [diff] [blame] | 84 | |
| 85 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| 86 | |
| 87 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 88 | ; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 89 | ; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 90 | ; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 91 | ; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12 |
| Matt Arsenault | 99e6f4d | 2019-05-16 15:10:27 +0000 | [diff] [blame] | 92 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 93 | ; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s5 offset:16 |
| 94 | ; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s5 offset:20 |
| 95 | ; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s5 offset:24 |
| 96 | ; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s5 offset:28 |
| Matt Arsenault | f432011 | 2018-09-24 13:18:15 +0000 | [diff] [blame] | 97 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 98 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 99 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 100 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 101 | ; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28 |
| Matt Arsenault | f432011 | 2018-09-24 13:18:15 +0000 | [diff] [blame] | 102 | |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 103 | ; GCN: s_swappc_b64 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 104 | ; GCN-NOT: v_readlane_b32 s32 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 105 | ; GCN: v_readlane_b32 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 106 | ; GCN-NOT: v_readlane_b32 s32 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 107 | |
| Matt Arsenault | defe371 | 2017-09-14 17:37:40 +0000 | [diff] [blame] | 108 | ; GCN-NOT: s_sub_u32 s32, s32, 0x800 |
| 109 | |
| 110 | ; GCN: s_sub_u32 s32, s32, 0xc00{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 111 | ; GCN-NEXT: s_waitcnt |
| 112 | ; GCN-NEXT: s_setpc_b64 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 113 | define void @call_void_func_byval_struct_func() #1 { |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 114 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 115 | %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 116 | %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 117 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 118 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 119 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 120 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 121 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 122 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4 |
| 123 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 124 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4 |
| 125 | call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1) |
| 126 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 127 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 128 | ret void |
| 129 | } |
| 130 | |
| 131 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel: |
| Geoff Berry | 4e38e02 | 2017-08-17 04:04:11 +0000 | [diff] [blame] | 132 | ; GCN: s_mov_b32 s33, s7 |
| Matt Arsenault | ffb132e | 2018-03-29 20:22:04 +0000 | [diff] [blame] | 133 | ; GCN: s_add_u32 s32, s33, 0xc00{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 134 | |
| 135 | ; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 136 | ; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| Geoff Berry | 4e38e02 | 2017-08-17 04:04:11 +0000 | [diff] [blame] | 137 | ; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8 |
| 138 | ; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 139 | |
| Matt Arsenault | defe371 | 2017-09-14 17:37:40 +0000 | [diff] [blame] | 140 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 141 | |
| Geoff Berry | 4e38e02 | 2017-08-17 04:04:11 +0000 | [diff] [blame] | 142 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8 |
| 143 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12 |
| 144 | ; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16 |
| 145 | ; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s33 offset:20 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 146 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 147 | ; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 148 | ; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 149 | ; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 150 | ; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 151 | |
| Matt Arsenault | acc5e82 | 2017-08-02 00:43:42 +0000 | [diff] [blame] | 152 | ; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24 |
| 153 | ; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28 |
| 154 | ; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32 |
| 155 | ; GCN-DAG: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s33 offset:36 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 156 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 157 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 158 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 159 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 160 | ; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 161 | |
| 162 | |
| 163 | ; GCN: s_swappc_b64 |
| Matt Arsenault | defe371 | 2017-09-14 17:37:40 +0000 | [diff] [blame] | 164 | ; GCN-NOT: s_sub_u32 s32 |
| 165 | ; GCN: s_endpgm |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 166 | define amdgpu_kernel void @call_void_func_byval_struct_kernel() #1 { |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 167 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 168 | %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 169 | %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 170 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 171 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 172 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 173 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 174 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 175 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4 |
| 176 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 177 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4 |
| 178 | call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1) |
| 179 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 180 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 181 | ret void |
| 182 | } |
| 183 | |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 184 | ; GCN-LABEL: {{^}}void_func_byval_struct_align8: |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 185 | ; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s32{{$}} |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 186 | ; GCN-NOT: s32 |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 187 | ; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 188 | ; GCN-NOT: s32 |
| 189 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 190 | ; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s32 offset:16{{$}} |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 191 | ; GCN-NOT: s32 |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 192 | ; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}} |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 193 | ; GCN-NOT: s32 |
| Scott Linder | afc24ed | 2019-02-01 21:23:28 +0000 | [diff] [blame] | 194 | define hidden void @void_func_byval_struct_align8(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 8 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 8 %arg1) #1 { |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 195 | entry: |
| 196 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 197 | %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 8 |
| 198 | %add = add nsw i32 %tmp, 1 |
| 199 | store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 8 |
| 200 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 201 | %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 8 |
| 202 | %add3 = add nsw i32 %tmp1, 2 |
| 203 | store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 8 |
| 204 | store volatile i32 9, i32 addrspace(1)* null, align 4 |
| 205 | ret void |
| 206 | } |
| 207 | |
| 208 | ; Make sure the byval alignment is respected in the call frame setup |
| 209 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_kernel: |
| 210 | ; GCN: s_mov_b32 s33, s7 |
| 211 | ; GCN: s_add_u32 s32, s33, 0xc00{{$}} |
| 212 | |
| 213 | ; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 214 | ; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| 215 | ; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8 |
| 216 | ; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24 |
| 217 | |
| 218 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| 219 | |
| 220 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8 |
| 221 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12 |
| 222 | ; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16 |
| 223 | ; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s33 offset:20 |
| 224 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 225 | ; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 226 | ; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 227 | ; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 228 | ; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 229 | |
| 230 | ; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24 |
| 231 | ; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28 |
| 232 | ; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32 |
| 233 | ; GCN-DAG: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s33 offset:36 |
| 234 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 235 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 236 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 237 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 238 | ; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 239 | |
| 240 | |
| 241 | ; GCN: s_swappc_b64 |
| 242 | ; GCN-NOT: s_sub_u32 s32 |
| 243 | ; GCN: s_endpgm |
| 244 | define amdgpu_kernel void @call_void_func_byval_struct_align8_kernel() #1 { |
| 245 | entry: |
| 246 | %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 247 | %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 248 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 249 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 250 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 251 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 252 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 253 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8 |
| 254 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 255 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8 |
| 256 | call void @void_func_byval_struct_align8(%struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg1) |
| 257 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 258 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 259 | ret void |
| 260 | } |
| 261 | |
| 262 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_func: |
| 263 | ; GCN: s_mov_b32 s5, s32 |
| 264 | ; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}} |
| 265 | ; GCN-DAG: v_writelane_b32 |
| 266 | |
| 267 | ; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 268 | ; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| 269 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 270 | ; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s5{{$}} |
| 271 | ; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s5 offset:16 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 272 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 273 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s5{{$}} |
| 274 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s5 offset:4 |
| 275 | ; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s5 offset:8 |
| 276 | ; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s5 offset:12 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 277 | |
| 278 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| 279 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 280 | ; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 281 | ; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 282 | ; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 283 | ; GCN-DAG: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 284 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame^] | 285 | ; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s5 offset:16 |
| 286 | ; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s5 offset:20 |
| 287 | ; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s5 offset:24 |
| 288 | ; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s5 offset:28 |
| 289 | ; GCN: s_waitcnt vmcnt(0) |
| 290 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 291 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 292 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 293 | ; GCN-DAG: buffer_store_dword [[LOAD7]], off, s[0:3], s32 offset:28 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 294 | |
| 295 | ; GCN: s_swappc_b64 |
| 296 | ; GCN-NOT: v_readlane_b32 s32 |
| 297 | ; GCN: v_readlane_b32 |
| 298 | ; GCN-NOT: v_readlane_b32 s32 |
| 299 | |
| 300 | ; GCN-NOT: s_sub_u32 s32, s32, 0x800 |
| 301 | |
| 302 | ; GCN: s_sub_u32 s32, s32, 0xc00{{$}} |
| 303 | ; GCN-NEXT: s_waitcnt |
| 304 | ; GCN-NEXT: s_setpc_b64 |
| 305 | define void @call_void_func_byval_struct_align8_func() #0 { |
| 306 | entry: |
| 307 | %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 308 | %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 309 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 310 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 311 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 312 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 313 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 314 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8 |
| 315 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 316 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8 |
| 317 | call void @void_func_byval_struct_align8(%struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 8 %arg1) |
| 318 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 319 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 320 | ret void |
| 321 | } |
| 322 | |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 323 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel_no_frame_pointer_elim: |
| 324 | define amdgpu_kernel void @call_void_func_byval_struct_kernel_no_frame_pointer_elim() #2 { |
| 325 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 326 | %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 327 | %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 328 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 329 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 330 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 331 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 332 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 333 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4 |
| 334 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 335 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4 |
| 336 | call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1) |
| 337 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 338 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 339 | ret void |
| 340 | } |
| 341 | |
| 342 | declare void @external_void_func_void() #0 |
| 343 | |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 344 | declare void @llvm.lifetime.start.p5i8(i64, i8 addrspace(5)* nocapture) #3 |
| 345 | declare void @llvm.lifetime.end.p5i8(i64, i8 addrspace(5)* nocapture) #3 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 346 | |
| 347 | attributes #0 = { nounwind } |
| 348 | attributes #1 = { noinline norecurse nounwind } |
| 349 | attributes #2 = { nounwind norecurse "no-frame-pointer-elim"="true" } |