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_imax_sge_i32 6; SI: v_max_i32_e32 7define void @v_test_imax_sge_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 sge 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_imax_sge_i32 21; SI: s_max_i32 22define void @s_test_imax_sge_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 23 %cmp = icmp sge 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: {{^}}s_test_imax_sge_imm_i32: 30; SI: s_max_i32 {{s[0-9]+}}, {{s[0-9]+}}, 9 31define void @s_test_imax_sge_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind { 32 %cmp = icmp sge i32 %a, 9 33 %val = select i1 %cmp, i32 %a, i32 9 34 store i32 %val, i32 addrspace(1)* %out, align 4 35 ret void 36} 37 38; FUNC-LABEL: {{^}}s_test_imax_sgt_imm_i32: 39; SI: s_max_i32 {{s[0-9]+}}, {{s[0-9]+}}, 9 40define void @s_test_imax_sgt_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind { 41 %cmp = icmp sgt i32 %a, 9 42 %val = select i1 %cmp, i32 %a, i32 9 43 store i32 %val, i32 addrspace(1)* %out, align 4 44 ret void 45} 46 47; FUNC-LABEL: @v_test_imax_sgt_i32 48; SI: v_max_i32_e32 49define void @v_test_imax_sgt_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind { 50 %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone 51 %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid 52 %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid 53 %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid 54 %a = load i32, i32 addrspace(1)* %gep0, align 4 55 %b = load i32, i32 addrspace(1)* %gep1, align 4 56 %cmp = icmp sgt i32 %a, %b 57 %val = select i1 %cmp, i32 %a, i32 %b 58 store i32 %val, i32 addrspace(1)* %outgep, align 4 59 ret void 60} 61 62; FUNC-LABEL: @s_test_imax_sgt_i32 63; SI: s_max_i32 64define void @s_test_imax_sgt_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 65 %cmp = icmp sgt i32 %a, %b 66 %val = select i1 %cmp, i32 %a, i32 %b 67 store i32 %val, i32 addrspace(1)* %out, align 4 68 ret void 69} 70 71; FUNC-LABEL: @v_test_umax_uge_i32 72; SI: v_max_u32_e32 73define void @v_test_umax_uge_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 uge 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_umax_uge_i32 87; SI: s_max_u32 88define void @s_test_umax_uge_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 89 %cmp = icmp uge 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_umax_ugt_i32 96; SI: v_max_u32_e32 97define void @v_test_umax_ugt_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 ugt 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_umax_ugt_i32 111; SI: s_max_u32 112define void @s_test_umax_ugt_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind { 113 %cmp = icmp ugt 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; Make sure redundant and removed 120; FUNC-LABEL: {{^}}simplify_demanded_bits_test_umax_ugt_i16: 121; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb 122; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc 123; SI: s_max_u32 [[MIN:s[0-9]+]], [[A]], [[B]] 124; SI-NEXT: v_mov_b32_e32 [[VMIN:v[0-9]+]], [[MIN]] 125; SI-NEXT: buffer_store_dword [[VMIN]] 126define void @simplify_demanded_bits_test_umax_ugt_i16(i32 addrspace(1)* %out, i16 zeroext %a, i16 zeroext %b) nounwind { 127 %a.ext = zext i16 %a to i32 128 %b.ext = zext i16 %b to i32 129 %cmp = icmp ugt i32 %a.ext, %b.ext 130 %val = select i1 %cmp, i32 %a.ext, i32 %b.ext 131 %mask = and i32 %val, 65535 132 store i32 %mask, i32 addrspace(1)* %out 133 ret void 134} 135 136; Make sure redundant sign_extend_inreg removed. 137 138; FUNC-LABEL: {{^}}simplify_demanded_bits_test_min_slt_i16: 139; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb 140; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc 141; SI: s_max_i32 [[MIN:s[0-9]+]], [[A]], [[B]] 142; SI-NEXT: v_mov_b32_e32 [[VMIN:v[0-9]+]], [[MIN]] 143; SI-NEXT: buffer_store_dword [[VMIN]] 144define void @simplify_demanded_bits_test_min_slt_i16(i32 addrspace(1)* %out, i16 signext %a, i16 signext %b) nounwind { 145 %a.ext = sext i16 %a to i32 146 %b.ext = sext i16 %b to i32 147 %cmp = icmp sgt i32 %a.ext, %b.ext 148 %val = select i1 %cmp, i32 %a.ext, i32 %b.ext 149 %shl = shl i32 %val, 16 150 %sextinreg = ashr i32 %shl, 16 151 store i32 %sextinreg, i32 addrspace(1)* %out 152 ret void 153} 154 155; FIXME: Should get match min/max through extends inserted by 156; legalization. 157 158; FUNC-LABEL: {{^}}s_test_imin_sge_i16: 159; SI: s_sext_i32_i16 160; SI: s_sext_i32_i16 161; SI: v_cmp_ge_i32_e32 162; SI: v_cndmask_b32 163define void @s_test_imin_sge_i16(i16 addrspace(1)* %out, i16 %a, i16 %b) nounwind { 164 %cmp = icmp sge i16 %a, %b 165 %val = select i1 %cmp, i16 %a, i16 %b 166 store i16 %val, i16 addrspace(1)* %out 167 ret void 168} 169