Oops, make this test the right thing.
[oota-llvm.git] / test / Transforms / IndVarsSimplify / tripcount_compute.llx
1 ; These tests ensure that we can compute the trip count of various forms of 
2 ; loops.  If the trip count of the loop is computable, then we will know what
3 ; the exit value of the loop will be for some value, allowing us to substitute
4 ; it directly into users outside of the loop, making the loop dead.
5 ;
6 ; RUN: llvm-as < %s | opt -indvars -adce -simplifycfg | llvm-dis | not grep br
7
8 int %linear_setne() {   ;; for (i = 0; i != 100; ++i)
9 entry:
10         br label %loop
11 loop:
12         %i = phi int [ 0, %entry ], [ %i.next, %loop ]
13         %i.next = add int %i, 1
14         %c = setne int %i, 100
15         br bool %c, label %loop, label %loopexit
16 loopexit:
17         ret int %i
18 }
19
20 int %linear_setne_2() {   ;; for (i = 0; i != 100; i += 2)
21 entry:
22         br label %loop
23 loop:
24         %i = phi int [ 0, %entry ], [ %i.next, %loop ]
25         %i.next = add int %i, 2
26         %c = setne int %i, 100
27         br bool %c, label %loop, label %loopexit
28 loopexit:
29         ret int %i
30 }
31
32
33 int %linear_setne_overflow() {   ;; for (i = 1024; i != 0; i += 1024)
34 entry:
35         br label %loop
36 loop:
37         %i = phi int [ 1024, %entry ], [ %i.next, %loop ]
38         %i.next = add int %i, 1024
39         %c = setne int %i, 0
40         br bool %c, label %loop, label %loopexit
41 loopexit:
42         ret int %i
43 }
44
45 int %linear_setlt() {   ;; for (i = 0; i < 100; ++i)
46 entry:
47         br label %loop
48 loop:
49         %i = phi int [ 0, %entry ], [ %i.next, %loop ]
50         %i.next = add int %i, 1
51         %c = setlt int %i, 100
52         br bool %c, label %loop, label %loopexit
53 loopexit:
54         ret int %i
55 }
56
57 int %quadratic_setlt() {   ;; for (i = 7; i*i < 1000; i+=3)
58 entry:
59         br label %loop
60 loop:
61         %i = phi int [ 7, %entry ], [ %i.next, %loop ]
62         %i.next = add int %i, 3
63         %i2 = mul int %i, %i
64         %c = setlt int %i2, 1000
65         br bool %c, label %loop, label %loopexit
66 loopexit:
67         ret int %i
68 }
69
70 ;; Chained loop test - The exit value of the second loop depends on the exit
71 ;; value of the first being computed.
72 int %chained() {
73 entry:
74         br label %loop
75 loop:   ;; for (i = 0; i != 100; ++i)
76         %i = phi int [ 0, %entry ], [ %i.next, %loop ]
77         %i.next = add int %i, 1
78         %c = setne int %i, 100
79         br bool %c, label %loop, label %loopexit
80 loopexit:
81         br label %loop2
82 loop2:  ;; for (j = i; j != 200; ++j)
83         %j = phi int [ %i, %loopexit ], [ %j.next, %loop2 ]
84         %j.next = add int %j, 1
85         %c2 = setne int %j, 200
86         br bool %c2, label %loop2, label %loopexit2
87 loopexit2:
88         ret int %j
89 }
90