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