1; RUN: llc -march=amdgcn -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2 3declare i32 @llvm.r600.read.tidig.x() nounwind readnone 4 5; FUNC-LABEL: @v_test_imin_sle_i32 6; SI: v_min_i32_e32 7define void @v_test_imin_sle_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 8 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone 9 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 10 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 11 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 12 %a = load i32, i32 addrspace(1)* %gep0, align 4 13 %b = load i32, i32 addrspace(1)* %gep1, align 4 14 %cmp = icmp sle i32 %a, %b 15 %val = select i1 %cmp, i32 %a, i32 %b 16 store i32 %val, i32 addrspace(1)* %outgep, align 4 17 ret void 18} 19 20; FUNC-LABEL: @s_test_imin_sle_i32 21; SI: s_min_i32 22define void @s_test_imin_sle_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 23 %cmp = icmp sle i32 %a, %b 24 %val = select i1 %cmp, i32 %a, i32 %b 25 store i32 %val, i32 addrspace(1)* %out, align 4 26 ret void 27} 28 29; FUNC-LABEL: @v_test_imin_slt_i32 30; SI: v_min_i32_e32 31define void @v_test_imin_slt_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 32 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone 33 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 34 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 35 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 36 %a = load i32, i32 addrspace(1)* %gep0, align 4 37 %b = load i32, i32 addrspace(1)* %gep1, align 4 38 %cmp = icmp slt i32 %a, %b 39 %val = select i1 %cmp, i32 %a, i32 %b 40 store i32 %val, i32 addrspace(1)* %outgep, align 4 41 ret void 42} 43 44; FUNC-LABEL: @s_test_imin_slt_i32 45; SI: s_min_i32 46define void @s_test_imin_slt_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 47 %cmp = icmp slt i32 %a, %b 48 %val = select i1 %cmp, i32 %a, i32 %b 49 store i32 %val, i32 addrspace(1)* %out, align 4 50 ret void 51} 52 53; FUNC-LABEL: {{^}}s_test_imin_slt_imm_i32: 54; SI: s_min_i32 {{s[0-9]+}}, {{s[0-9]+}}, 8 55define void @s_test_imin_slt_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind { 56 %cmp = icmp slt i32 %a, 8 57 %val = select i1 %cmp, i32 %a, i32 8 58 store i32 %val, i32 addrspace(1)* %out, align 4 59 ret void 60} 61 62; FUNC-LABEL: {{^}}s_test_imin_sle_imm_i32: 63; SI: s_min_i32 {{s[0-9]+}}, {{s[0-9]+}}, 8 64define void @s_test_imin_sle_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind { 65 %cmp = icmp sle i32 %a, 8 66 %val = select i1 %cmp, i32 %a, i32 8 67 store i32 %val, i32 addrspace(1)* %out, align 4 68 ret void 69} 70 71; FUNC-LABEL: @v_test_umin_ule_i32 72; SI: v_min_u32_e32 73define void @v_test_umin_ule_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 74 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone 75 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 76 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 77 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 78 %a = load i32, i32 addrspace(1)* %gep0, align 4 79 %b = load i32, i32 addrspace(1)* %gep1, align 4 80 %cmp = icmp ule i32 %a, %b 81 %val = select i1 %cmp, i32 %a, i32 %b 82 store i32 %val, i32 addrspace(1)* %outgep, align 4 83 ret void 84} 85 86; FUNC-LABEL: @s_test_umin_ule_i32 87; SI: s_min_u32 88define void @s_test_umin_ule_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 89 %cmp = icmp ule i32 %a, %b 90 %val = select i1 %cmp, i32 %a, i32 %b 91 store i32 %val, i32 addrspace(1)* %out, align 4 92 ret void 93} 94 95; FUNC-LABEL: @v_test_umin_ult_i32 96; SI: v_min_u32_e32 97define void @v_test_umin_ult_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 98 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone 99 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 100 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 101 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 102 %a = load i32, i32 addrspace(1)* %gep0, align 4 103 %b = load i32, i32 addrspace(1)* %gep1, align 4 104 %cmp = icmp ult i32 %a, %b 105 %val = select i1 %cmp, i32 %a, i32 %b 106 store i32 %val, i32 addrspace(1)* %outgep, align 4 107 ret void 108} 109 110; FUNC-LABEL: @s_test_umin_ult_i32 111; SI: s_min_u32 112define void @s_test_umin_ult_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 113 %cmp = icmp ult i32 %a, %b 114 %val = select i1 %cmp, i32 %a, i32 %b 115 store i32 %val, i32 addrspace(1)* %out, align 4 116 ret void 117} 118 119; FUNC-LABEL: @v_test_umin_ult_i32_multi_use 120; SI-NOT: v_min 121; SI: v_cmp_lt_u32 122; SI-NEXT: v_cndmask_b32 123; SI-NOT: v_min 124; SI: s_endpgm 125define void @v_test_umin_ult_i32_multi_use(i32 addrspace(1)* %out0, i1 addrspace(1)* %out1, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 126 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone 127 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 128 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 129 %outgep0 = getelementptr i32, i32 addrspace(1)* %out0, i32 %tid 130 %outgep1 = getelementptr i1, i1 addrspace(1)* %out1, i32 %tid 131 %a = load i32, i32 addrspace(1)* %gep0, align 4 132 %b = load i32, i32 addrspace(1)* %gep1, align 4 133 %cmp = icmp ult i32 %a, %b 134 %val = select i1 %cmp, i32 %a, i32 %b 135 store i32 %val, i32 addrspace(1)* %outgep0, align 4 136 store i1 %cmp, i1 addrspace(1)* %outgep1 137 ret void 138} 139