xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/trivial-phis.ll (revision 079c525f206228c3343048bb5a74a8e9a428de1a)
12d0de5f9SArthur Eubanks; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s
2be2ea29eSFlorian Hahn
3fb65aaf0SDávid Bolvanský; CHECK-LABEL: @test1
4f02a0a69SDávid Bolvanský; CHECK:       %add.lcssa.wide = phi i64 [ %indvars.iv.next, %do.body ]
520d798bdSFlorian Hahn; CHECK-NEXT:  -->  {1,+,1}<nuw><nsw><%do.body> U: [1,2147483648) S: [1,2147483648)
6be2ea29eSFlorian Hahn
792619956SNikita Popovdefine i64 @test1(i32 signext %n, ptr %A) {
8be2ea29eSFlorian Hahnentry:
9be2ea29eSFlorian Hahn  %0 = sext i32 %n to i64
10be2ea29eSFlorian Hahn  br label %do.body
11be2ea29eSFlorian Hahn
12be2ea29eSFlorian Hahndo.body:                                          ; preds = %do.body, %entry
13be2ea29eSFlorian Hahn  %indvars.iv = phi i64 [ %indvars.iv.next, %do.body ], [ 0, %entry ]
1492619956SNikita Popov  %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv
1592619956SNikita Popov  store float 1.000000e+00, ptr %arrayidx, align 4
16be2ea29eSFlorian Hahn  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
17be2ea29eSFlorian Hahn  %cmp = icmp slt i64 %indvars.iv.next, %0
18be2ea29eSFlorian Hahn  br i1 %cmp, label %do.body, label %do.end
19be2ea29eSFlorian Hahn
20be2ea29eSFlorian Hahndo.end:                                           ; preds = %do.body
21be2ea29eSFlorian Hahn  %add.lcssa.wide = phi i64 [ %indvars.iv.next, %do.body ]
22be2ea29eSFlorian Hahn  ret i64 %add.lcssa.wide
23be2ea29eSFlorian Hahn}
24be2ea29eSFlorian Hahn
25fb65aaf0SDávid Bolvanský; CHECK-LABEL: @test2
26be2ea29eSFlorian Hahn; CHECK:      %tmp24 = phi i64 [ %tmp14, %bb22 ], [ %tmp14, %bb13 ]
27*079c525fSNikita Popov; CHECK-NEXT: -->  {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807) Exits: (-2 + %arg)
28be2ea29eSFlorian Hahn
2992619956SNikita Popovdefine void @test2(i64 %arg, ptr noalias %arg1) {
30be2ea29eSFlorian Hahnbb:
31be2ea29eSFlorian Hahn  %tmp = icmp slt i64 0, %arg
32be2ea29eSFlorian Hahn  br i1 %tmp, label %bb7, label %bb48
33be2ea29eSFlorian Hahn
34be2ea29eSFlorian Hahnbb7:                                              ; preds = %bb
35be2ea29eSFlorian Hahn  br label %bb8
36be2ea29eSFlorian Hahn
37be2ea29eSFlorian Hahnbb8:                                              ; preds = %bb44, %bb7
38be2ea29eSFlorian Hahn  %tmp9 = phi i64 [ 0, %bb7 ], [ %tmp45, %bb44 ]
39be2ea29eSFlorian Hahn  %tmp10 = add nsw i64 %arg, -1
40be2ea29eSFlorian Hahn  %tmp11 = icmp slt i64 1, %tmp10
41be2ea29eSFlorian Hahn  br i1 %tmp11, label %bb12, label %bb43
42be2ea29eSFlorian Hahn
43be2ea29eSFlorian Hahnbb12:                                             ; preds = %bb8
44be2ea29eSFlorian Hahn  br label %bb13
45be2ea29eSFlorian Hahn
46be2ea29eSFlorian Hahnbb13:                                             ; preds = %bb39, %bb12
47be2ea29eSFlorian Hahn  %tmp14 = phi i64 [ 1, %bb12 ], [ %tmp40, %bb39 ]
48be2ea29eSFlorian Hahn  %tmp15 = icmp slt i64 0, %arg
49be2ea29eSFlorian Hahn  br i1 %tmp15, label %bb16, label %bb23
50be2ea29eSFlorian Hahn
51be2ea29eSFlorian Hahnbb16:                                             ; preds = %bb13
52be2ea29eSFlorian Hahn  br label %bb17
53be2ea29eSFlorian Hahn
54be2ea29eSFlorian Hahnbb17:                                             ; preds = %bb19, %bb16
55be2ea29eSFlorian Hahn  %tmp18 = phi i64 [ 0, %bb16 ], [ %tmp20, %bb19 ]
56be2ea29eSFlorian Hahn  br label %bb19
57be2ea29eSFlorian Hahn
58be2ea29eSFlorian Hahnbb19:                                             ; preds = %bb17
59be2ea29eSFlorian Hahn  %tmp20 = add nuw nsw i64 %tmp18, 1
60be2ea29eSFlorian Hahn  %tmp21 = icmp slt i64 %tmp20, %arg
61be2ea29eSFlorian Hahn  br i1 %tmp21, label %bb17, label %bb22
62be2ea29eSFlorian Hahn
63be2ea29eSFlorian Hahnbb22:                                             ; preds = %bb19
64be2ea29eSFlorian Hahn  br label %bb23
65be2ea29eSFlorian Hahn
66be2ea29eSFlorian Hahnbb23:                                             ; preds = %bb22, %bb13
67be2ea29eSFlorian Hahn  %tmp24 = phi i64 [ %tmp14, %bb22 ], [ %tmp14, %bb13 ]
68be2ea29eSFlorian Hahn  %tmp25 = icmp slt i64 0, %arg
69be2ea29eSFlorian Hahn  br i1 %tmp25, label %bb26, label %bb37
70be2ea29eSFlorian Hahn
71be2ea29eSFlorian Hahnbb26:                                             ; preds = %bb23
72be2ea29eSFlorian Hahn  br label %bb27
73be2ea29eSFlorian Hahn
74be2ea29eSFlorian Hahnbb27:                                             ; preds = %bb33, %bb26
75be2ea29eSFlorian Hahn  %tmp28 = phi i64 [ 0, %bb26 ], [ %tmp34, %bb33 ]
76be2ea29eSFlorian Hahn  %tmp29 = mul nsw i64 %tmp9, %arg
7792619956SNikita Popov  %tmp30 = getelementptr inbounds i32, ptr %arg1, i64 %tmp24
7892619956SNikita Popov  %tmp31 = getelementptr inbounds i32, ptr %tmp30, i64 %tmp29
7992619956SNikita Popov  %tmp32 = load i32, ptr %tmp31, align 4
80be2ea29eSFlorian Hahn  br label %bb33
81be2ea29eSFlorian Hahn
82be2ea29eSFlorian Hahnbb33:                                             ; preds = %bb27
83be2ea29eSFlorian Hahn  %tmp34 = add nuw nsw i64 %tmp28, 1
84be2ea29eSFlorian Hahn  %tmp35 = icmp slt i64 %tmp34, %arg
85be2ea29eSFlorian Hahn  br i1 %tmp35, label %bb27, label %bb36
86be2ea29eSFlorian Hahn
87be2ea29eSFlorian Hahnbb36:                                             ; preds = %bb33
88be2ea29eSFlorian Hahn  br label %bb37
89be2ea29eSFlorian Hahn
90be2ea29eSFlorian Hahnbb37:                                             ; preds = %bb36, %bb23
91be2ea29eSFlorian Hahn  %tmp38 = phi i64 [ %tmp24, %bb36 ], [ %tmp24, %bb23 ]
92be2ea29eSFlorian Hahn  br label %bb39
93be2ea29eSFlorian Hahn
94be2ea29eSFlorian Hahnbb39:                                             ; preds = %bb37
95be2ea29eSFlorian Hahn  %tmp40 = add nuw nsw i64 %tmp38, 1
96be2ea29eSFlorian Hahn  %tmp41 = icmp slt i64 %tmp40, %tmp10
97be2ea29eSFlorian Hahn  br i1 %tmp41, label %bb13, label %bb42
98be2ea29eSFlorian Hahn
99be2ea29eSFlorian Hahnbb42:                                             ; preds = %bb39
100be2ea29eSFlorian Hahn  br label %bb43
101be2ea29eSFlorian Hahn
102be2ea29eSFlorian Hahnbb43:                                             ; preds = %bb42, %bb8
103be2ea29eSFlorian Hahn  br label %bb44
104be2ea29eSFlorian Hahn
105be2ea29eSFlorian Hahnbb44:                                             ; preds = %bb43
106be2ea29eSFlorian Hahn  %tmp45 = add nuw nsw i64 %tmp9, 1
107be2ea29eSFlorian Hahn  %tmp46 = icmp slt i64 %tmp45, %arg
108be2ea29eSFlorian Hahn  br i1 %tmp46, label %bb8, label %bb47
109be2ea29eSFlorian Hahn
110be2ea29eSFlorian Hahnbb47:                                             ; preds = %bb44
111be2ea29eSFlorian Hahn  br label %bb48
112be2ea29eSFlorian Hahn
113be2ea29eSFlorian Hahnbb48:                                             ; preds = %bb47, %bb
114be2ea29eSFlorian Hahn  ret void
115be2ea29eSFlorian Hahn}
116be2ea29eSFlorian Hahn
117fb65aaf0SDávid Bolvanský; CHECK-LABEL: @test3
118be2ea29eSFlorian Hahn
119be2ea29eSFlorian Hahn; CHECK:      %tmp14 = phi i64 [ %tmp40, %bb39 ], [ 1, %bb8 ]
1207019624eSFlorian Hahn; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807)
121be2ea29eSFlorian Hahn; CHECK-SAME:      Exits: (-2 + %arg)       LoopDispositions: { %bb13: Computable, %bb8: Variant, %bb17_a: Invariant, %bb27: Invariant }
122be2ea29eSFlorian Hahn; CHECK:      %tmp18 = phi i64 [ %tmp20, %bb17 ], [ 0, %bb13 ]
123be2ea29eSFlorian Hahn; CHECK-NEXT: -->  {0,+,1}<nuw><nsw><%bb17_a> U: [0,9223372036854775807) S: [0,9223372036854775807)
124be2ea29eSFlorian Hahn; CHECK-SAME:      Exits: (-1 + %arg)       LoopDispositions: { %bb17_a: Computable, %bb13: Variant, %bb8: Variant }
125be2ea29eSFlorian Hahn
126be2ea29eSFlorian Hahn; CHECK:      %tmp24 = phi i64 [ %tmp14, %bb13 ], [ %tmp14, %bb17 ]
1277019624eSFlorian Hahn; CHECK-NEXT: -->  {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807)
128be2ea29eSFlorian Hahn; CHECK-SAME:      Exits: (-2 + %arg)       LoopDispositions: { %bb13: Computable, %bb8: Variant, %bb17_a: Invariant, %bb27: Invariant }
129be2ea29eSFlorian Hahn; CHECK:       %tmp28 = phi i64 [ %tmp34, %bb27 ], [ 0, %bb23 ]
130be2ea29eSFlorian Hahn; CHECK-NEXT:  -->  {0,+,1}<nuw><nsw><%bb27> U: [0,9223372036854775807) S: [0,9223372036854775807)
131be2ea29eSFlorian Hahn; CHECK-SAME:       Exits: (-1 + %arg)      LoopDispositions: { %bb27: Computable, %bb13: Variant, %bb8: Variant }
132be2ea29eSFlorian Hahn
133be2ea29eSFlorian Hahn; CHECK:      %tmp38 = phi i64 [ %tmp24, %bb23 ], [ %tmp24, %bb27 ]
1347019624eSFlorian Hahn; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807)
135be2ea29eSFlorian Hahn; CHECK-SAME:      Exits: (-2 + %arg)       LoopDispositions: { %bb13: Computable, %bb8: Variant, %bb17_a: Invariant, %bb27: Invariant }
136be2ea29eSFlorian Hahn
13792619956SNikita Popovdefine void @test3(i64 %arg, ptr %arg1) {
138be2ea29eSFlorian Hahnbb:
139be2ea29eSFlorian Hahn  %tmp = icmp slt i64 0, %arg
140be2ea29eSFlorian Hahn  br i1 %tmp, label %bb8, label %bb48
141be2ea29eSFlorian Hahn
142be2ea29eSFlorian Hahnbb8:                                              ; preds = %bb, %bb44
143be2ea29eSFlorian Hahn  %tmp9 = phi i64 [ %tmp45, %bb44 ], [ 0, %bb ]
144be2ea29eSFlorian Hahn  %tmp10 = add nsw i64 %arg, -1
145be2ea29eSFlorian Hahn  %tmp11 = icmp slt i64 1, %tmp10
146be2ea29eSFlorian Hahn  br i1 %tmp11, label %bb13, label %bb44
147be2ea29eSFlorian Hahn
148be2ea29eSFlorian Hahnbb13:                                             ; preds = %bb8, %bb39
149be2ea29eSFlorian Hahn  %tmp14 = phi i64 [ %tmp40, %bb39 ], [ 1, %bb8 ]
150be2ea29eSFlorian Hahn  %tmp15 = icmp slt i64 0, %arg
151be2ea29eSFlorian Hahn  br i1 %tmp15, label %bb17_a, label %bb23
152be2ea29eSFlorian Hahn
153be2ea29eSFlorian Hahnbb17_a:
154be2ea29eSFlorian Hahn  %tmp18 = phi i64 [ %tmp20, %bb17 ], [ 0, %bb13 ]
155be2ea29eSFlorian Hahn  %tmp20 = add nuw nsw i64 %tmp18, 1
156be2ea29eSFlorian Hahn
157be2ea29eSFlorian Hahn  br label %bb17
158be2ea29eSFlorian Hahn
159be2ea29eSFlorian Hahnbb17:                                             ; preds = %bb13, %bb17
160be2ea29eSFlorian Hahn  %tmp21 = icmp slt i64 %tmp20, %arg
161be2ea29eSFlorian Hahn  br i1 %tmp21, label %bb17_a, label %bb23
162be2ea29eSFlorian Hahn
163be2ea29eSFlorian Hahnbb23:                                             ; preds = %bb17, %bb13
164be2ea29eSFlorian Hahn  %tmp24 = phi i64 [ %tmp14, %bb13 ], [ %tmp14, %bb17 ]
165be2ea29eSFlorian Hahn  %tmp25 = icmp slt i64 0, %arg
166be2ea29eSFlorian Hahn  br i1 %tmp25, label %bb27, label %bb39
167be2ea29eSFlorian Hahn
168be2ea29eSFlorian Hahnbb27:                                             ; preds = %bb23, %bb27
169be2ea29eSFlorian Hahn  %tmp28 = phi i64 [ %tmp34, %bb27 ], [ 0, %bb23 ]
170be2ea29eSFlorian Hahn  %tmp29 = mul nsw i64 %tmp9, %arg
17192619956SNikita Popov  %tmp30 = getelementptr inbounds i32, ptr %arg1, i64 %tmp24
17292619956SNikita Popov  %tmp31 = getelementptr inbounds i32, ptr %tmp30, i64 %tmp29
17392619956SNikita Popov  %tmp32 = load i32, ptr %tmp31, align 4
174be2ea29eSFlorian Hahn  %tmp34 = add nuw nsw i64 %tmp28, 1
175be2ea29eSFlorian Hahn  %tmp35 = icmp slt i64 %tmp34, %arg
176be2ea29eSFlorian Hahn  br i1 %tmp35, label %bb27, label %bb39
177be2ea29eSFlorian Hahn
178be2ea29eSFlorian Hahnbb39:                                             ; preds = %bb23, %bb27
179be2ea29eSFlorian Hahn  %tmp38 = phi i64 [ %tmp24, %bb23 ], [ %tmp24, %bb27 ]
180be2ea29eSFlorian Hahn  %tmp40 = add nuw nsw i64 %tmp38, 1
181be2ea29eSFlorian Hahn  %tmp41 = icmp slt i64 %tmp40, %tmp10
182be2ea29eSFlorian Hahn  br i1 %tmp41, label %bb13, label %bb44
183be2ea29eSFlorian Hahn
184be2ea29eSFlorian Hahnbb44:                                             ; preds = %bb8, %bb39
185be2ea29eSFlorian Hahn  %tmp45 = add nuw nsw i64 %tmp9, 1
186be2ea29eSFlorian Hahn  %tmp46 = icmp slt i64 %tmp45, %arg
187be2ea29eSFlorian Hahn  br i1 %tmp46, label %bb8, label %bb48
188be2ea29eSFlorian Hahn
189be2ea29eSFlorian Hahnbb48:                                             ; preds = %bb44, %bb
190be2ea29eSFlorian Hahn  ret void
191be2ea29eSFlorian Hahn}
192