• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; Test that we can evaluate the exit values of various expression types.  Since
2; these loops all have predictable exit values we can replace the use outside
3; of the loop with a closed-form computation, making the loop dead.
4;
5; RUN: opt < %s -indvars -loop-deletion -simplifycfg | \
6; RUN:   llvm-dis | not grep br
7
8define i32 @polynomial_constant() {
9; <label>:0
10	br label %Loop
11
12Loop:		; preds = %Loop, %0
13	%A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]		; <i32> [#uses=3]
14	%B1 = phi i32 [ 0, %0 ], [ %B2, %Loop ]		; <i32> [#uses=1]
15	%A2 = add i32 %A1, 1		; <i32> [#uses=1]
16	%B2 = add i32 %B1, %A1		; <i32> [#uses=2]
17	%C = icmp eq i32 %A1, 1000		; <i1> [#uses=1]
18	br i1 %C, label %Out, label %Loop
19
20Out:		; preds = %Loop
21	ret i32 %B2
22}
23
24define i32 @NSquare(i32 %N) {
25; <label>:0
26	br label %Loop
27
28Loop:		; preds = %Loop, %0
29	%X = phi i32 [ 0, %0 ], [ %X2, %Loop ]		; <i32> [#uses=4]
30	%X2 = add i32 %X, 1		; <i32> [#uses=1]
31	%c = icmp eq i32 %X, %N		; <i1> [#uses=1]
32	br i1 %c, label %Out, label %Loop
33
34Out:		; preds = %Loop
35	%Y = mul i32 %X, %X		; <i32> [#uses=1]
36	ret i32 %Y
37}
38
39define i32 @NSquareOver2(i32 %N) {
40; <label>:0
41	br label %Loop
42
43Loop:		; preds = %Loop, %0
44	%X = phi i32 [ 0, %0 ], [ %X2, %Loop ]		; <i32> [#uses=3]
45	%Y = phi i32 [ 15, %0 ], [ %Y2, %Loop ]		; <i32> [#uses=1]
46	%Y2 = add i32 %Y, %X		; <i32> [#uses=2]
47	%X2 = add i32 %X, 1		; <i32> [#uses=1]
48	%c = icmp eq i32 %X, %N		; <i1> [#uses=1]
49	br i1 %c, label %Out, label %Loop
50
51Out:		; preds = %Loop
52	ret i32 %Y2
53}
54
55define i32 @strength_reduced() {
56; <label>:0
57	br label %Loop
58
59Loop:		; preds = %Loop, %0
60	%A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]		; <i32> [#uses=3]
61	%B1 = phi i32 [ 0, %0 ], [ %B2, %Loop ]		; <i32> [#uses=1]
62	%A2 = add i32 %A1, 1		; <i32> [#uses=1]
63	%B2 = add i32 %B1, %A1		; <i32> [#uses=2]
64	%C = icmp eq i32 %A1, 1000		; <i1> [#uses=1]
65	br i1 %C, label %Out, label %Loop
66
67Out:		; preds = %Loop
68	ret i32 %B2
69}
70
71define i32 @chrec_equals() {
72entry:
73	br label %no_exit
74
75no_exit:		; preds = %no_exit, %entry
76	%i0 = phi i32 [ 0, %entry ], [ %i1, %no_exit ]		; <i32> [#uses=3]
77	%ISq = mul i32 %i0, %i0		; <i32> [#uses=1]
78	%i1 = add i32 %i0, 1		; <i32> [#uses=2]
79	%tmp.1 = icmp ne i32 %ISq, 10000		; <i1> [#uses=1]
80	br i1 %tmp.1, label %no_exit, label %loopexit
81
82loopexit:		; preds = %no_exit
83	ret i32 %i1
84}
85
86define i16 @cast_chrec_test() {
87; <label>:0
88	br label %Loop
89
90Loop:		; preds = %Loop, %0
91	%A1 = phi i32 [ 0, %0 ], [ %A2, %Loop ]		; <i32> [#uses=2]
92	%B1 = trunc i32 %A1 to i16		; <i16> [#uses=2]
93	%A2 = add i32 %A1, 1		; <i32> [#uses=1]
94	%C = icmp eq i16 %B1, 1000		; <i1> [#uses=1]
95	br i1 %C, label %Out, label %Loop
96
97Out:		; preds = %Loop
98	ret i16 %B1
99}
100
101define i32 @linear_div_fold() {
102entry:
103	br label %loop
104
105loop:		; preds = %loop, %entry
106	%i = phi i32 [ 4, %entry ], [ %i.next, %loop ]		; <i32> [#uses=3]
107	%i.next = add i32 %i, 8		; <i32> [#uses=1]
108	%RV = udiv i32 %i, 2		; <i32> [#uses=1]
109	%c = icmp ne i32 %i, 68		; <i1> [#uses=1]
110	br i1 %c, label %loop, label %loopexit
111
112loopexit:		; preds = %loop
113	ret i32 %RV
114}
115