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_imax3_sgt_i32: 6; GCN: v_max3_i32 7define amdgpu_kernel void @v_test_imax3_sgt_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 sgt i32 %a, %b 17 %i0 = select i1 %icmp0, i32 %a, i32 %b 18 %icmp1 = icmp sgt i32 %i0, %c 19 %i1 = select i1 %icmp1, i32 %i0, i32 %c 20 store i32 %i1, i32 addrspace(1)* %out 21 ret void 22} 23 24; GCN-LABEL: {{^}}v_test_umax3_ugt_i32: 25; GCN: v_max3_u32 26define amdgpu_kernel void @v_test_umax3_ugt_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 ugt i32 %a, %b 36 %i0 = select i1 %icmp0, i32 %a, i32 %b 37 %icmp1 = icmp ugt i32 %i0, %c 38 %i1 = select i1 %icmp1, i32 %i0, i32 %c 39 store i32 %i1, i32 addrspace(1)* %out 40 ret void 41} 42 43; GCN-LABEL: {{^}}v_test_imax3_sgt_i16: 44; SI: v_max3_i32 45 46; VI: v_max_i16 47; VI: v_max_i16 48 49; GFX9: v_max3_i16 50define amdgpu_kernel void @v_test_imax3_sgt_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 { 51 %tid = call i32 @llvm.amdgcn.workitem.id.x() 52 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid 53 %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid 54 %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid 55 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid 56 %a = load i16, i16 addrspace(1)* %gep0 57 %b = load i16, i16 addrspace(1)* %gep1 58 %c = load i16, i16 addrspace(1)* %gep2 59 %icmp0 = icmp sgt i16 %a, %b 60 %i0 = select i1 %icmp0, i16 %a, i16 %b 61 %icmp1 = icmp sgt i16 %i0, %c 62 %i1 = select i1 %icmp1, i16 %i0, i16 %c 63 store i16 %i1, i16 addrspace(1)* %out 64 ret void 65} 66 67; GCN-LABEL: {{^}}v_test_umax3_ugt_i16: 68; SI: v_max3_u32 69 70; VI: v_max_u16 71; VI: v_max_u16 72 73; GFX9: v_max3_u16 74define amdgpu_kernel void @v_test_umax3_ugt_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %aptr, i16 addrspace(1)* %bptr, i16 addrspace(1)* %cptr) #0 { 75 %tid = call i32 @llvm.amdgcn.workitem.id.x() 76 %gep0 = getelementptr i16, i16 addrspace(1)* %aptr, i32 %tid 77 %gep1 = getelementptr i16, i16 addrspace(1)* %bptr, i32 %tid 78 %gep2 = getelementptr i16, i16 addrspace(1)* %cptr, i32 %tid 79 %outgep = getelementptr i16, i16 addrspace(1)* %out, i32 %tid 80 %a = load i16, i16 addrspace(1)* %gep0 81 %b = load i16, i16 addrspace(1)* %gep1 82 %c = load i16, i16 addrspace(1)* %gep2 83 %icmp0 = icmp ugt i16 %a, %b 84 %i0 = select i1 %icmp0, i16 %a, i16 %b 85 %icmp1 = icmp ugt i16 %i0, %c 86 %i1 = select i1 %icmp1, i16 %i0, i16 %c 87 store i16 %i1, i16 addrspace(1)* %out 88 ret void 89} 90 91; GCN-LABEL: {{^}}v_test_imax3_sgt_i8: 92; SI: v_max3_i32 93 94; VI: v_max_i16 95; VI: v_max_i16 96 97; GFX9: v_max3_i16 98define amdgpu_kernel void @v_test_imax3_sgt_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 { 99 %tid = call i32 @llvm.amdgcn.workitem.id.x() 100 %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid 101 %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid 102 %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid 103 %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid 104 %a = load i8, i8 addrspace(1)* %gep0 105 %b = load i8, i8 addrspace(1)* %gep1 106 %c = load i8, i8 addrspace(1)* %gep2 107 %icmp0 = icmp sgt i8 %a, %b 108 %i0 = select i1 %icmp0, i8 %a, i8 %b 109 %icmp1 = icmp sgt i8 %i0, %c 110 %i1 = select i1 %icmp1, i8 %i0, i8 %c 111 store i8 %i1, i8 addrspace(1)* %out 112 ret void 113} 114 115; GCN-LABEL: {{^}}v_test_umax3_ugt_i8: 116; SI: v_max3_u32 117 118; VI: v_max_u16 119; VI: v_max_u16 120 121; GFX9: v_max3_u16 122define amdgpu_kernel void @v_test_umax3_ugt_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %aptr, i8 addrspace(1)* %bptr, i8 addrspace(1)* %cptr) #0 { 123 %tid = call i32 @llvm.amdgcn.workitem.id.x() 124 %gep0 = getelementptr i8, i8 addrspace(1)* %aptr, i32 %tid 125 %gep1 = getelementptr i8, i8 addrspace(1)* %bptr, i32 %tid 126 %gep2 = getelementptr i8, i8 addrspace(1)* %cptr, i32 %tid 127 %outgep = getelementptr i8, i8 addrspace(1)* %out, i32 %tid 128 %a = load i8, i8 addrspace(1)* %gep0 129 %b = load i8, i8 addrspace(1)* %gep1 130 %c = load i8, i8 addrspace(1)* %gep2 131 %icmp0 = icmp ugt i8 %a, %b 132 %i0 = select i1 %icmp0, i8 %a, i8 %b 133 %icmp1 = icmp ugt i8 %i0, %c 134 %i1 = select i1 %icmp1, i8 %i0, i8 %c 135 store i8 %i1, i8 addrspace(1)* %out 136 ret void 137} 138 139; GCN-LABEL: {{^}}v_test_imax3_sgt_i7: 140; SI: v_max3_i32 141 142; VI: v_max_i16 143; VI: v_max_i16 144 145; GFX9: v_max3_i16 146define amdgpu_kernel void @v_test_imax3_sgt_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 { 147 %tid = call i32 @llvm.amdgcn.workitem.id.x() 148 %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid 149 %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid 150 %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid 151 %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid 152 %a = load i7, i7 addrspace(1)* %gep0 153 %b = load i7, i7 addrspace(1)* %gep1 154 %c = load i7, i7 addrspace(1)* %gep2 155 %icmp0 = icmp sgt i7 %a, %b 156 %i0 = select i1 %icmp0, i7 %a, i7 %b 157 %icmp1 = icmp sgt i7 %i0, %c 158 %i1 = select i1 %icmp1, i7 %i0, i7 %c 159 store i7 %i1, i7 addrspace(1)* %out 160 ret void 161} 162 163; GCN-LABEL: {{^}}v_test_umax3_ugt_i7: 164; SI: v_max3_u32 165 166; VI: v_max_u16 167; VI: v_max_u16 168 169; GFX9: v_max3_u16 170define amdgpu_kernel void @v_test_umax3_ugt_i7(i7 addrspace(1)* %out, i7 addrspace(1)* %aptr, i7 addrspace(1)* %bptr, i7 addrspace(1)* %cptr) #0 { 171 %tid = call i32 @llvm.amdgcn.workitem.id.x() 172 %gep0 = getelementptr i7, i7 addrspace(1)* %aptr, i32 %tid 173 %gep1 = getelementptr i7, i7 addrspace(1)* %bptr, i32 %tid 174 %gep2 = getelementptr i7, i7 addrspace(1)* %cptr, i32 %tid 175 %outgep = getelementptr i7, i7 addrspace(1)* %out, i32 %tid 176 %a = load i7, i7 addrspace(1)* %gep0 177 %b = load i7, i7 addrspace(1)* %gep1 178 %c = load i7, i7 addrspace(1)* %gep2 179 %icmp0 = icmp ugt i7 %a, %b 180 %i0 = select i1 %icmp0, i7 %a, i7 %b 181 %icmp1 = icmp ugt i7 %i0, %c 182 %i1 = select i1 %icmp1, i7 %i0, i7 %c 183 store i7 %i1, i7 addrspace(1)* %out 184 ret void 185} 186 187; GCN-LABEL: {{^}}v_test_imax3_sgt_i33: 188; GCN-NOT: v_max3 189define amdgpu_kernel void @v_test_imax3_sgt_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 { 190 %tid = call i32 @llvm.amdgcn.workitem.id.x() 191 %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid 192 %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid 193 %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid 194 %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid 195 %a = load i33, i33 addrspace(1)* %gep0 196 %b = load i33, i33 addrspace(1)* %gep1 197 %c = load i33, i33 addrspace(1)* %gep2 198 %icmp0 = icmp sgt i33 %a, %b 199 %i0 = select i1 %icmp0, i33 %a, i33 %b 200 %icmp1 = icmp sgt i33 %i0, %c 201 %i1 = select i1 %icmp1, i33 %i0, i33 %c 202 store i33 %i1, i33 addrspace(1)* %out 203 ret void 204} 205 206; GCN-LABEL: {{^}}v_test_umax3_ugt_i33: 207; GCN-NOT: v_max3 208define amdgpu_kernel void @v_test_umax3_ugt_i33(i33 addrspace(1)* %out, i33 addrspace(1)* %aptr, i33 addrspace(1)* %bptr, i33 addrspace(1)* %cptr) #0 { 209 %tid = call i32 @llvm.amdgcn.workitem.id.x() 210 %gep0 = getelementptr i33, i33 addrspace(1)* %aptr, i32 %tid 211 %gep1 = getelementptr i33, i33 addrspace(1)* %bptr, i32 %tid 212 %gep2 = getelementptr i33, i33 addrspace(1)* %cptr, i32 %tid 213 %outgep = getelementptr i33, i33 addrspace(1)* %out, i32 %tid 214 %a = load i33, i33 addrspace(1)* %gep0 215 %b = load i33, i33 addrspace(1)* %gep1 216 %c = load i33, i33 addrspace(1)* %gep2 217 %icmp0 = icmp ugt i33 %a, %b 218 %i0 = select i1 %icmp0, i33 %a, i33 %b 219 %icmp1 = icmp ugt i33 %i0, %c 220 %i1 = select i1 %icmp1, i33 %i0, i33 %c 221 store i33 %i1, i33 addrspace(1)* %out 222 ret void 223} 224 225; GCN-LABEL: {{^}}v_test_imax3_sgt_i64: 226; GCN-NOT: v_max3 227define amdgpu_kernel void @v_test_imax3_sgt_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 { 228 %tid = call i32 @llvm.amdgcn.workitem.id.x() 229 %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 230 %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid 231 %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid 232 %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 233 %a = load i64, i64 addrspace(1)* %gep0 234 %b = load i64, i64 addrspace(1)* %gep1 235 %c = load i64, i64 addrspace(1)* %gep2 236 %icmp0 = icmp sgt i64 %a, %b 237 %i0 = select i1 %icmp0, i64 %a, i64 %b 238 %icmp1 = icmp sgt i64 %i0, %c 239 %i1 = select i1 %icmp1, i64 %i0, i64 %c 240 store i64 %i1, i64 addrspace(1)* %out 241 ret void 242} 243 244; GCN-LABEL: {{^}}v_test_umax3_ugt_i64: 245; GCN-NOT: v_max3 246define amdgpu_kernel void @v_test_umax3_ugt_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr, i64 addrspace(1)* %cptr) #0 { 247 %tid = call i32 @llvm.amdgcn.workitem.id.x() 248 %gep0 = getelementptr i64, i64 addrspace(1)* %aptr, i32 %tid 249 %gep1 = getelementptr i64, i64 addrspace(1)* %bptr, i32 %tid 250 %gep2 = getelementptr i64, i64 addrspace(1)* %cptr, i32 %tid 251 %outgep = getelementptr i64, i64 addrspace(1)* %out, i32 %tid 252 %a = load i64, i64 addrspace(1)* %gep0 253 %b = load i64, i64 addrspace(1)* %gep1 254 %c = load i64, i64 addrspace(1)* %gep2 255 %icmp0 = icmp ugt i64 %a, %b 256 %i0 = select i1 %icmp0, i64 %a, i64 %b 257 %icmp1 = icmp ugt i64 %i0, %c 258 %i1 = select i1 %icmp1, i64 %i0, i64 %c 259 store i64 %i1, i64 addrspace(1)* %out 260 ret void 261} 262 263declare i32 @llvm.amdgcn.workitem.id.x() #1 264 265attributes #0 = { nounwind } 266attributes #1 = { nounwind readnone speculatable } 267