| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- ; RUN: opt < %s -indvars -S | FileCheck %s
- ;; --- signed ---
- define void @min.signed.1(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @min.signed.1
- entry:
- %smin.cmp = icmp slt i32 %a_len, %n
- %smin = select i1 %smin.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp slt i32 0, %smin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp slt i32 %idx, %a_len
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp slt i32 %idx.inc, %smin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @min.signed.2(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @min.signed.2
- entry:
- %smin.cmp = icmp slt i32 %a_len, %n
- %smin = select i1 %smin.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp slt i32 0, %smin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp sgt i32 %a_len, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp slt i32 %idx.inc, %smin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @min.signed.3(i32* %a, i32 %n) {
- ; CHECK-LABEL: @min.signed.3
- entry:
- %smin.cmp = icmp slt i32 42, %n
- %smin = select i1 %smin.cmp, i32 42, i32 %n
- %entry.cond = icmp slt i32 0, %smin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp slt i32 %idx, 42
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp slt i32 %idx.inc, %smin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @min.signed.4(i32* %a, i32 %n) {
- ; CHECK-LABEL: @min.signed.4
- entry:
- %smin.cmp = icmp slt i32 42, %n
- %smin = select i1 %smin.cmp, i32 42, i32 %n
- %entry.cond = icmp slt i32 0, %smin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp sgt i32 42, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp slt i32 %idx.inc, %smin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.signed.1(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @max.signed.1
- entry:
- %smax.cmp = icmp sgt i32 %a_len, %n
- %smax = select i1 %smax.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp sgt i32 0, %smax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp sgt i32 %idx, %a_len
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp sgt i32 %idx.inc, %smax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.signed.2(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @max.signed.2
- entry:
- %smax.cmp = icmp sgt i32 %a_len, %n
- %smax = select i1 %smax.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp sgt i32 0, %smax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp slt i32 %a_len, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp sgt i32 %idx.inc, %smax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.signed.3(i32* %a, i32 %n, i32 %init) {
- ; CHECK-LABEL: @max.signed.3
- entry:
- %smax.cmp = icmp sgt i32 42, %n
- %smax = select i1 %smax.cmp, i32 42, i32 %n
- %entry.cond = icmp sgt i32 %init, %smax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp sgt i32 %idx, 42
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp sgt i32 %idx.inc, %smax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.signed.4(i32* %a, i32 %n, i32 %init) {
- ; CHECK-LABEL: @max.signed.4
- entry:
- %smax.cmp = icmp sgt i32 42, %n
- %smax = select i1 %smax.cmp, i32 42, i32 %n
- %entry.cond = icmp sgt i32 %init, %smax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp slt i32 42, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp sgt i32 %idx.inc, %smax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- ;; --- unsigned ---
- define void @min.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @min.unsigned.1
- entry:
- %umin.cmp = icmp ult i32 %a_len, %n
- %umin = select i1 %umin.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp ult i32 5, %umin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ult i32 %idx, %a_len
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ult i32 %idx.inc, %umin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @min.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @min.unsigned.2
- entry:
- %umin.cmp = icmp ult i32 %a_len, %n
- %umin = select i1 %umin.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp ult i32 5, %umin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ugt i32 %a_len, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ult i32 %idx.inc, %umin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @min.unsigned.3(i32* %a, i32 %n) {
- ; CHECK-LABEL: @min.unsigned.3
- entry:
- %umin.cmp = icmp ult i32 42, %n
- %umin = select i1 %umin.cmp, i32 42, i32 %n
- %entry.cond = icmp ult i32 5, %umin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ult i32 %idx, 42
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ult i32 %idx.inc, %umin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @min.unsigned.4(i32* %a, i32 %n) {
- ; CHECK-LABEL: @min.unsigned.4
- entry:
- %umin.cmp = icmp ult i32 42, %n
- %umin = select i1 %umin.cmp, i32 42, i32 %n
- %entry.cond = icmp ult i32 5, %umin
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ugt i32 42, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ult i32 %idx.inc, %umin
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @max.unsigned.1
- entry:
- %umax.cmp = icmp ugt i32 %a_len, %n
- %umax = select i1 %umax.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp ugt i32 5, %umax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ugt i32 %idx, %a_len
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ugt i32 %idx.inc, %umax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
- ; CHECK-LABEL: @max.unsigned.2
- entry:
- %umax.cmp = icmp ugt i32 %a_len, %n
- %umax = select i1 %umax.cmp, i32 %a_len, i32 %n
- %entry.cond = icmp ugt i32 5, %umax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ult i32 %a_len, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ugt i32 %idx.inc, %umax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.unsigned.3(i32* %a, i32 %n, i32 %init) {
- ; CHECK-LABEL: @max.unsigned.3
- entry:
- %umax.cmp = icmp ugt i32 42, %n
- %umax = select i1 %umax.cmp, i32 42, i32 %n
- %entry.cond = icmp ugt i32 %init, %umax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ugt i32 %idx, 42
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ugt i32 %idx.inc, %umax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
- define void @max.unsigned.4(i32* %a, i32 %n, i32 %init) {
- ; CHECK-LABEL: @max.unsigned.4
- entry:
- %umax.cmp = icmp ugt i32 42, %n
- %umax = select i1 %umax.cmp, i32 42, i32 %n
- %entry.cond = icmp ugt i32 %init, %umax
- br i1 %entry.cond, label %loop, label %exit
- loop:
- %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
- %idx.inc = add i32 %idx, 1
- %in.bounds = icmp ult i32 42, %idx
- br i1 %in.bounds, label %ok, label %latch
- ; CHECK: br i1 true, label %ok, label %latch
- ok:
- %addr = getelementptr i32, i32* %a, i32 %idx
- store i32 %idx, i32* %addr
- br label %latch
- latch:
- %be.cond = icmp ugt i32 %idx.inc, %umax
- br i1 %be.cond, label %loop, label %exit
- exit:
- ret void
- }
|