xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll (revision 1469d82e1cb3edc939d6b93089046edfef0cf36c)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
3
4; PR1101
5
6@A = weak global [1000 x i32] zeroinitializer, align 32
7
8define void @test1(i32 %N) {
9; CHECK-LABEL: 'test1'
10; CHECK-NEXT:  Determining loop execution counts for: @test1
11; CHECK-NEXT:  Loop %bb3: backedge-taken count is i32 100
12; CHECK-NEXT:  Loop %bb3: constant max backedge-taken count is i32 100
13; CHECK-NEXT:  Loop %bb3: symbolic max backedge-taken count is i32 100
14; CHECK-NEXT:  Loop %bb3: Trip multiple is 101
15;
16entry:
17        %"alloca point" = bitcast i32 0 to i32           ; <i32> [#uses=0]
18        br label %bb3
19
20bb:             ; preds = %bb3
21        %tmp = getelementptr [1000 x i32], ptr @A, i32 0, i32 %i.0          ; <ptr> [#uses=1]
22        store i32 123, ptr %tmp
23        %tmp2 = add i32 %i.0, 1         ; <i32> [#uses=1]
24        br label %bb3
25
26bb3:            ; preds = %bb, %entry
27        %i.0 = phi i32 [ 2, %entry ], [ %tmp2, %bb ]            ; <i32> [#uses=3]
28        %SQ = mul i32 %i.0, %i.0
29        %tmp4 = mul i32 %i.0, 2
30        %tmp5 = sub i32 %SQ, %tmp4
31        %tmp3 = icmp sle i32 %tmp5, 9999          ; <i1> [#uses=1]
32        br i1 %tmp3, label %bb, label %bb5
33
34bb5:            ; preds = %bb3
35        br label %return
36
37return:         ; preds = %bb5
38        ret void
39}
40
41
42; PR10383
43; These next two used to crash.
44
45define void @test2(i1 %cmp, i64 %n, i1 %arg) {
46; CHECK-LABEL: 'test2'
47; CHECK-NEXT:  Determining loop execution counts for: @test2
48; CHECK-NEXT:  Loop %for.body2: Unpredictable backedge-taken count.
49; CHECK-NEXT:  Loop %for.body2: Unpredictable constant max backedge-taken count.
50; CHECK-NEXT:  Loop %for.body2: Unpredictable symbolic max backedge-taken count.
51; CHECK-NEXT:  Loop %for.body1: Unpredictable backedge-taken count.
52; CHECK-NEXT:  Loop %for.body1: Unpredictable constant max backedge-taken count.
53; CHECK-NEXT:  Loop %for.body1: Unpredictable symbolic max backedge-taken count.
54;
55entry:
56  br label %for.body1
57
58for.body1:
59  %a0.08 = phi i64 [ 0, %entry ], [ %inc512, %for.body1 ]
60  %inc512 = add i64 %a0.08, 1
61  br i1 %cmp, label %preheader, label %for.body1
62
63preheader:
64  br label %for.body2
65
66for.body2:
67  %indvar = phi i64 [ 0, %preheader ], [ %indvar.next, %for.body2 ]
68  %tmp111 = add i64 %n, %indvar
69  %tmp114 = mul i64 %a0.08, %indvar
70  %mul542 = mul i64 %tmp114, %tmp111
71  %indvar.next = add i64 %indvar, 1
72  br i1 %arg, label %end, label %for.body2
73
74end:
75  ret void
76}
77
78define i32 @test3(i1 %arg) {
79; CHECK-LABEL: 'test3'
80; CHECK-NEXT:  Determining loop execution counts for: @test3
81; CHECK-NEXT:  Loop %for.inc479: Unpredictable backedge-taken count.
82; CHECK-NEXT:  Loop %for.inc479: Unpredictable constant max backedge-taken count.
83; CHECK-NEXT:  Loop %for.inc479: Unpredictable symbolic max backedge-taken count.
84;
85if.then466:
86  br i1 %arg, label %for.cond539.preheader, label %for.inc479
87
88for.inc479:
89  %a2.07 = phi i32 [ %add495, %for.inc479 ], [ 0, %if.then466 ]
90  %j.36 = phi i32 [ %inc497, %for.inc479 ], [ undef, %if.then466 ]
91  %mul484 = mul nsw i32 %j.36, %j.36
92  %mul491 = mul i32 %j.36, %j.36
93  %mul493 = mul i32 %mul491, %mul484
94  %add495 = add nsw i32 %mul493, %a2.07
95  %inc497 = add nsw i32 %j.36, 1
96  br i1 %arg, label %for.cond539.preheader, label %for.inc479
97
98for.cond539.preheader:
99  unreachable
100}
101
102; PR13489
103; We used to crash on this too.
104
105define void @test4() {
106; CHECK-LABEL: 'test4'
107; CHECK-NEXT:  Determining loop execution counts for: @test4
108; CHECK-NEXT:  Loop %for.body: Unpredictable backedge-taken count.
109; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.
110; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.
111;
112entry:
113  br label %for.body
114
115for.body:                                         ; preds = %for.body, %entry
116  %v2.02 = phi i64 [ 2, %entry ], [ %phitmp, %for.body ]
117  %v1.01 = phi i64 [ -2, %entry ], [ %sub1, %for.body ]
118  %sub1 = sub i64 %v1.01, %v2.02
119  %phitmp = add i64 %v2.02, 2
120  %tobool = icmp eq i64 %sub1, %phitmp
121  br i1 %tobool, label %for.end, label %for.body
122
123for.end:                                          ; preds = %for.body
124  ret void
125}
126
127