1 ; RUN: opt < %s -indvars -S | FileCheck %s 2 3 ;; --- signed --- 4 5 define void @min.signed.1(i32* %a, i32 %a_len, i32 %n) { 6 ; CHECK-LABEL: @min.signed.1 7 entry: 8 %smin.cmp = icmp slt i32 %a_len, %n 9 %smin = select i1 %smin.cmp, i32 %a_len, i32 %n 10 %entry.cond = icmp slt i32 0, %smin 11 br i1 %entry.cond, label %loop, label %exit 12 13 loop: 14 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ] 15 %idx.inc = add i32 %idx, 1 16 %in.bounds = icmp slt i32 %idx, %a_len 17 br i1 %in.bounds, label %ok, label %latch 18 ; CHECK: br i1 true, label %ok, label %latch 19 20 ok: 21 %addr = getelementptr i32, i32* %a, i32 %idx 22 store i32 %idx, i32* %addr 23 br label %latch 24 25 latch: 26 %be.cond = icmp slt i32 %idx.inc, %smin 27 br i1 %be.cond, label %loop, label %exit 28 29 exit: 30 ret void 31 } 32 33 define void @min.signed.2(i32* %a, i32 %a_len, i32 %n) { 34 ; CHECK-LABEL: @min.signed.2 35 entry: 36 %smin.cmp = icmp slt i32 %a_len, %n 37 %smin = select i1 %smin.cmp, i32 %a_len, i32 %n 38 %entry.cond = icmp slt i32 0, %smin 39 br i1 %entry.cond, label %loop, label %exit 40 41 loop: 42 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ] 43 %idx.inc = add i32 %idx, 1 44 %in.bounds = icmp sgt i32 %a_len, %idx 45 br i1 %in.bounds, label %ok, label %latch 46 ; CHECK: br i1 true, label %ok, label %latch 47 48 ok: 49 %addr = getelementptr i32, i32* %a, i32 %idx 50 store i32 %idx, i32* %addr 51 br label %latch 52 53 latch: 54 %be.cond = icmp slt i32 %idx.inc, %smin 55 br i1 %be.cond, label %loop, label %exit 56 57 exit: 58 ret void 59 } 60 61 define void @min.signed.3(i32* %a, i32 %n) { 62 ; CHECK-LABEL: @min.signed.3 63 entry: 64 %smin.cmp = icmp slt i32 42, %n 65 %smin = select i1 %smin.cmp, i32 42, i32 %n 66 %entry.cond = icmp slt i32 0, %smin 67 br i1 %entry.cond, label %loop, label %exit 68 69 loop: 70 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ] 71 %idx.inc = add i32 %idx, 1 72 %in.bounds = icmp slt i32 %idx, 42 73 br i1 %in.bounds, label %ok, label %latch 74 ; CHECK: br i1 true, label %ok, label %latch 75 76 ok: 77 %addr = getelementptr i32, i32* %a, i32 %idx 78 store i32 %idx, i32* %addr 79 br label %latch 80 81 latch: 82 %be.cond = icmp slt i32 %idx.inc, %smin 83 br i1 %be.cond, label %loop, label %exit 84 85 exit: 86 ret void 87 } 88 89 define void @min.signed.4(i32* %a, i32 %n) { 90 ; CHECK-LABEL: @min.signed.4 91 entry: 92 %smin.cmp = icmp slt i32 42, %n 93 %smin = select i1 %smin.cmp, i32 42, i32 %n 94 %entry.cond = icmp slt i32 0, %smin 95 br i1 %entry.cond, label %loop, label %exit 96 97 loop: 98 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ] 99 %idx.inc = add i32 %idx, 1 100 %in.bounds = icmp sgt i32 42, %idx 101 br i1 %in.bounds, label %ok, label %latch 102 ; CHECK: br i1 true, label %ok, label %latch 103 104 ok: 105 %addr = getelementptr i32, i32* %a, i32 %idx 106 store i32 %idx, i32* %addr 107 br label %latch 108 109 latch: 110 %be.cond = icmp slt i32 %idx.inc, %smin 111 br i1 %be.cond, label %loop, label %exit 112 113 exit: 114 ret void 115 } 116 117 define void @max.signed.1(i32* %a, i32 %a_len, i32 %n) { 118 ; CHECK-LABEL: @max.signed.1 119 entry: 120 %smax.cmp = icmp sgt i32 %a_len, %n 121 %smax = select i1 %smax.cmp, i32 %a_len, i32 %n 122 %entry.cond = icmp sgt i32 0, %smax 123 br i1 %entry.cond, label %loop, label %exit 124 125 loop: 126 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ] 127 %idx.inc = add i32 %idx, 1 128 %in.bounds = icmp sgt i32 %idx, %a_len 129 br i1 %in.bounds, label %ok, label %latch 130 ; CHECK: br i1 true, label %ok, label %latch 131 132 ok: 133 %addr = getelementptr i32, i32* %a, i32 %idx 134 store i32 %idx, i32* %addr 135 br label %latch 136 137 latch: 138 %be.cond = icmp sgt i32 %idx.inc, %smax 139 br i1 %be.cond, label %loop, label %exit 140 141 exit: 142 ret void 143 } 144 145 define void @max.signed.2(i32* %a, i32 %a_len, i32 %n) { 146 ; CHECK-LABEL: @max.signed.2 147 entry: 148 %smax.cmp = icmp sgt i32 %a_len, %n 149 %smax = select i1 %smax.cmp, i32 %a_len, i32 %n 150 %entry.cond = icmp sgt i32 0, %smax 151 br i1 %entry.cond, label %loop, label %exit 152 153 loop: 154 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ] 155 %idx.inc = add i32 %idx, 1 156 %in.bounds = icmp slt i32 %a_len, %idx 157 br i1 %in.bounds, label %ok, label %latch 158 ; CHECK: br i1 true, label %ok, label %latch 159 160 ok: 161 %addr = getelementptr i32, i32* %a, i32 %idx 162 store i32 %idx, i32* %addr 163 br label %latch 164 165 latch: 166 %be.cond = icmp sgt i32 %idx.inc, %smax 167 br i1 %be.cond, label %loop, label %exit 168 169 exit: 170 ret void 171 } 172 173 define void @max.signed.3(i32* %a, i32 %n, i32 %init) { 174 ; CHECK-LABEL: @max.signed.3 175 entry: 176 %smax.cmp = icmp sgt i32 42, %n 177 %smax = select i1 %smax.cmp, i32 42, i32 %n 178 %entry.cond = icmp sgt i32 %init, %smax 179 br i1 %entry.cond, label %loop, label %exit 180 181 loop: 182 %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ] 183 %idx.inc = add i32 %idx, 1 184 %in.bounds = icmp sgt i32 %idx, 42 185 br i1 %in.bounds, label %ok, label %latch 186 ; CHECK: br i1 true, label %ok, label %latch 187 188 ok: 189 %addr = getelementptr i32, i32* %a, i32 %idx 190 store i32 %idx, i32* %addr 191 br label %latch 192 193 latch: 194 %be.cond = icmp sgt i32 %idx.inc, %smax 195 br i1 %be.cond, label %loop, label %exit 196 197 exit: 198 ret void 199 } 200 201 define void @max.signed.4(i32* %a, i32 %n, i32 %init) { 202 ; CHECK-LABEL: @max.signed.4 203 entry: 204 %smax.cmp = icmp sgt i32 42, %n 205 %smax = select i1 %smax.cmp, i32 42, i32 %n 206 %entry.cond = icmp sgt i32 %init, %smax 207 br i1 %entry.cond, label %loop, label %exit 208 209 loop: 210 %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ] 211 %idx.inc = add i32 %idx, 1 212 %in.bounds = icmp slt i32 42, %idx 213 br i1 %in.bounds, label %ok, label %latch 214 ; CHECK: br i1 true, label %ok, label %latch 215 216 ok: 217 %addr = getelementptr i32, i32* %a, i32 %idx 218 store i32 %idx, i32* %addr 219 br label %latch 220 221 latch: 222 %be.cond = icmp sgt i32 %idx.inc, %smax 223 br i1 %be.cond, label %loop, label %exit 224 225 exit: 226 ret void 227 } 228 229 ;; --- unsigned --- 230 231 define void @min.unsigned.1(i32* %a, i32 %a_len, i32 %n) { 232 ; CHECK-LABEL: @min.unsigned.1 233 entry: 234 %umin.cmp = icmp ult i32 %a_len, %n 235 %umin = select i1 %umin.cmp, i32 %a_len, i32 %n 236 %entry.cond = icmp ult i32 5, %umin 237 br i1 %entry.cond, label %loop, label %exit 238 239 loop: 240 %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ] 241 %idx.inc = add i32 %idx, 1 242 %in.bounds = icmp ult i32 %idx, %a_len 243 br i1 %in.bounds, label %ok, label %latch 244 ; CHECK: br i1 true, label %ok, label %latch 245 246 ok: 247 %addr = getelementptr i32, i32* %a, i32 %idx 248 store i32 %idx, i32* %addr 249 br label %latch 250 251 latch: 252 %be.cond = icmp ult i32 %idx.inc, %umin 253 br i1 %be.cond, label %loop, label %exit 254 255 exit: 256 ret void 257 } 258 259 define void @min.unsigned.2(i32* %a, i32 %a_len, i32 %n) { 260 ; CHECK-LABEL: @min.unsigned.2 261 entry: 262 %umin.cmp = icmp ult i32 %a_len, %n 263 %umin = select i1 %umin.cmp, i32 %a_len, i32 %n 264 %entry.cond = icmp ult i32 5, %umin 265 br i1 %entry.cond, label %loop, label %exit 266 267 loop: 268 %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ] 269 %idx.inc = add i32 %idx, 1 270 %in.bounds = icmp ugt i32 %a_len, %idx 271 br i1 %in.bounds, label %ok, label %latch 272 ; CHECK: br i1 true, label %ok, label %latch 273 274 ok: 275 %addr = getelementptr i32, i32* %a, i32 %idx 276 store i32 %idx, i32* %addr 277 br label %latch 278 279 latch: 280 %be.cond = icmp ult i32 %idx.inc, %umin 281 br i1 %be.cond, label %loop, label %exit 282 283 exit: 284 ret void 285 } 286 287 define void @min.unsigned.3(i32* %a, i32 %n) { 288 ; CHECK-LABEL: @min.unsigned.3 289 entry: 290 %umin.cmp = icmp ult i32 42, %n 291 %umin = select i1 %umin.cmp, i32 42, i32 %n 292 %entry.cond = icmp ult i32 5, %umin 293 br i1 %entry.cond, label %loop, label %exit 294 295 loop: 296 %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ] 297 %idx.inc = add i32 %idx, 1 298 %in.bounds = icmp ult i32 %idx, 42 299 br i1 %in.bounds, label %ok, label %latch 300 ; CHECK: br i1 true, label %ok, label %latch 301 302 ok: 303 %addr = getelementptr i32, i32* %a, i32 %idx 304 store i32 %idx, i32* %addr 305 br label %latch 306 307 latch: 308 %be.cond = icmp ult i32 %idx.inc, %umin 309 br i1 %be.cond, label %loop, label %exit 310 311 exit: 312 ret void 313 } 314 315 define void @min.unsigned.4(i32* %a, i32 %n) { 316 ; CHECK-LABEL: @min.unsigned.4 317 entry: 318 %umin.cmp = icmp ult i32 42, %n 319 %umin = select i1 %umin.cmp, i32 42, i32 %n 320 %entry.cond = icmp ult i32 5, %umin 321 br i1 %entry.cond, label %loop, label %exit 322 323 loop: 324 %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ] 325 %idx.inc = add i32 %idx, 1 326 %in.bounds = icmp ugt i32 42, %idx 327 br i1 %in.bounds, label %ok, label %latch 328 ; CHECK: br i1 true, label %ok, label %latch 329 330 ok: 331 %addr = getelementptr i32, i32* %a, i32 %idx 332 store i32 %idx, i32* %addr 333 br label %latch 334 335 latch: 336 %be.cond = icmp ult i32 %idx.inc, %umin 337 br i1 %be.cond, label %loop, label %exit 338 339 exit: 340 ret void 341 } 342 343 define void @max.unsigned.1(i32* %a, i32 %a_len, i32 %n) { 344 ; CHECK-LABEL: @max.unsigned.1 345 entry: 346 %umax.cmp = icmp ugt i32 %a_len, %n 347 %umax = select i1 %umax.cmp, i32 %a_len, i32 %n 348 %entry.cond = icmp ugt i32 5, %umax 349 br i1 %entry.cond, label %loop, label %exit 350 351 loop: 352 %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ] 353 %idx.inc = add i32 %idx, 1 354 %in.bounds = icmp ugt i32 %idx, %a_len 355 br i1 %in.bounds, label %ok, label %latch 356 ; CHECK: br i1 true, label %ok, label %latch 357 358 ok: 359 %addr = getelementptr i32, i32* %a, i32 %idx 360 store i32 %idx, i32* %addr 361 br label %latch 362 363 latch: 364 %be.cond = icmp ugt i32 %idx.inc, %umax 365 br i1 %be.cond, label %loop, label %exit 366 367 exit: 368 ret void 369 } 370 371 define void @max.unsigned.2(i32* %a, i32 %a_len, i32 %n) { 372 ; CHECK-LABEL: @max.unsigned.2 373 entry: 374 %umax.cmp = icmp ugt i32 %a_len, %n 375 %umax = select i1 %umax.cmp, i32 %a_len, i32 %n 376 %entry.cond = icmp ugt i32 5, %umax 377 br i1 %entry.cond, label %loop, label %exit 378 379 loop: 380 %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ] 381 %idx.inc = add i32 %idx, 1 382 %in.bounds = icmp ult i32 %a_len, %idx 383 br i1 %in.bounds, label %ok, label %latch 384 ; CHECK: br i1 true, label %ok, label %latch 385 386 ok: 387 %addr = getelementptr i32, i32* %a, i32 %idx 388 store i32 %idx, i32* %addr 389 br label %latch 390 391 latch: 392 %be.cond = icmp ugt i32 %idx.inc, %umax 393 br i1 %be.cond, label %loop, label %exit 394 395 exit: 396 ret void 397 } 398 399 define void @max.unsigned.3(i32* %a, i32 %n, i32 %init) { 400 ; CHECK-LABEL: @max.unsigned.3 401 entry: 402 %umax.cmp = icmp ugt i32 42, %n 403 %umax = select i1 %umax.cmp, i32 42, i32 %n 404 %entry.cond = icmp ugt i32 %init, %umax 405 br i1 %entry.cond, label %loop, label %exit 406 407 loop: 408 %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ] 409 %idx.inc = add i32 %idx, 1 410 %in.bounds = icmp ugt i32 %idx, 42 411 br i1 %in.bounds, label %ok, label %latch 412 ; CHECK: br i1 true, label %ok, label %latch 413 414 ok: 415 %addr = getelementptr i32, i32* %a, i32 %idx 416 store i32 %idx, i32* %addr 417 br label %latch 418 419 latch: 420 %be.cond = icmp ugt i32 %idx.inc, %umax 421 br i1 %be.cond, label %loop, label %exit 422 423 exit: 424 ret void 425 } 426 427 define void @max.unsigned.4(i32* %a, i32 %n, i32 %init) { 428 ; CHECK-LABEL: @max.unsigned.4 429 entry: 430 %umax.cmp = icmp ugt i32 42, %n 431 %umax = select i1 %umax.cmp, i32 42, i32 %n 432 %entry.cond = icmp ugt i32 %init, %umax 433 br i1 %entry.cond, label %loop, label %exit 434 435 loop: 436 %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ] 437 %idx.inc = add i32 %idx, 1 438 %in.bounds = icmp ult i32 42, %idx 439 br i1 %in.bounds, label %ok, label %latch 440 ; CHECK: br i1 true, label %ok, label %latch 441 442 ok: 443 %addr = getelementptr i32, i32* %a, i32 %idx 444 store i32 %idx, i32* %addr 445 br label %latch 446 447 latch: 448 %be.cond = icmp ugt i32 %idx.inc, %umax 449 br i1 %be.cond, label %loop, label %exit 450 451 exit: 452 ret void 453 } 454