1; RUN: llc -march=amdgcn < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2 3declare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 4 5; FUNC-LABEL: @v_test_imin3_slt_i32 6; SI: v_min3_i32 7define void @v_test_imin3_slt_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) nounwind { 8 %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 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, align 4 14 %b = load i32, i32 addrspace(1)* %gep1, align 4 15 %c = load i32, i32 addrspace(1)* %gep2, align 4 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, align 4 21 ret void 22} 23 24; FUNC-LABEL: @v_test_umin3_ult_i32 25; SI: v_min3_u32 26define void @v_test_umin3_ult_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) nounwind { 27 %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 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, align 4 33 %b = load i32, i32 addrspace(1)* %gep1, align 4 34 %c = load i32, i32 addrspace(1)* %gep2, align 4 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, align 4 40 ret void 41} 42 43; FUNC-LABEL: @v_test_umin_umin_umin 44; SI: v_min_i32 45; SI: v_min3_i32 46define void @v_test_umin_umin_umin(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) nounwind { 47 %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 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, align 4 61 %b = load i32, i32 addrspace(1)* %gep1, align 4 62 %c = load i32, i32 addrspace(1)* %gep2, align 4 63 %d = load i32, i32 addrspace(1)* %gep3, align 4 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, align 4 75 ret void 76} 77 78; FUNC-LABEL: @v_test_umin3_2_uses 79; SI-NOT: v_min3 80define void @v_test_umin3_2_uses(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr, i32 addrspace(1)* %cptr) nounwind { 81 %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone 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, align 4 95 %b = load i32, i32 addrspace(1)* %gep1, align 4 96 %c = load i32, i32 addrspace(1)* %gep2, align 4 97 %d = load i32, i32 addrspace(1)* %gep3, align 4 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, align 4 109 store i32 %i0, i32 addrspace(1)* %outgep1, align 4 110 ret void 111} 112