1; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
2
3; SCEV would take a long time to compute SCEV expressions for this IR.  If SCEV
4; finishes in < 1 second then the bug is fixed.
5
6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
7target triple = "x86_64--linux-gnu"
8
9define void @smax(i32 %tmp3) {
10 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'smax'
11entry:
12  br label %bb4
13
14bb4:
15  %tmp5 = phi i64 [ %tmp62, %bb61 ], [ 0, %entry ]
16  %tmp6 = trunc i64 %tmp5 to i32
17  %tmp7 = shl nsw i32 %tmp6, 8
18  %tmp8 = sub nsw i32 %tmp3, %tmp7
19  %tmp9 = icmp slt i32 %tmp8, 256
20  %tmp10 = select i1 %tmp9, i32 %tmp8, i32 256
21  %tmp11 = add nsw i32 %tmp10, 1
22  %tmp12 = icmp sgt i32 %tmp8, %tmp11
23  %tmp13 = select i1 %tmp12, i32 %tmp11, i32 %tmp8
24  %tmp14 = icmp slt i32 %tmp13, 256
25  %tmp15 = select i1 %tmp14, i32 %tmp13, i32 256
26  %tmp16 = add nsw i32 %tmp15, 1
27  %tmp17 = icmp sgt i32 %tmp8, %tmp16
28  %tmp18 = select i1 %tmp17, i32 %tmp16, i32 %tmp8
29  %tmp19 = icmp slt i32 %tmp18, 256
30  %tmp20 = select i1 %tmp19, i32 %tmp18, i32 256
31  %tmp21 = add nsw i32 %tmp20, 1
32  %tmp22 = icmp sgt i32 %tmp8, %tmp21
33  %tmp23 = select i1 %tmp22, i32 %tmp21, i32 %tmp8
34  %tmp24 = icmp slt i32 %tmp23, 256
35  %tmp25 = select i1 %tmp24, i32 %tmp23, i32 256
36  %tmp26 = add nsw i32 %tmp25, 1
37  %tmp27 = icmp sgt i32 %tmp8, %tmp26
38  %tmp28 = select i1 %tmp27, i32 %tmp26, i32 %tmp8
39  %tmp29 = icmp slt i32 %tmp28, 256
40  %tmp30 = select i1 %tmp29, i32 %tmp28, i32 256
41  %tmp31 = add nsw i32 %tmp30, 1
42  %tmp32 = icmp sgt i32 %tmp8, %tmp31
43  %tmp33 = select i1 %tmp32, i32 %tmp31, i32 %tmp8
44  %tmp34 = icmp slt i32 %tmp33, 256
45  %tmp35 = select i1 %tmp34, i32 %tmp33, i32 256
46  %tmp36 = add nsw i32 %tmp35, 1
47  %tmp37 = icmp sgt i32 %tmp8, %tmp36
48  %tmp38 = select i1 %tmp37, i32 %tmp36, i32 %tmp8
49  %tmp39 = icmp slt i32 %tmp38, 256
50  %tmp40 = select i1 %tmp39, i32 %tmp38, i32 256
51  %tmp41 = add nsw i32 %tmp40, 1
52  %tmp42 = icmp sgt i32 %tmp8, %tmp41
53  %tmp43 = select i1 %tmp42, i32 %tmp41, i32 %tmp8
54  %tmp44 = add nsw i32 %tmp10, 7
55  %tmp45 = icmp slt i32 %tmp43, 256
56  %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256
57; CHECK:  %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256
58; CHECK-NEXT:  -->  (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>) U: [-2147483648,257) S: [-2147483648,257)
59  %tmp47 = icmp sgt i32 %tmp44, %tmp46
60  %tmp48 = select i1 %tmp47, i32 %tmp44, i32 %tmp46
61  %tmp49 = ashr i32 %tmp48, 3
62  %tmp50 = icmp sgt i32 %tmp49, 0
63  %tmp51 = select i1 %tmp50, i32 %tmp49, i32 0
64  %tmp52 = zext i32 %tmp51 to i64
65  br label %bb53
66
67bb53:
68  %tmp54 = phi i64 [ undef, %bb4 ], [ %tmp59, %bb53 ]
69  %tmp55 = trunc i64 %tmp54 to i32
70  %tmp56 = shl nsw i32 %tmp55, 3
71  %tmp57 = sext i32 %tmp56 to i64
72  %tmp58 = getelementptr inbounds i8, i8* null, i64 %tmp57
73  store i8 undef, i8* %tmp58, align 8
74  %tmp59 = add nsw i64 %tmp54, 1
75  %tmp60 = icmp eq i64 %tmp59, %tmp52
76  br i1 %tmp60, label %bb61, label %bb53
77
78bb61:
79  %tmp62 = add nuw nsw i64 %tmp5, 1
80  br label %bb4
81}
82
83
84define void @umax(i32 %tmp3) {
85; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'umax'
86entry:
87  br label %bb4
88
89bb4:
90  %tmp5 = phi i64 [ %tmp62, %bb61 ], [ 0, %entry ]
91  %tmp6 = trunc i64 %tmp5 to i32
92  %tmp7 = shl nsw i32 %tmp6, 8
93  %tmp8 = sub nsw i32 %tmp3, %tmp7
94  %tmp9 = icmp ult i32 %tmp8, 256
95  %tmp10 = select i1 %tmp9, i32 %tmp8, i32 256
96  %tmp11 = add nsw i32 %tmp10, 1
97  %tmp12 = icmp ugt i32 %tmp8, %tmp11
98  %tmp13 = select i1 %tmp12, i32 %tmp11, i32 %tmp8
99  %tmp14 = icmp ult i32 %tmp13, 256
100  %tmp15 = select i1 %tmp14, i32 %tmp13, i32 256
101  %tmp16 = add nsw i32 %tmp15, 1
102  %tmp17 = icmp ugt i32 %tmp8, %tmp16
103  %tmp18 = select i1 %tmp17, i32 %tmp16, i32 %tmp8
104  %tmp19 = icmp ult i32 %tmp18, 256
105  %tmp20 = select i1 %tmp19, i32 %tmp18, i32 256
106  %tmp21 = add nsw i32 %tmp20, 1
107  %tmp22 = icmp ugt i32 %tmp8, %tmp21
108  %tmp23 = select i1 %tmp22, i32 %tmp21, i32 %tmp8
109  %tmp24 = icmp ult i32 %tmp23, 256
110  %tmp25 = select i1 %tmp24, i32 %tmp23, i32 256
111  %tmp26 = add nsw i32 %tmp25, 1
112  %tmp27 = icmp ugt i32 %tmp8, %tmp26
113  %tmp28 = select i1 %tmp27, i32 %tmp26, i32 %tmp8
114  %tmp29 = icmp ult i32 %tmp28, 256
115  %tmp30 = select i1 %tmp29, i32 %tmp28, i32 256
116  %tmp31 = add nsw i32 %tmp30, 1
117  %tmp32 = icmp ugt i32 %tmp8, %tmp31
118  %tmp33 = select i1 %tmp32, i32 %tmp31, i32 %tmp8
119  %tmp34 = icmp ult i32 %tmp33, 256
120  %tmp35 = select i1 %tmp34, i32 %tmp33, i32 256
121  %tmp36 = add nsw i32 %tmp35, 1
122  %tmp37 = icmp ugt i32 %tmp8, %tmp36
123  %tmp38 = select i1 %tmp37, i32 %tmp36, i32 %tmp8
124  %tmp39 = icmp ult i32 %tmp38, 256
125  %tmp40 = select i1 %tmp39, i32 %tmp38, i32 256
126  %tmp41 = add nsw i32 %tmp40, 1
127  %tmp42 = icmp ugt i32 %tmp8, %tmp41
128  %tmp43 = select i1 %tmp42, i32 %tmp41, i32 %tmp8
129  %tmp44 = add nsw i32 %tmp10, 7
130  %tmp45 = icmp ult i32 %tmp43, 256
131  %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256
132; CHECK:  %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256
133; CHECK-NEXT:  --> (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>) U: [0,257) S: [0,257)
134  %tmp47 = icmp ugt i32 %tmp44, %tmp46
135  %tmp48 = select i1 %tmp47, i32 %tmp44, i32 %tmp46
136  %tmp49 = ashr i32 %tmp48, 3
137  %tmp50 = icmp ugt i32 %tmp49, 0
138  %tmp51 = select i1 %tmp50, i32 %tmp49, i32 0
139  %tmp52 = zext i32 %tmp51 to i64
140  br label %bb53
141
142bb53:
143  %tmp54 = phi i64 [ undef, %bb4 ], [ %tmp59, %bb53 ]
144  %tmp55 = trunc i64 %tmp54 to i32
145  %tmp56 = shl nsw i32 %tmp55, 3
146  %tmp57 = sext i32 %tmp56 to i64
147  %tmp58 = getelementptr inbounds i8, i8* null, i64 %tmp57
148  store i8 undef, i8* %tmp58, align 8
149  %tmp59 = add nsw i64 %tmp54, 1
150  %tmp60 = icmp eq i64 %tmp59, %tmp52
151  br i1 %tmp60, label %bb61, label %bb53
152
153bb61:
154  %tmp62 = add nuw nsw i64 %tmp5, 1
155  br label %bb4
156}
157