| 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 | |
| Matt Arsenault | 60957cb | 2019-06-24 14:53:56 +0000 | [diff] [blame] | 30 | ; Make sure the offset is folded and function's frame register is used |
| 31 | ; rather than the global scratch wave offset. |
| 32 | ; GCN-LABEL: {{^}}void_func_byval_struct_use_outside_entry_block: |
| 33 | ; GCN-NOT: v_lshrrev_b32 |
| 34 | ; GCN-NOT: s_sub_u32 |
| 35 | |
| 36 | ; GCN: s_and_saveexec_b64 |
| 37 | ; GCN: s_cbranch_execz [[BB1:BB[0-9]+_[0-9]+]] |
| 38 | |
| 39 | ; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s32{{$}} |
| 40 | ; GCN-NOT: s32 |
| 41 | ; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 42 | ; GCN-NOT: s32 |
| 43 | |
| 44 | ; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s32 offset:16{{$}} |
| 45 | ; GCN-NOT: s32 |
| 46 | ; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}} |
| 47 | ; GCN-NOT: s32 |
| 48 | |
| 49 | ; GCN: [[BB1]] |
| 50 | ; GCN: s_or_b64 exec, exec |
| 51 | define hidden void @void_func_byval_struct_use_outside_entry_block(%struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg0, %struct.ByValStruct addrspace(5)* byval noalias nocapture align 4 %arg1, i1 %cond) #1 { |
| 52 | entry: |
| 53 | br i1 %cond, label %bb0, label %bb1 |
| 54 | |
| 55 | bb0: |
| 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 |
| 58 | %add = add nsw i32 %tmp, 1 |
| 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 |
| 62 | %add3 = add nsw i32 %tmp1, 2 |
| 63 | store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4 |
| 64 | store volatile i32 9, i32 addrspace(1)* null, align 4 |
| 65 | br label %bb1 |
| 66 | |
| 67 | bb1: |
| 68 | ret void |
| 69 | } |
| 70 | |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 71 | ; GCN-LABEL: {{^}}void_func_byval_struct_non_leaf: |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 72 | ; GCN: buffer_store_dword v33, off, s[0:3], s32 offset:36 |
| 73 | ; GCN-DAG: v_writelane_b32 v33, s34, |
| 74 | ; GCN: s_mov_b32 s34, s32 |
| 75 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s34{{$}} |
| 76 | ; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}} |
| 77 | ; GCN-DAG: buffer_store_dword v32, off, s[0:3], s34 offset:32 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 78 | ; GCN-NOT: v_writelane_b32 v{{[0-9]+}}, s32 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 79 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 80 | ; GCN-DAG: v_add_{{[iu]}}32_e32 [[ADD0:v[0-9]+]], vcc, 1, [[LOAD0]] |
| 81 | ; GCN: buffer_store_dword [[ADD0]], off, s[0:3], s34{{$}} |
| 82 | |
| 83 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s34 offset:16{{$}} |
| Tim Renouf | 2a99fa2 | 2018-02-28 19:10:32 +0000 | [diff] [blame] | 84 | ; 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] | 85 | |
| 86 | ; GCN: s_swappc_b64 |
| 87 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 88 | ; GCN: buffer_store_dword [[ADD1]], off, s[0:3], s34 offset:16{{$}} |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 89 | |
| 90 | ; GCN: v_readlane_b32 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 91 | ; GCN-NOT: v_readlane_b32 s32 |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 92 | ; GCN-DAG: buffer_load_dword v32, off, s[0:3], s34 offset:32 |
| Matt Arsenault | ffb132e | 2018-03-29 20:22:04 +0000 | [diff] [blame] | 93 | ; GCN: s_sub_u32 s32, s32, 0xc00{{$}} |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 94 | ; GCN: v_readlane_b32 s34, v33, |
| 95 | ; GCN-DAG: buffer_load_dword v33, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 96 | ; GCN: s_setpc_b64 |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 97 | 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] | 98 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 99 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 100 | %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 101 | %add = add nsw i32 %tmp, 1 |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 102 | store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 4 |
| 103 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 104 | %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 105 | %add3 = add nsw i32 %tmp1, 2 |
| 106 | call void @external_void_func_void() |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 107 | store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 4 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 108 | store volatile i32 9, i32 addrspace(1)* null, align 4 |
| 109 | ret void |
| 110 | } |
| 111 | |
| 112 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_func: |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 113 | ; GCN: s_mov_b32 s34, s32 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 114 | ; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}} |
| 115 | ; GCN-DAG: v_writelane_b32 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 116 | |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 117 | ; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 118 | ; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| 119 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 120 | ; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s34{{$}} |
| 121 | ; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s34 offset:16 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 122 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 123 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s34{{$}} |
| 124 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s34 offset:4 |
| 125 | ; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s34 offset:8 |
| 126 | ; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s34 offset:12 |
| Matt Arsenault | 99e6f4d | 2019-05-16 15:10:27 +0000 | [diff] [blame] | 127 | |
| 128 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| 129 | |
| 130 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 131 | ; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 132 | ; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 133 | ; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 134 | ; 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] | 135 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 136 | ; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s34 offset:20 |
| 137 | ; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s34 offset:24 |
| 138 | ; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s34 offset:28 |
| Matt Arsenault | 60c8b8b | 2019-09-05 23:54:35 +0000 | [diff] [blame] | 139 | ; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s34 offset:16 |
| Matt Arsenault | f432011 | 2018-09-24 13:18:15 +0000 | [diff] [blame] | 140 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 141 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 142 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 143 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 144 | ; 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] | 145 | |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 146 | ; GCN: s_swappc_b64 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 147 | ; GCN-NOT: v_readlane_b32 s32 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 148 | ; GCN: v_readlane_b32 |
| Matt Arsenault | ecb43ef | 2017-09-13 23:47:01 +0000 | [diff] [blame] | 149 | ; GCN-NOT: v_readlane_b32 s32 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 150 | |
| Matt Arsenault | defe371 | 2017-09-14 17:37:40 +0000 | [diff] [blame] | 151 | ; GCN-NOT: s_sub_u32 s32, s32, 0x800 |
| 152 | |
| 153 | ; GCN: s_sub_u32 s32, s32, 0xc00{{$}} |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 154 | ; GCN: v_readlane_b32 s34, v |
| 155 | ; GCN: s_waitcnt |
| 156 | ; GCN: s_setpc_b64 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 157 | define void @call_void_func_byval_struct_func() #1 { |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 158 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 159 | %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 160 | %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 161 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 162 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 163 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 164 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 165 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 166 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4 |
| 167 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 168 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4 |
| 169 | call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1) |
| 170 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 171 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 172 | ret void |
| 173 | } |
| 174 | |
| 175 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel: |
| Geoff Berry | 4e38e02 | 2017-08-17 04:04:11 +0000 | [diff] [blame] | 176 | ; GCN: s_mov_b32 s33, s7 |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 177 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 178 | |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 179 | ; GCN: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 180 | ; GCN: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8 |
| 181 | ; GCN: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| Geoff Berry | 4e38e02 | 2017-08-17 04:04:11 +0000 | [diff] [blame] | 182 | ; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 183 | |
| Matt Arsenault | defe371 | 2017-09-14 17:37:40 +0000 | [diff] [blame] | 184 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| Geoff Berry | 4e38e02 | 2017-08-17 04:04:11 +0000 | [diff] [blame] | 185 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8 |
| 186 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12 |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 187 | ; GCN-DAG: s_add_u32 s32, s33, 0xc00{{$}} |
| Geoff Berry | 4e38e02 | 2017-08-17 04:04:11 +0000 | [diff] [blame] | 188 | ; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16 |
| 189 | ; 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] | 190 | |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 191 | ; GCN: s_getpc_b64 |
| 192 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 193 | ; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 194 | ; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 195 | ; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 196 | ; 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] | 197 | |
| Matt Arsenault | acc5e82 | 2017-08-02 00:43:42 +0000 | [diff] [blame] | 198 | ; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24 |
| 199 | ; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28 |
| 200 | ; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32 |
| 201 | ; 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] | 202 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 203 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 204 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 205 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 206 | ; 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] | 207 | |
| 208 | |
| 209 | ; GCN: s_swappc_b64 |
| Matt Arsenault | defe371 | 2017-09-14 17:37:40 +0000 | [diff] [blame] | 210 | ; GCN-NOT: s_sub_u32 s32 |
| 211 | ; GCN: s_endpgm |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 212 | define amdgpu_kernel void @call_void_func_byval_struct_kernel() #1 { |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 213 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 214 | %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 215 | %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 216 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 217 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 218 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 219 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 220 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 221 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4 |
| 222 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 223 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4 |
| 224 | call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1) |
| 225 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 226 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 227 | ret void |
| 228 | } |
| 229 | |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 230 | ; GCN-LABEL: {{^}}void_func_byval_struct_align8: |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 231 | ; 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] | 232 | ; GCN-NOT: s32 |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 233 | ; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 234 | ; GCN-NOT: s32 |
| 235 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 236 | ; 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] | 237 | ; GCN-NOT: s32 |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 238 | ; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:16{{$}} |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 239 | ; GCN-NOT: s32 |
| Scott Linder | afc24ed | 2019-02-01 21:23:28 +0000 | [diff] [blame] | 240 | 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] | 241 | entry: |
| 242 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 243 | %tmp = load volatile i32, i32 addrspace(5)* %arrayidx, align 8 |
| 244 | %add = add nsw i32 %tmp, 1 |
| 245 | store volatile i32 %add, i32 addrspace(5)* %arrayidx, align 8 |
| 246 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 247 | %tmp1 = load volatile i32, i32 addrspace(5)* %arrayidx2, align 8 |
| 248 | %add3 = add nsw i32 %tmp1, 2 |
| 249 | store volatile i32 %add3, i32 addrspace(5)* %arrayidx2, align 8 |
| 250 | store volatile i32 9, i32 addrspace(1)* null, align 4 |
| 251 | ret void |
| 252 | } |
| 253 | |
| 254 | ; Make sure the byval alignment is respected in the call frame setup |
| 255 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_kernel: |
| 256 | ; GCN: s_mov_b32 s33, s7 |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 257 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 258 | |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 259 | ; GCN: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 260 | ; GCN: buffer_store_dword [[NINE]], off, s[0:3], s33 offset:8 |
| 261 | ; GCN: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 262 | ; GCN: buffer_store_dword [[THIRTEEN]], off, s[0:3], s33 offset:24 |
| 263 | |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 264 | |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 265 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| Matt Arsenault | 60c8b8b | 2019-09-05 23:54:35 +0000 | [diff] [blame] | 266 | ; GCN-DAG: s_add_u32 s32, s33, 0xc00{{$}} |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 267 | |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 268 | ; GCN: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s33 offset:8 |
| 269 | ; GCN: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s33 offset:12 |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 270 | ; GCN: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s33 offset:16 |
| 271 | ; GCN: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s33 offset:20 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 272 | |
| Matt Arsenault | 4f3472d | 2019-07-03 00:30:47 +0000 | [diff] [blame] | 273 | ; GCN: buffer_store_dword [[LOAD3]], off, s[0:3], s32 offset:12 |
| 274 | ; GCN: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 275 | ; GCN: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 276 | ; GCN: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 277 | |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 278 | |
| 279 | ; GCN-DAG: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s33 offset:24 |
| 280 | ; GCN-DAG: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s33 offset:28 |
| 281 | ; GCN-DAG: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s33 offset:32 |
| 282 | ; GCN-DAG: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s33 offset:36 |
| 283 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 284 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 285 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 286 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 287 | ; 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] | 288 | |
| 289 | |
| 290 | ; GCN: s_swappc_b64 |
| 291 | ; GCN-NOT: s_sub_u32 s32 |
| 292 | ; GCN: s_endpgm |
| 293 | define amdgpu_kernel void @call_void_func_byval_struct_align8_kernel() #1 { |
| 294 | entry: |
| 295 | %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 296 | %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 297 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 298 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 299 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 300 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 301 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 302 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8 |
| 303 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 304 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8 |
| 305 | 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) |
| 306 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 307 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 308 | ret void |
| 309 | } |
| 310 | |
| 311 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_align8_func: |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 312 | ; GCN: s_mov_b32 s34, s32 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 313 | ; GCN-DAG: s_add_u32 s32, s32, 0xc00{{$}} |
| 314 | ; GCN-DAG: v_writelane_b32 |
| 315 | |
| 316 | ; GCN-DAG: v_mov_b32_e32 [[NINE:v[0-9]+]], 9 |
| 317 | ; GCN-DAG: v_mov_b32_e32 [[THIRTEEN:v[0-9]+]], 13 |
| 318 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 319 | ; GCN-DAG: buffer_store_dword [[NINE]], off, s[0:3], s34{{$}} |
| 320 | ; GCN-DAG: buffer_store_dword [[THIRTEEN]], off, s[0:3], s34 offset:16 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 321 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 322 | ; GCN-DAG: buffer_load_dword [[LOAD0:v[0-9]+]], off, s[0:3], s34{{$}} |
| 323 | ; GCN-DAG: buffer_load_dword [[LOAD1:v[0-9]+]], off, s[0:3], s34 offset:4 |
| 324 | ; GCN-DAG: buffer_load_dword [[LOAD2:v[0-9]+]], off, s[0:3], s34 offset:8 |
| 325 | ; GCN-DAG: buffer_load_dword [[LOAD3:v[0-9]+]], off, s[0:3], s34 offset:12 |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 326 | |
| 327 | ; GCN-NOT: s_add_u32 s32, s32, 0x800 |
| 328 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 329 | ; GCN-DAG: buffer_store_dword [[LOAD0]], off, s[0:3], s32{{$}} |
| 330 | ; GCN-DAG: buffer_store_dword [[LOAD1]], off, s[0:3], s32 offset:4 |
| 331 | ; GCN-DAG: buffer_store_dword [[LOAD2]], off, s[0:3], s32 offset:8 |
| 332 | ; 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] | 333 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 334 | ; GCN: buffer_load_dword [[LOAD5:v[0-9]+]], off, s[0:3], s34 offset:20 |
| 335 | ; GCN: buffer_load_dword [[LOAD6:v[0-9]+]], off, s[0:3], s34 offset:24 |
| 336 | ; GCN: buffer_load_dword [[LOAD7:v[0-9]+]], off, s[0:3], s34 offset:28 |
| Matt Arsenault | 60c8b8b | 2019-09-05 23:54:35 +0000 | [diff] [blame] | 337 | ; GCN: buffer_load_dword [[LOAD4:v[0-9]+]], off, s[0:3], s34 offset:16 |
| 338 | |
| Matt Arsenault | 34c8b83 | 2019-06-05 22:37:50 +0000 | [diff] [blame] | 339 | ; GCN: s_waitcnt vmcnt(0) |
| 340 | ; GCN-DAG: buffer_store_dword [[LOAD4]], off, s[0:3], s32 offset:16 |
| 341 | ; GCN-DAG: buffer_store_dword [[LOAD5]], off, s[0:3], s32 offset:20 |
| 342 | ; GCN-DAG: buffer_store_dword [[LOAD6]], off, s[0:3], s32 offset:24 |
| 343 | ; 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] | 344 | |
| 345 | ; GCN: s_swappc_b64 |
| 346 | ; GCN-NOT: v_readlane_b32 s32 |
| 347 | ; GCN: v_readlane_b32 |
| 348 | ; GCN-NOT: v_readlane_b32 s32 |
| 349 | |
| 350 | ; GCN-NOT: s_sub_u32 s32, s32, 0x800 |
| 351 | |
| 352 | ; GCN: s_sub_u32 s32, s32, 0xc00{{$}} |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 353 | ; GCN: v_readlane_b32 s34, v |
| 354 | ; GCN: s_waitcnt |
| Matt Arsenault | bb8e64e | 2018-08-22 11:09:45 +0000 | [diff] [blame] | 355 | ; GCN-NEXT: s_setpc_b64 |
| 356 | define void @call_void_func_byval_struct_align8_func() #0 { |
| 357 | entry: |
| 358 | %arg0 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 359 | %arg1 = alloca %struct.ByValStruct, align 8, addrspace(5) |
| 360 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 361 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 362 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 363 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 364 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 365 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 8 |
| 366 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 367 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 8 |
| 368 | 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) |
| 369 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 370 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 371 | ret void |
| 372 | } |
| 373 | |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 374 | ; GCN-LABEL: {{^}}call_void_func_byval_struct_kernel_no_frame_pointer_elim: |
| 375 | define amdgpu_kernel void @call_void_func_byval_struct_kernel_no_frame_pointer_elim() #2 { |
| 376 | entry: |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 377 | %arg0 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 378 | %arg1 = alloca %struct.ByValStruct, align 4, addrspace(5) |
| 379 | %tmp = bitcast %struct.ByValStruct addrspace(5)* %arg0 to i8 addrspace(5)* |
| 380 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| 381 | %tmp1 = bitcast %struct.ByValStruct addrspace(5)* %arg1 to i8 addrspace(5)* |
| 382 | call void @llvm.lifetime.start.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 383 | %arrayidx = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg0, i32 0, i32 0, i32 0 |
| 384 | store volatile i32 9, i32 addrspace(5)* %arrayidx, align 4 |
| 385 | %arrayidx2 = getelementptr inbounds %struct.ByValStruct, %struct.ByValStruct addrspace(5)* %arg1, i32 0, i32 0, i32 0 |
| 386 | store volatile i32 13, i32 addrspace(5)* %arrayidx2, align 4 |
| 387 | call void @void_func_byval_struct(%struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg0, %struct.ByValStruct addrspace(5)* byval nonnull align 4 %arg1) |
| 388 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp1) |
| 389 | call void @llvm.lifetime.end.p5i8(i64 32, i8 addrspace(5)* %tmp) |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 390 | ret void |
| 391 | } |
| 392 | |
| Matt Arsenault | 71dfb7e | 2019-07-08 19:03:38 +0000 | [diff] [blame] | 393 | declare hidden void @external_void_func_void() #0 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 394 | |
| Yaxun Liu | 2a22c5d | 2018-02-02 16:07:16 +0000 | [diff] [blame] | 395 | declare void @llvm.lifetime.start.p5i8(i64, i8 addrspace(5)* nocapture) #3 |
| 396 | declare void @llvm.lifetime.end.p5i8(i64, i8 addrspace(5)* nocapture) #3 |
| Matt Arsenault | b62a4eb | 2017-08-01 19:54:18 +0000 | [diff] [blame] | 397 | |
| 398 | attributes #0 = { nounwind } |
| 399 | attributes #1 = { noinline norecurse nounwind } |
| Matt Arsenault | 5dbe4a9 | 2019-06-20 17:03:27 +0000 | [diff] [blame] | 400 | attributes #2 = { nounwind norecurse "frame-pointer"="all" } |