| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -indvars -S | FileCheck %s | 
|  | 2 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 3 | ; These tests ensure that we can compute the trip count of various forms of | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 4 | ; loops.  If the trip count of the loop is computable, then we will know what | 
|  | 5 | ; the exit value of the loop will be for some value, allowing us to substitute | 
|  | 6 | ; it directly into users outside of the loop, making the loop dead. | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 7 |  | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 8 | ; CHECK-LABEL: @linear_setne( | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 9 | ; CHECK: ret i32 100 | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 10 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 11 | define i32 @linear_setne() { | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 12 | entry: | 
|  | 13 | br label %loop | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 14 |  | 
|  | 15 | loop:		; preds = %loop, %entry | 
|  | 16 | %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]		; <i32> [#uses=3] | 
|  | 17 | %i.next = add i32 %i, 1		; <i32> [#uses=1] | 
|  | 18 | %c = icmp ne i32 %i, 100		; <i1> [#uses=1] | 
|  | 19 | br i1 %c, label %loop, label %loopexit | 
|  | 20 |  | 
|  | 21 | loopexit:		; preds = %loop | 
|  | 22 | ret i32 %i | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 23 | } | 
|  | 24 |  | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 25 | ; CHECK-LABEL: @linear_setne_2( | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 26 | ; CHECK: ret i32 100 | 
|  | 27 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 28 | define i32 @linear_setne_2() { | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 29 | entry: | 
|  | 30 | br label %loop | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 31 |  | 
|  | 32 | loop:		; preds = %loop, %entry | 
|  | 33 | %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]		; <i32> [#uses=3] | 
|  | 34 | %i.next = add i32 %i, 2		; <i32> [#uses=1] | 
|  | 35 | %c = icmp ne i32 %i, 100		; <i1> [#uses=1] | 
|  | 36 | br i1 %c, label %loop, label %loopexit | 
|  | 37 |  | 
|  | 38 | loopexit:		; preds = %loop | 
|  | 39 | ret i32 %i | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 40 | } | 
|  | 41 |  | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 42 | ; CHECK-LABEL: @linear_setne_overflow( | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 43 | ; CHECK: ret i32 0 | 
|  | 44 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 45 | define i32 @linear_setne_overflow() { | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 46 | entry: | 
|  | 47 | br label %loop | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 48 |  | 
|  | 49 | loop:		; preds = %loop, %entry | 
|  | 50 | %i = phi i32 [ 1024, %entry ], [ %i.next, %loop ]		; <i32> [#uses=3] | 
|  | 51 | %i.next = add i32 %i, 1024		; <i32> [#uses=1] | 
|  | 52 | %c = icmp ne i32 %i, 0		; <i1> [#uses=1] | 
|  | 53 | br i1 %c, label %loop, label %loopexit | 
|  | 54 |  | 
|  | 55 | loopexit:		; preds = %loop | 
|  | 56 | ret i32 %i | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 57 | } | 
|  | 58 |  | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 59 | ; CHECK-LABEL: @linear_setlt( | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 60 | ; CHECK: ret i32 100 | 
|  | 61 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 62 | define i32 @linear_setlt() { | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 63 | entry: | 
|  | 64 | br label %loop | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 65 |  | 
|  | 66 | loop:		; preds = %loop, %entry | 
|  | 67 | %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]		; <i32> [#uses=3] | 
|  | 68 | %i.next = add i32 %i, 1		; <i32> [#uses=1] | 
|  | 69 | %c = icmp slt i32 %i, 100		; <i1> [#uses=1] | 
|  | 70 | br i1 %c, label %loop, label %loopexit | 
|  | 71 |  | 
|  | 72 | loopexit:		; preds = %loop | 
|  | 73 | ret i32 %i | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 74 | } | 
|  | 75 |  | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 76 | ; CHECK-LABEL: @quadratic_setlt( | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 77 | ; CHECK: ret i32 34 | 
|  | 78 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 79 | define i32 @quadratic_setlt() { | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 80 | entry: | 
|  | 81 | br label %loop | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 82 |  | 
|  | 83 | loop:		; preds = %loop, %entry | 
|  | 84 | %i = phi i32 [ 7, %entry ], [ %i.next, %loop ]		; <i32> [#uses=4] | 
|  | 85 | %i.next = add i32 %i, 3		; <i32> [#uses=1] | 
|  | 86 | %i2 = mul i32 %i, %i		; <i32> [#uses=1] | 
|  | 87 | %c = icmp slt i32 %i2, 1000		; <i1> [#uses=1] | 
|  | 88 | br i1 %c, label %loop, label %loopexit | 
|  | 89 |  | 
|  | 90 | loopexit:		; preds = %loop | 
|  | 91 | ret i32 %i | 
|  | 92 | } | 
|  | 93 |  | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 94 | ; CHECK-LABEL: @chained( | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 95 | ; CHECK: ret i32 200 | 
|  | 96 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 97 | define i32 @chained() { | 
|  | 98 | entry: | 
|  | 99 | br label %loop | 
|  | 100 |  | 
|  | 101 | loop:		; preds = %loop, %entry | 
|  | 102 | %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]		; <i32> [#uses=3] | 
|  | 103 | %i.next = add i32 %i, 1		; <i32> [#uses=1] | 
|  | 104 | %c = icmp ne i32 %i, 100		; <i1> [#uses=1] | 
|  | 105 | br i1 %c, label %loop, label %loopexit | 
|  | 106 |  | 
|  | 107 | loopexit:		; preds = %loop | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 108 | br label %loop2 | 
| Chris Lattner | 7637874 | 2004-04-02 20:26:04 +0000 | [diff] [blame] | 109 |  | 
| Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 110 | loop2:		; preds = %loop2, %loopexit | 
|  | 111 | %j = phi i32 [ %i, %loopexit ], [ %j.next, %loop2 ]		; <i32> [#uses=3] | 
|  | 112 | %j.next = add i32 %j, 1		; <i32> [#uses=1] | 
|  | 113 | %c2 = icmp ne i32 %j, 200		; <i1> [#uses=1] | 
|  | 114 | br i1 %c2, label %loop2, label %loopexit2 | 
|  | 115 |  | 
|  | 116 | loopexit2:		; preds = %loop2 | 
|  | 117 | ret i32 %j | 
|  | 118 | } | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 119 |  | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 120 | ; CHECK-LABEL: @chained4( | 
| Dan Gohman | ae36b1e | 2010-06-29 23:43:06 +0000 | [diff] [blame] | 121 | ; CHECK: ret i32 400 | 
|  | 122 |  | 
|  | 123 | define i32 @chained4() { | 
|  | 124 | entry: | 
|  | 125 | br label %loop | 
|  | 126 |  | 
|  | 127 | loop:                                             ; preds = %loop, %entry | 
|  | 128 | %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]  ; <i32> [#uses=3] | 
|  | 129 | %i.next = add i32 %i, 1                         ; <i32> [#uses=1] | 
|  | 130 | %c = icmp ne i32 %i.next, 100                   ; <i1> [#uses=1] | 
|  | 131 | br i1 %c, label %loop, label %loopexit | 
|  | 132 |  | 
|  | 133 | loopexit:                                         ; preds = %loop | 
|  | 134 | br label %loop2 | 
|  | 135 |  | 
|  | 136 | loop2:                                            ; preds = %loop2, %loopexit | 
|  | 137 | %j = phi i32 [ %i.next, %loopexit ], [ %j.next, %loop2 ] ; <i32> [#uses=3] | 
|  | 138 | %j.next = add i32 %j, 1                         ; <i32> [#uses=1] | 
|  | 139 | %c2 = icmp ne i32 %j.next, 200                  ; <i1> [#uses=1] | 
|  | 140 | br i1 %c2, label %loop2, label %loopexit2 | 
|  | 141 |  | 
|  | 142 | loopexit2:                                        ; preds = %loop | 
|  | 143 | br label %loop8 | 
|  | 144 |  | 
|  | 145 | loop8:                                            ; preds = %loop2, %loopexit | 
|  | 146 | %k = phi i32 [ %j.next, %loopexit2 ], [ %k.next, %loop8 ] ; <i32> [#uses=3] | 
|  | 147 | %k.next = add i32 %k, 1                         ; <i32> [#uses=1] | 
|  | 148 | %c8 = icmp ne i32 %k.next, 300                  ; <i1> [#uses=1] | 
|  | 149 | br i1 %c8, label %loop8, label %loopexit8 | 
|  | 150 |  | 
|  | 151 | loopexit8:                                        ; preds = %loop2 | 
|  | 152 | br label %loop9 | 
|  | 153 |  | 
|  | 154 | loop9:                                            ; preds = %loop2, %loopexit | 
|  | 155 | %l = phi i32 [ %k.next, %loopexit8 ], [ %l.next, %loop9 ] ; <i32> [#uses=3] | 
|  | 156 | %l.next = add i32 %l, 1                         ; <i32> [#uses=1] | 
|  | 157 | %c9 = icmp ne i32 %l.next, 400                  ; <i1> [#uses=1] | 
|  | 158 | br i1 %c9, label %loop9, label %loopexit9 | 
|  | 159 |  | 
|  | 160 | loopexit9:                                        ; preds = %loop2 | 
|  | 161 | ret i32 %l.next | 
|  | 162 | } | 
| Andrew Trick | ee5aa7f | 2014-01-15 06:42:11 +0000 | [diff] [blame] | 163 |  | 
|  | 164 | ; PR18449. Check that the early exit is reduced to never taken. | 
|  | 165 | ; | 
|  | 166 | ; CHECK-LABEL: @twoexit | 
|  | 167 | ; CHECK-LABEL: loop: | 
|  | 168 | ; CHECK: phi | 
|  | 169 | ; CHECK: br i1 false | 
|  | 170 | ; CHECK: br | 
|  | 171 | ; CHECK: ret | 
|  | 172 | define void @twoexit() { | 
|  | 173 | "function top level": | 
|  | 174 | br label %loop | 
|  | 175 |  | 
|  | 176 | loop:                                             ; preds = %body, %"function top level" | 
|  | 177 | %0 = phi i64 [ 0, %"function top level" ], [ %2, %body ] | 
|  | 178 | %1 = icmp ugt i64 %0, 2 | 
|  | 179 | br i1 %1, label %fail, label %body | 
|  | 180 |  | 
|  | 181 | fail:                                             ; preds = %loop | 
|  | 182 | tail call void @bounds_fail() | 
|  | 183 | unreachable | 
|  | 184 |  | 
|  | 185 | body:                                             ; preds = %loop | 
|  | 186 | %2 = add i64 %0, 1 | 
|  | 187 | %3 = icmp slt i64 %2, 3 | 
|  | 188 | br i1 %3, label %loop, label %out | 
|  | 189 |  | 
|  | 190 | out:                                              ; preds = %body | 
|  | 191 | ret void | 
|  | 192 | } | 
|  | 193 | declare void @bounds_fail() |