Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Analysis / ScalarEvolution / avoid-assume-hang.ll
blobbca1d50bced796179b672b319bb3f12cbc53bd8f
1 ; RUN: opt %s -passes=always-inline | opt -passes='print<scalar-evolution>'
2 ; There was optimization bug in ScalarEvolution, that causes too long
3 ; compute time and stack overflow crash.
5 declare void @body(i32)
6 declare void @llvm.assume(i1)
8 define available_externally void @assume1(i64 %i.ext, i64 %a) alwaysinline {
9   %cmp0 = icmp ne i64 %i.ext, %a
10   call void @llvm.assume(i1 %cmp0)
12   %a1 = add i64 %a, 1
13   %cmp1 = icmp ne i64 %i.ext, %a1
14   call void @llvm.assume(i1 %cmp1)
16   %a2 = add i64 %a1, 1
17   %cmp2 = icmp ne i64 %i.ext, %a2
18   call void @llvm.assume(i1 %cmp2)
20   %a3 = add i64 %a2, 1
21   %cmp3 = icmp ne i64 %i.ext, %a3
22   call void @llvm.assume(i1 %cmp3)
24   %a4 = add i64 %a3, 1
25   %cmp4 = icmp ne i64 %i.ext, %a4
26   call void @llvm.assume(i1 %cmp4)
28   ret void
31 define available_externally void @assume2(i64 %i.ext, i64 %a) alwaysinline {
32   call void @assume1(i64 %i.ext, i64 %a)
34   %a1 = add i64 %a, 5
35   %cmp1 = icmp ne i64 %i.ext, %a1
36   call void @assume1(i64 %i.ext, i64 %a1)
38   %a2 = add i64 %a1, 5
39   %cmp2 = icmp ne i64 %i.ext, %a2
40   call void @assume1(i64 %i.ext, i64 %a2)
42   %a3 = add i64 %a2, 5
43   %cmp3 = icmp ne i64 %i.ext, %a3
44   call void @assume1(i64 %i.ext, i64 %a3)
46   %a4 = add i64 %a3, 5
47   %cmp4 = icmp ne i64 %i.ext, %a4
48   call void @assume1(i64 %i.ext, i64 %a4)
50   ret void
53 define available_externally void @assume3(i64 %i.ext, i64 %a) alwaysinline {
54   call void @assume2(i64 %i.ext, i64 %a)
56   %a1 = add i64 %a, 25
57   %cmp1 = icmp ne i64 %i.ext, %a1
58   call void @assume2(i64 %i.ext, i64 %a1)
60   %a2 = add i64 %a1, 25
61   %cmp2 = icmp ne i64 %i.ext, %a2
62   call void @assume2(i64 %i.ext, i64 %a2)
64   %a3 = add i64 %a2, 25
65   %cmp3 = icmp ne i64 %i.ext, %a3
66   call void @assume2(i64 %i.ext, i64 %a3)
68   %a4 = add i64 %a3, 25
69   %cmp4 = icmp ne i64 %i.ext, %a4
70   call void @assume2(i64 %i.ext, i64 %a4)
72   ret void
75 define available_externally void @assume4(i64 %i.ext, i64 %a) alwaysinline {
76   call void @assume3(i64 %i.ext, i64 %a)
78   %a1 = add i64 %a, 125
79   %cmp1 = icmp ne i64 %i.ext, %a1
80   call void @assume3(i64 %i.ext, i64 %a1)
82   %a2 = add i64 %a1, 125
83   %cmp2 = icmp ne i64 %i.ext, %a2
84   call void @assume3(i64 %i.ext, i64 %a2)
86   %a3 = add i64 %a2, 125
87   %cmp3 = icmp ne i64 %i.ext, %a3
88   call void @assume3(i64 %i.ext, i64 %a3)
90   %a4 = add i64 %a3, 125
91   %cmp4 = icmp ne i64 %i.ext, %a4
92   call void @assume3(i64 %i.ext, i64 %a4)
94   ret void
97 define available_externally void @assume5(i64 %i.ext, i64 %a) alwaysinline {
98   call void @assume4(i64 %i.ext, i64 %a)
100   %a1 = add i64 %a, 625
101   %cmp1 = icmp ne i64 %i.ext, %a1
102   call void @assume4(i64 %i.ext, i64 %a1)
104   %a2 = add i64 %a1, 625
105   %cmp2 = icmp ne i64 %i.ext, %a2
106   call void @assume4(i64 %i.ext, i64 %a2)
108   %a3 = add i64 %a2, 625
109   %cmp3 = icmp ne i64 %i.ext, %a3
110   call void @assume4(i64 %i.ext, i64 %a3)
112   %a4 = add i64 %a3, 625
113   %cmp4 = icmp ne i64 %i.ext, %a4
114   call void @assume4(i64 %i.ext, i64 %a4)
116   ret void
119 define void @fn(i32 %init) {
120 entry:
121   br label %loop
123 loop:
124   %i = phi i32 [%init, %entry], [%next, %loop]
125   call void @body(i32 %i)
127   %i.ext = zext i32 %i to i64
129   call void @assume5(i64 %i.ext, i64 500000000)
131   %i.next = add i64 %i.ext, 1
132   %next = trunc i64 %i.next to i32
133   %done = icmp eq i32 %i, 500000000
135   br i1 %done, label %exit, label %loop
137 exit:
138   ret void