1; RUN: llc -march=amdgcn < %s | FileCheck -check-prefixes=GCN,SI %s 2; RUN: llc -march=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,VI %s 3; RUN: llc -march=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s 4 5; GCN-LABEL: {{^}}v_test_imin3_slt_i32: 6; GCN: v_min3_i32 7define amdgpu_kernel void @v_test_imin3_slt_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 { 8 %tid = call i32 @llvm.amdgcn.workitem.id.x() 9 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 10 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 11 %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid 12 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 13 %a = load i32, i32 addrspace(1)* %gep0 14 %b = load i32, i32 addrspace(1)* %gep1 15 %c = load i32, i32 addrspace(1)* %gep2 16 %icmp0 = icmp slt i32 %a, %b 17 %i0 = select i1 %icmp0, i32 %a, i32 %b 18 %icmp1 = icmp slt i32 %i0, %c 19 %i1 = select i1 %icmp1, i32 %i0, i32 %c 20 store i32 %i1, i32 addrspace(1)* %outgep 21 ret void 22} 23 24; GCN-LABEL: {{^}}v_test_umin3_ult_i32: 25; GCN: v_min3_u32 26define amdgpu_kernel void @v_test_umin3_ult_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 { 27 %tid = call i32 @llvm.amdgcn.workitem.id.x() 28 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 29 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 30 %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid 31 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 32 %a = load i32, i32 addrspace(1)* %gep0 33 %b = load i32, i32 addrspace(1)* %gep1 34 %c = load i32, i32 addrspace(1)* %gep2 35 %icmp0 = icmp ult i32 %a, %b 36 %i0 = select i1 %icmp0, i32 %a, i32 %b 37 %icmp1 = icmp ult i32 %i0, %c 38 %i1 = select i1 %icmp1, i32 %i0, i32 %c 39 store i32 %i1, i32 addrspace(1)* %outgep 40 ret void 41} 42 43; GCN-LABEL: {{^}}v_test_umin_umin_umin: 44; GCN: v_min_i32 45; GCN: v_min3_i32 46define amdgpu_kernel void @v_test_umin_umin_umin(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 { 47 %tid = call i32 @llvm.amdgcn.workitem.id.x() 48 %tid2 = mul i32 %tid, 2 49 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 50 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 51 %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid 52 53 %gep3 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid2 54 %gep4 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid2 55 %gep5 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid2 56 57 %outgep0 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 58 %outgep1 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid2 59 60 %a = load i32, i32 addrspace(1)* %gep0 61 %b = load i32, i32 addrspace(1)* %gep1 62 %c = load i32, i32 addrspace(1)* %gep2 63 %d = load i32, i32 addrspace(1)* %gep3 64 65 %icmp0 = icmp slt i32 %a, %b 66 %i0 = select i1 %icmp0, i32 %a, i32 %b 67 68 %icmp1 = icmp slt i32 %c, %d 69 %i1 = select i1 %icmp1, i32 %c, i32 %d 70 71 %icmp2 = icmp slt i32 %i0, %i1 72 %i2 = select i1 %icmp2, i32 %i0, i32 %i1 73 74 store i32 %i2, i32 addrspace(1)* %outgep1 75 ret void 76} 77 78; GCN-LABEL: {{^}}v_test_umin3_2_uses: 79; GCN-NOT: v_min3 80define amdgpu_kernel void @v_test_umin3_2_uses(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) #0 { 81 %tid = call i32 @llvm.amdgcn.workitem.id.x() 82 %tid2 = mul i32 %tid, 2 83 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 84 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 85 %gep2 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid 86 87 %gep3 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid2 88 %gep4 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid2 89 %gep5 = getelementptr i32, i32 addrspace(1)* %cptr, i32 %tid2 90 91 %outgep0 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 92 %outgep1 = getelementptr i32, i32 addrspace(1)* %out, i32 %tid2 93 94 %a = load i32, i32 addrspace(1)* %gep0 95 %b = load i32, i32 addrspace(1)* %gep1 96 %c = load i32, i32 addrspace(1)* %gep2 97 %d = load i32, i32 addrspace(1)* %gep3 98 99 %icmp0 = icmp slt i32 %a, %b 100 %i0 = select i1 %icmp0, i32 %a, i32 %b 101 102 %icmp1 = icmp slt i32 %c, %d 103 %i1 = select i1 %icmp1, i32 %c, i32 %d 104 105 %icmp2 = icmp slt i32 %i0, %c 106 %i2 = select i1 %icmp2, i32 %i0, i32 %c 107 108 store i32 %i2, i32 addrspace(1)* %outgep0 109 store i32 %i0, i32 addrspace(1)* %outgep1 110 ret void 111} 112 113; GCN-LABEL: {{^}}v_test_imin3_slt_i16: 114; SI: v_min3_i32 115 116; VI: v_min_i16 117; VI: v_min_i16 118 119; GFX9: v_min3_i16 120define amdgpu_kernel void @v_test_imin3_slt_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 { 121 %tid = call i32 @llvm.amdgcn.workitem.id.x() 122 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid 123 %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid 124 %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid 125 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid 126 %a = load i16, i16 addrspace(1)* %gep0 127 %b = load i16, i16 addrspace(1)* %gep1 128 %c = load i16, i16 addrspace(1)* %gep2 129 %icmp0 = icmp slt i16 %a, %b 130 %i0 = select i1 %icmp0, i16 %a, i16 %b 131 %icmp1 = icmp slt i16 %i0, %c 132 %i1 = select i1 %icmp1, i16 %i0, i16 %c 133 store i16 %i1, i16 addrspace(1)* %outgep 134 ret void 135} 136 137; GCN-LABEL: {{^}}v_test_umin3_ult_i16: 138; SI: v_min3_u32 139 140; VI: v_min_u16 141; VI: v_min_u16 142 143; GFX9: v_min3_u16 144define amdgpu_kernel void @v_test_umin3_ult_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 { 145 %tid = call i32 @llvm.amdgcn.workitem.id.x() 146 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid 147 %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid 148 %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid 149 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid 150 %a = load i16, i16 addrspace(1)* %gep0 151 %b = load i16, i16 addrspace(1)* %gep1 152 %c = load i16, i16 addrspace(1)* %gep2 153 %icmp0 = icmp ult i16 %a, %b 154 %i0 = select i1 %icmp0, i16 %a, i16 %b 155 %icmp1 = icmp ult i16 %i0, %c 156 %i1 = select i1 %icmp1, i16 %i0, i16 %c 157 store i16 %i1, i16 addrspace(1)* %outgep 158 ret void 159} 160 161; GCN-LABEL: {{^}}v_test_imin3_slt_i8: 162; SI: v_min3_i32 163 164; VI: v_min_i16 165; VI: v_min_i16 166 167; GFX9: v_min3_i16 168define amdgpu_kernel void @v_test_imin3_slt_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 { 169 %tid = call i32 @llvm.amdgcn.workitem.id.x() 170 %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid 171 %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid 172 %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid 173 %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid 174 %a = load i8, i8 addrspace(1)* %gep0 175 %b = load i8, i8 addrspace(1)* %gep1 176 %c = load i8, i8 addrspace(1)* %gep2 177 %icmp0 = icmp slt i8 %a, %b 178 %i0 = select i1 %icmp0, i8 %a, i8 %b 179 %icmp1 = icmp slt i8 %i0, %c 180 %i1 = select i1 %icmp1, i8 %i0, i8 %c 181 store i8 %i1, i8 addrspace(1)* %outgep 182 ret void 183} 184 185; GCN-LABEL: {{^}}v_test_umin3_ult_i8: 186; SI: v_min3_u32 187 188; VI: v_min_u16 189; VI: v_min_u16 190 191; GFX9: v_min3_u16 192define amdgpu_kernel void @v_test_umin3_ult_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 { 193 %tid = call i32 @llvm.amdgcn.workitem.id.x() 194 %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid 195 %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid 196 %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid 197 %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid 198 %a = load i8, i8 addrspace(1)* %gep0 199 %b = load i8, i8 addrspace(1)* %gep1 200 %c = load i8, i8 addrspace(1)* %gep2 201 %icmp0 = icmp ult i8 %a, %b 202 %i0 = select i1 %icmp0, i8 %a, i8 %b 203 %icmp1 = icmp ult i8 %i0, %c 204 %i1 = select i1 %icmp1, i8 %i0, i8 %c 205 store i8 %i1, i8 addrspace(1)* %outgep 206 ret void 207} 208 209; GCN-LABEL: {{^}}v_test_imin3_slt_i7: 210; SI: v_min3_i32 211 212; VI: v_min_i16 213; VI: v_min_i16 214 215; GFX9: v_min3_i16 216define amdgpu_kernel void @v_test_imin3_slt_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 { 217 %tid = call i32 @llvm.amdgcn.workitem.id.x() 218 %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid 219 %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid 220 %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid 221 %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid 222 %a = load i7, i7 addrspace(1)* %gep0 223 %b = load i7, i7 addrspace(1)* %gep1 224 %c = load i7, i7 addrspace(1)* %gep2 225 %icmp0 = icmp slt i7 %a, %b 226 %i0 = select i1 %icmp0, i7 %a, i7 %b 227 %icmp1 = icmp slt i7 %i0, %c 228 %i1 = select i1 %icmp1, i7 %i0, i7 %c 229 store i7 %i1, i7 addrspace(1)* %outgep 230 ret void 231} 232 233; GCN-LABEL: {{^}}v_test_umin3_ult_i7: 234; SI: v_min3_u32 235 236; VI: v_min_u16 237; VI: v_min_u16 238 239; GFX9: v_min3_u16 240define amdgpu_kernel void @v_test_umin3_ult_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 { 241 %tid = call i32 @llvm.amdgcn.workitem.id.x() 242 %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid 243 %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid 244 %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid 245 %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid 246 %a = load i7, i7 addrspace(1)* %gep0 247 %b = load i7, i7 addrspace(1)* %gep1 248 %c = load i7, i7 addrspace(1)* %gep2 249 %icmp0 = icmp ult i7 %a, %b 250 %i0 = select i1 %icmp0, i7 %a, i7 %b 251 %icmp1 = icmp ult i7 %i0, %c 252 %i1 = select i1 %icmp1, i7 %i0, i7 %c 253 store i7 %i1, i7 addrspace(1)* %outgep 254 ret void 255} 256 257; GCN-LABEL: {{^}}v_test_imin3_slt_i33: 258; GCN-NOT: v_min3 259define amdgpu_kernel void @v_test_imin3_slt_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 { 260 %tid = call i32 @llvm.amdgcn.workitem.id.x() 261 %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid 262 %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid 263 %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid 264 %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid 265 %a = load i33, i33 addrspace(1)* %gep0 266 %b = load i33, i33 addrspace(1)* %gep1 267 %c = load i33, i33 addrspace(1)* %gep2 268 %icmp0 = icmp slt i33 %a, %b 269 %i0 = select i1 %icmp0, i33 %a, i33 %b 270 %icmp1 = icmp slt i33 %i0, %c 271 %i1 = select i1 %icmp1, i33 %i0, i33 %c 272 store i33 %i1, i33 addrspace(1)* %outgep 273 ret void 274} 275 276; GCN-LABEL: {{^}}v_test_umin3_ult_i33: 277; GCN-NOT: v_min3 278define amdgpu_kernel void @v_test_umin3_ult_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 { 279 %tid = call i32 @llvm.amdgcn.workitem.id.x() 280 %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid 281 %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid 282 %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid 283 %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid 284 %a = load i33, i33 addrspace(1)* %gep0 285 %b = load i33, i33 addrspace(1)* %gep1 286 %c = load i33, i33 addrspace(1)* %gep2 287 %icmp0 = icmp ult i33 %a, %b 288 %i0 = select i1 %icmp0, i33 %a, i33 %b 289 %icmp1 = icmp ult i33 %i0, %c 290 %i1 = select i1 %icmp1, i33 %i0, i33 %c 291 store i33 %i1, i33 addrspace(1)* %outgep 292 ret void 293} 294 295; GCN-LABEL: {{^}}v_test_imin3_slt_i64: 296; GCN-NOT: v_min3 297define amdgpu_kernel void @v_test_imin3_slt_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 { 298 %tid = call i32 @llvm.amdgcn.workitem.id.x() 299 %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 300 %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid 301 %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid 302 %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 303 %a = load i64, i64 addrspace(1)* %gep0 304 %b = load i64, i64 addrspace(1)* %gep1 305 %c = load i64, i64 addrspace(1)* %gep2 306 %icmp0 = icmp slt i64 %a, %b 307 %i0 = select i1 %icmp0, i64 %a, i64 %b 308 %icmp1 = icmp slt i64 %i0, %c 309 %i1 = select i1 %icmp1, i64 %i0, i64 %c 310 store i64 %i1, i64 addrspace(1)* %outgep 311 ret void 312} 313 314; GCN-LABEL: {{^}}v_test_umin3_ult_i64: 315; GCN-NOT: v_min3 316define amdgpu_kernel void @v_test_umin3_ult_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 { 317 %tid = call i32 @llvm.amdgcn.workitem.id.x() 318 %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 319 %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid 320 %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid 321 %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 322 %a = load i64, i64 addrspace(1)* %gep0 323 %b = load i64, i64 addrspace(1)* %gep1 324 %c = load i64, i64 addrspace(1)* %gep2 325 %icmp0 = icmp ult i64 %a, %b 326 %i0 = select i1 %icmp0, i64 %a, i64 %b 327 %icmp1 = icmp ult i64 %i0, %c 328 %i1 = select i1 %icmp1, i64 %i0, i64 %c 329 store i64 %i1, i64 addrspace(1)* %outgep 330 ret void 331} 332 333declare i32 @llvm.amdgcn.workitem.id.x() #1 334 335attributes #0 = { nounwind } 336attributes #1 = { nounwind readnone speculatable } 337