382 lines · plain
1; RUN: llc -mtriple=amdgcn < %s | FileCheck -check-prefixes=GCN,SI %s2; RUN: llc -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,VI %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9_1250 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx1250 < %s | FileCheck -check-prefixes=GCN,GFX1250,GFX9_1250 %s5 6; GCN-LABEL: {{^}}v_test_imin3_slt_i32:7; GCN: v_min3_i328define amdgpu_kernel void @v_test_imin3_slt_i32(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {9 %tid = call i32 @llvm.amdgcn.workitem.id.x()10 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid11 %gep1 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid12 %gep2 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid13 %outgep = getelementptr i32, ptr addrspace(1) %out, i32 %tid14 %a = load i32, ptr addrspace(1) %gep015 %b = load i32, ptr addrspace(1) %gep116 %c = load i32, ptr addrspace(1) %gep217 %icmp0 = icmp slt i32 %a, %b18 %i0 = select i1 %icmp0, i32 %a, i32 %b19 %icmp1 = icmp slt i32 %i0, %c20 %i1 = select i1 %icmp1, i32 %i0, i32 %c21 store i32 %i1, ptr addrspace(1) %outgep22 ret void23}24 25; GCN-LABEL: {{^}}v_test_umin3_ult_i32:26; GCN: v_min3_u3227define amdgpu_kernel void @v_test_umin3_ult_i32(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {28 %tid = call i32 @llvm.amdgcn.workitem.id.x()29 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid30 %gep1 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid31 %gep2 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid32 %outgep = getelementptr i32, ptr addrspace(1) %out, i32 %tid33 %a = load i32, ptr addrspace(1) %gep034 %b = load i32, ptr addrspace(1) %gep135 %c = load i32, ptr addrspace(1) %gep236 %icmp0 = icmp ult i32 %a, %b37 %i0 = select i1 %icmp0, i32 %a, i32 %b38 %icmp1 = icmp ult i32 %i0, %c39 %i1 = select i1 %icmp1, i32 %i0, i32 %c40 store i32 %i1, ptr addrspace(1) %outgep41 ret void42}43 44; GCN-LABEL: {{^}}v_test_umin_umin_umin:45; GCN: v_min_i3246; GCN: v_min3_i3247define amdgpu_kernel void @v_test_umin_umin_umin(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {48 %tid = call i32 @llvm.amdgcn.workitem.id.x()49 %tid2 = mul i32 %tid, 250 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid51 %gep1 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid52 %gep2 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid53 54 %gep3 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid255 %gep4 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid256 %gep5 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid257 58 %outgep0 = getelementptr i32, ptr addrspace(1) %out, i32 %tid59 %outgep1 = getelementptr i32, ptr addrspace(1) %out, i32 %tid260 61 %a = load i32, ptr addrspace(1) %gep062 %b = load i32, ptr addrspace(1) %gep163 %c = load i32, ptr addrspace(1) %gep264 %d = load i32, ptr addrspace(1) %gep365 66 %icmp0 = icmp slt i32 %a, %b67 %i0 = select i1 %icmp0, i32 %a, i32 %b68 69 %icmp1 = icmp slt i32 %c, %d70 %i1 = select i1 %icmp1, i32 %c, i32 %d71 72 %icmp2 = icmp slt i32 %i0, %i173 %i2 = select i1 %icmp2, i32 %i0, i32 %i174 75 store i32 %i2, ptr addrspace(1) %outgep176 ret void77}78 79; GCN-LABEL: {{^}}v_test_umin3_2_uses:80; GCN-NOT: v_min381define amdgpu_kernel void @v_test_umin3_2_uses(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {82 %tid = call i32 @llvm.amdgcn.workitem.id.x()83 %tid2 = mul i32 %tid, 284 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid85 %gep1 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid86 %gep2 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid87 88 %gep3 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid289 %gep4 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid290 %gep5 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid291 92 %outgep0 = getelementptr i32, ptr addrspace(1) %out, i32 %tid93 %outgep1 = getelementptr i32, ptr addrspace(1) %out, i32 %tid294 95 %a = load i32, ptr addrspace(1) %gep096 %b = load i32, ptr addrspace(1) %gep197 %c = load i32, ptr addrspace(1) %gep298 %d = load i32, ptr addrspace(1) %gep399 100 %icmp0 = icmp slt i32 %a, %b101 %i0 = select i1 %icmp0, i32 %a, i32 %b102 103 %icmp1 = icmp slt i32 %c, %d104 %i1 = select i1 %icmp1, i32 %c, i32 %d105 106 %icmp2 = icmp slt i32 %i0, %c107 %i2 = select i1 %icmp2, i32 %i0, i32 %c108 109 store i32 %i2, ptr addrspace(1) %outgep0110 store i32 %i0, ptr addrspace(1) %outgep1111 ret void112}113 114; GCN-LABEL: {{^}}v_test_imin3_slt_i16:115; SI: v_min3_i32116 117; VI: v_min_i16118; VI: v_min_i16119 120; GFX9_1250: v_min3_i16121define amdgpu_kernel void @v_test_imin3_slt_i16(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {122 %tid = call i32 @llvm.amdgcn.workitem.id.x()123 %gep0 = getelementptr i16, ptr addrspace(1) %aptr, i32 %tid124 %gep1 = getelementptr i16, ptr addrspace(1) %bptr, i32 %tid125 %gep2 = getelementptr i16, ptr addrspace(1) %cptr, i32 %tid126 %outgep = getelementptr i16, ptr addrspace(1) %out, i32 %tid127 %a = load i16, ptr addrspace(1) %gep0128 %b = load i16, ptr addrspace(1) %gep1129 %c = load i16, ptr addrspace(1) %gep2130 %icmp0 = icmp slt i16 %a, %b131 %i0 = select i1 %icmp0, i16 %a, i16 %b132 %icmp1 = icmp slt i16 %i0, %c133 %i1 = select i1 %icmp1, i16 %i0, i16 %c134 store i16 %i1, ptr addrspace(1) %outgep135 ret void136}137 138; GCN-LABEL: {{^}}v_test_umin3_ult_i16:139; SI: v_min3_u32140 141; VI: v_min_u16142; VI: v_min_u16143 144; GFX9_1250: v_min3_u16145define amdgpu_kernel void @v_test_umin3_ult_i16(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {146 %tid = call i32 @llvm.amdgcn.workitem.id.x()147 %gep0 = getelementptr i16, ptr addrspace(1) %aptr, i32 %tid148 %gep1 = getelementptr i16, ptr addrspace(1) %bptr, i32 %tid149 %gep2 = getelementptr i16, ptr addrspace(1) %cptr, i32 %tid150 %outgep = getelementptr i16, ptr addrspace(1) %out, i32 %tid151 %a = load i16, ptr addrspace(1) %gep0152 %b = load i16, ptr addrspace(1) %gep1153 %c = load i16, ptr addrspace(1) %gep2154 %icmp0 = icmp ult i16 %a, %b155 %i0 = select i1 %icmp0, i16 %a, i16 %b156 %icmp1 = icmp ult i16 %i0, %c157 %i1 = select i1 %icmp1, i16 %i0, i16 %c158 store i16 %i1, ptr addrspace(1) %outgep159 ret void160}161 162; GCN-LABEL: {{^}}v_test_imin3_slt_i8:163; SI: v_min3_i32164 165; VI: v_min_i16166; VI: v_min_i16167 168; GFX9_1250: v_min3_i16169define amdgpu_kernel void @v_test_imin3_slt_i8(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {170 %tid = call i32 @llvm.amdgcn.workitem.id.x()171 %gep0 = getelementptr i8, ptr addrspace(1) %aptr, i32 %tid172 %gep1 = getelementptr i8, ptr addrspace(1) %bptr, i32 %tid173 %gep2 = getelementptr i8, ptr addrspace(1) %cptr, i32 %tid174 %outgep = getelementptr i8, ptr addrspace(1) %out, i32 %tid175 %a = load i8, ptr addrspace(1) %gep0176 %b = load i8, ptr addrspace(1) %gep1177 %c = load i8, ptr addrspace(1) %gep2178 %icmp0 = icmp slt i8 %a, %b179 %i0 = select i1 %icmp0, i8 %a, i8 %b180 %icmp1 = icmp slt i8 %i0, %c181 %i1 = select i1 %icmp1, i8 %i0, i8 %c182 store i8 %i1, ptr addrspace(1) %outgep183 ret void184}185 186; GCN-LABEL: {{^}}v_test_umin3_ult_i8:187; SI: v_min3_u32188 189; VI: v_min_u16190; VI: v_min_u16191 192; GFX9_1250: v_min3_u16193define amdgpu_kernel void @v_test_umin3_ult_i8(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {194 %tid = call i32 @llvm.amdgcn.workitem.id.x()195 %gep0 = getelementptr i8, ptr addrspace(1) %aptr, i32 %tid196 %gep1 = getelementptr i8, ptr addrspace(1) %bptr, i32 %tid197 %gep2 = getelementptr i8, ptr addrspace(1) %cptr, i32 %tid198 %outgep = getelementptr i8, ptr addrspace(1) %out, i32 %tid199 %a = load i8, ptr addrspace(1) %gep0200 %b = load i8, ptr addrspace(1) %gep1201 %c = load i8, ptr addrspace(1) %gep2202 %icmp0 = icmp ult i8 %a, %b203 %i0 = select i1 %icmp0, i8 %a, i8 %b204 %icmp1 = icmp ult i8 %i0, %c205 %i1 = select i1 %icmp1, i8 %i0, i8 %c206 store i8 %i1, ptr addrspace(1) %outgep207 ret void208}209 210; GCN-LABEL: {{^}}v_test_imin3_slt_i7:211; SI: v_min3_i32212 213; VI: v_min_i16214; VI: v_min_i16215 216; GFX9_1250: v_min3_i16217define amdgpu_kernel void @v_test_imin3_slt_i7(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {218 %tid = call i32 @llvm.amdgcn.workitem.id.x()219 %gep0 = getelementptr i7, ptr addrspace(1) %aptr, i32 %tid220 %gep1 = getelementptr i7, ptr addrspace(1) %bptr, i32 %tid221 %gep2 = getelementptr i7, ptr addrspace(1) %cptr, i32 %tid222 %outgep = getelementptr i7, ptr addrspace(1) %out, i32 %tid223 %a = load i7, ptr addrspace(1) %gep0224 %b = load i7, ptr addrspace(1) %gep1225 %c = load i7, ptr addrspace(1) %gep2226 %icmp0 = icmp slt i7 %a, %b227 %i0 = select i1 %icmp0, i7 %a, i7 %b228 %icmp1 = icmp slt i7 %i0, %c229 %i1 = select i1 %icmp1, i7 %i0, i7 %c230 store i7 %i1, ptr addrspace(1) %outgep231 ret void232}233 234; GCN-LABEL: {{^}}v_test_umin3_ult_i7:235; SI: v_min3_u32236 237; VI: v_min_u16238; VI: v_min_u16239 240; GFX9_1250: v_min3_u16241define amdgpu_kernel void @v_test_umin3_ult_i7(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {242 %tid = call i32 @llvm.amdgcn.workitem.id.x()243 %gep0 = getelementptr i7, ptr addrspace(1) %aptr, i32 %tid244 %gep1 = getelementptr i7, ptr addrspace(1) %bptr, i32 %tid245 %gep2 = getelementptr i7, ptr addrspace(1) %cptr, i32 %tid246 %outgep = getelementptr i7, ptr addrspace(1) %out, i32 %tid247 %a = load i7, ptr addrspace(1) %gep0248 %b = load i7, ptr addrspace(1) %gep1249 %c = load i7, ptr addrspace(1) %gep2250 %icmp0 = icmp ult i7 %a, %b251 %i0 = select i1 %icmp0, i7 %a, i7 %b252 %icmp1 = icmp ult i7 %i0, %c253 %i1 = select i1 %icmp1, i7 %i0, i7 %c254 store i7 %i1, ptr addrspace(1) %outgep255 ret void256}257 258; GCN-LABEL: {{^}}v_test_imin3_slt_i33:259; GCN-NOT: v_min3260define amdgpu_kernel void @v_test_imin3_slt_i33(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {261 %tid = call i32 @llvm.amdgcn.workitem.id.x()262 %gep0 = getelementptr i33, ptr addrspace(1) %aptr, i32 %tid263 %gep1 = getelementptr i33, ptr addrspace(1) %bptr, i32 %tid264 %gep2 = getelementptr i33, ptr addrspace(1) %cptr, i32 %tid265 %outgep = getelementptr i33, ptr addrspace(1) %out, i32 %tid266 %a = load i33, ptr addrspace(1) %gep0267 %b = load i33, ptr addrspace(1) %gep1268 %c = load i33, ptr addrspace(1) %gep2269 %icmp0 = icmp slt i33 %a, %b270 %i0 = select i1 %icmp0, i33 %a, i33 %b271 %icmp1 = icmp slt i33 %i0, %c272 %i1 = select i1 %icmp1, i33 %i0, i33 %c273 store i33 %i1, ptr addrspace(1) %outgep274 ret void275}276 277; GCN-LABEL: {{^}}v_test_umin3_ult_i33:278; GCN-NOT: v_min3279define amdgpu_kernel void @v_test_umin3_ult_i33(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {280 %tid = call i32 @llvm.amdgcn.workitem.id.x()281 %gep0 = getelementptr i33, ptr addrspace(1) %aptr, i32 %tid282 %gep1 = getelementptr i33, ptr addrspace(1) %bptr, i32 %tid283 %gep2 = getelementptr i33, ptr addrspace(1) %cptr, i32 %tid284 %outgep = getelementptr i33, ptr addrspace(1) %out, i32 %tid285 %a = load i33, ptr addrspace(1) %gep0286 %b = load i33, ptr addrspace(1) %gep1287 %c = load i33, ptr addrspace(1) %gep2288 %icmp0 = icmp ult i33 %a, %b289 %i0 = select i1 %icmp0, i33 %a, i33 %b290 %icmp1 = icmp ult i33 %i0, %c291 %i1 = select i1 %icmp1, i33 %i0, i33 %c292 store i33 %i1, ptr addrspace(1) %outgep293 ret void294}295 296; GCN-LABEL: {{^}}v_test_imin3_slt_i64:297; GCN-NOT: v_min3298define amdgpu_kernel void @v_test_imin3_slt_i64(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {299 %tid = call i32 @llvm.amdgcn.workitem.id.x()300 %gep0 = getelementptr i64, ptr addrspace(1) %aptr, i32 %tid301 %gep1 = getelementptr i64, ptr addrspace(1) %bptr, i32 %tid302 %gep2 = getelementptr i64, ptr addrspace(1) %cptr, i32 %tid303 %outgep = getelementptr i64, ptr addrspace(1) %out, i32 %tid304 %a = load i64, ptr addrspace(1) %gep0305 %b = load i64, ptr addrspace(1) %gep1306 %c = load i64, ptr addrspace(1) %gep2307 %icmp0 = icmp slt i64 %a, %b308 %i0 = select i1 %icmp0, i64 %a, i64 %b309 %icmp1 = icmp slt i64 %i0, %c310 %i1 = select i1 %icmp1, i64 %i0, i64 %c311 store i64 %i1, ptr addrspace(1) %outgep312 ret void313}314 315; GCN-LABEL: {{^}}v_test_umin3_ult_i64:316; GCN-NOT: v_min3317define amdgpu_kernel void @v_test_umin3_ult_i64(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {318 %tid = call i32 @llvm.amdgcn.workitem.id.x()319 %gep0 = getelementptr i64, ptr addrspace(1) %aptr, i32 %tid320 %gep1 = getelementptr i64, ptr addrspace(1) %bptr, i32 %tid321 %gep2 = getelementptr i64, ptr addrspace(1) %cptr, i32 %tid322 %outgep = getelementptr i64, ptr addrspace(1) %out, i32 %tid323 %a = load i64, ptr addrspace(1) %gep0324 %b = load i64, ptr addrspace(1) %gep1325 %c = load i64, ptr addrspace(1) %gep2326 %icmp0 = icmp ult i64 %a, %b327 %i0 = select i1 %icmp0, i64 %a, i64 %b328 %icmp1 = icmp ult i64 %i0, %c329 %i1 = select i1 %icmp1, i64 %i0, i64 %c330 store i64 %i1, ptr addrspace(1) %outgep331 ret void332}333 334; GCN-LABEL: {{^}}v_test_imin3_slt_v2i16:335; SI-COUNT-2: v_min3_i32336; VI-COUNT-2: v_min_i16337; GFX9-COUNT-2: v_pk_min_i16338; GFX1250: v_pk_min3_i16339define amdgpu_kernel void @v_test_imin3_slt_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {340 %tid = call i32 @llvm.amdgcn.workitem.id.x()341 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid342 %gep1 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid343 %gep2 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid344 %outgep = getelementptr <2 x i16>, ptr addrspace(1) %out, i32 %tid345 %a = load <2 x i16>, ptr addrspace(1) %gep0346 %b = load <2 x i16>, ptr addrspace(1) %gep1347 %c = load <2 x i16>, ptr addrspace(1) %gep2348 %icmp0 = icmp slt <2 x i16> %a, %b349 %i0 = select <2 x i1> %icmp0, <2 x i16> %a, <2 x i16> %b350 %icmp1 = icmp slt <2 x i16> %i0, %c351 %i1 = select <2 x i1> %icmp1, <2 x i16> %i0, <2 x i16> %c352 store <2 x i16> %i1, ptr addrspace(1) %outgep353 ret void354}355 356; GCN-LABEL: {{^}}v_test_imin3_ult_v2i16:357; SI-COUNT-2: v_min3_u32358; VI-COUNT-2: v_min_u16359; GFX9-COUNT-2: v_pk_min_u16360; GFX1250: v_pk_min3_u16361define amdgpu_kernel void @v_test_imin3_ult_v2i16(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %bptr, ptr addrspace(1) %cptr) #0 {362 %tid = call i32 @llvm.amdgcn.workitem.id.x()363 %gep0 = getelementptr i32, ptr addrspace(1) %aptr, i32 %tid364 %gep1 = getelementptr i32, ptr addrspace(1) %bptr, i32 %tid365 %gep2 = getelementptr i32, ptr addrspace(1) %cptr, i32 %tid366 %outgep = getelementptr <2 x i16>, ptr addrspace(1) %out, i32 %tid367 %a = load <2 x i16>, ptr addrspace(1) %gep0368 %b = load <2 x i16>, ptr addrspace(1) %gep1369 %c = load <2 x i16>, ptr addrspace(1) %gep2370 %icmp0 = icmp ult <2 x i16> %a, %b371 %i0 = select <2 x i1> %icmp0, <2 x i16> %a, <2 x i16> %b372 %icmp1 = icmp ult <2 x i16> %i0, %c373 %i1 = select <2 x i1> %icmp1, <2 x i16> %i0, <2 x i16> %c374 store <2 x i16> %i1, ptr addrspace(1) %outgep375 ret void376}377 378declare i32 @llvm.amdgcn.workitem.id.x() #1379 380attributes #0 = { nounwind }381attributes #1 = { nounwind readnone speculatable }382