[SelectOpt] Support ADD and SUB with zext operands. (#115489)
[llvm-project.git] / llvm / test / Analysis / ScalarEvolution / pr51869-scalar-evolution-prove-implications-via-truncation.ll
blob0b7d0bd0a39d9ec1592d9f6a199315ce464b7544
1 ; RUN: opt < %s -disable-output -passes=indvars
3 ; Do not timeout (and do not crash).
5 ; This test case used to take around 10 minutes to run (well, that of course
6 ; depends on which kind of build that is used and on which kind of server the
7 ; test is executed). There is a less reduced version of this test case in
8 ; PR51869 that takes much longer time to execute (I've not seen that one
9 ; terminate within reasonable time). Maybe this test case is reduced a bit too
10 ; much if being considered as a regression tests that would timeout without
11 ; the fix. It can at least be used to show compile time explosion that
12 ; happened when using isKnownPredicate inside ScalarEvolution::isImpliedCond.
14 @v_228 = external dso_local global i32, align 1
16 ; Function Attrs: nounwind
17 define dso_local i16 @main(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %8, ptr %9, ptr %10, i1 %11) #0 {
18   br i1 %11, label %27, label %13
20 13:                                               ; preds = %12
21   %14 = load i32, ptr @v_228, align 1
22   %15 = trunc i32 %14 to i16
23   %16 = mul i16 %15, 2
24   %17 = sub i16 10, %16
25   %18 = icmp ult i16 10, %16
26   %19 = icmp ult i16 %17, 1
27   %20 = or i1 %18, %19
28   br i1 %20, label %139, label %21
30 21:                                               ; preds = %13
31   %22 = add i16 %16, 1
32   %23 = sub i16 10, %22
33   %24 = icmp ult i16 10, %22
34   %25 = icmp ult i16 %23, 1
35   %26 = or i1 %24, %25
36   br i1 %26, label %139, label %27
38 27:                                               ; preds = %21, %12
39   %28 = load i16, ptr %1, align 1
40   br label %29
42 29:                                               ; preds = %29, %27
43   %30 = phi i16 [ %28, %27 ], [ %31, %29 ]
44   %31 = add i16 %30, 1
45   %32 = icmp slt i16 %31, 28
46   br i1 %32, label %29, label %33
48 33:                                               ; preds = %29
49   %34 = load i16, ptr %2, align 1
50   br label %35
52 35:                                               ; preds = %43, %33
53   %36 = phi i16 [ %34, %33 ], [ %44, %43 ]
54   %37 = sext i16 %36 to i32
55   %38 = mul i32 %37, 2
56   %39 = sub i32 56, %38
57   %40 = icmp ult i32 56, %38
58   %41 = icmp ult i32 %39, 2
59   %42 = or i1 %40, %41
60   br i1 %42, label %139, label %43
62 43:                                               ; preds = %35
63   %44 = add i16 %36, 1
64   %45 = icmp slt i16 %44, 28
65   br i1 %45, label %35, label %46
67 46:                                               ; preds = %43
68   %47 = load i16, ptr %3, align 1
69   br label %48
71 48:                                               ; preds = %55, %46
72   %49 = phi i16 [ %47, %46 ], [ %56, %55 ]
73   %50 = mul i16 %49, 4
74   %51 = sub i16 28, %50
75   %52 = icmp ult i16 28, %50
76   %53 = icmp ult i16 %51, 4
77   %54 = or i1 %52, %53
78   br i1 %54, label %139, label %55
80 55:                                               ; preds = %48
81   %56 = add i16 %49, 1
82   %57 = icmp slt i16 %56, 7
83   br i1 %57, label %48, label %58
85 58:                                               ; preds = %55
86   %59 = load i16, ptr %4, align 1
87   br label %60
89 60:                                               ; preds = %67, %58
90   %61 = phi i16 [ %59, %58 ], [ %68, %67 ]
91   %62 = sext i16 %61 to i32
92   %63 = sub i32 1, %62
93   %64 = icmp ult i32 1, %62
94   %65 = icmp ult i32 %63, 1
95   %66 = or i1 %64, %65
96   br i1 %66, label %139, label %67
98 67:                                               ; preds = %60
99   %68 = add i16 %61, 1
100   %69 = icmp slt i16 %68, 1
101   br i1 %69, label %60, label %70
103 70:                                               ; preds = %67
104   %71 = load i16, ptr %5, align 1
105   br label %72
107 72:                                               ; preds = %79, %70
108   %73 = phi i16 [ %71, %70 ], [ %80, %79 ]
109   %74 = sext i16 %73 to i32
110   %75 = sub i32 1, %74
111   %76 = icmp ult i32 1, %74
112   %77 = icmp ult i32 %75, 1
113   %78 = or i1 %76, %77
114   br i1 %78, label %139, label %79
116 79:                                               ; preds = %72
117   %80 = add i16 %73, 1
118   %81 = icmp slt i16 %80, 1
119   br i1 %81, label %72, label %82
121 82:                                               ; preds = %79
122   %83 = load i16, ptr %6, align 1
123   br label %84
125 84:                                               ; preds = %91, %82
126   %85 = phi i16 [ %83, %82 ], [ %92, %91 ]
127   %86 = sext i16 %85 to i32
128   %87 = sub i32 1, %86
129   %88 = icmp ult i32 1, %86
130   %89 = icmp ult i32 %87, 1
131   %90 = or i1 %88, %89
132   br i1 %90, label %139, label %91
134 91:                                               ; preds = %84
135   %92 = add i16 %85, 1
136   %93 = icmp slt i16 %92, 1
137   br i1 %93, label %84, label %94
139 94:                                               ; preds = %91
140   %95 = load i16, ptr %7, align 1
141   br label %96
143 96:                                               ; preds = %103, %94
144   %97 = phi i16 [ %95, %94 ], [ %104, %103 ]
145   %98 = sext i16 %97 to i32
146   %99 = sub i32 1, %98
147   %100 = icmp ult i32 1, %98
148   %101 = icmp ult i32 %99, 1
149   %102 = or i1 %100, %101
150   br i1 %102, label %139, label %103
152 103:                                              ; preds = %96
153   %104 = add i16 %97, 1
154   %105 = icmp slt i16 %104, 1
155   br i1 %105, label %96, label %106
157 106:                                              ; preds = %103
158   %107 = load i16, ptr %8, align 1
159   br label %108
161 108:                                              ; preds = %115, %106
162   %109 = phi i16 [ %107, %106 ], [ %116, %115 ]
163   %110 = mul i16 %109, 4
164   %111 = sub i16 24, %110
165   %112 = icmp ult i16 24, %110
166   %113 = icmp ult i16 %111, 4
167   %114 = or i1 %112, %113
168   br i1 %114, label %139, label %115
170 115:                                              ; preds = %108
171   %116 = add i16 %109, 1
172   %117 = icmp slt i16 %116, 6
173   br i1 %117, label %108, label %118
175 118:                                              ; preds = %115
176   %119 = load i16, ptr %9, align 1
177   br label %120
179 120:                                              ; preds = %128, %118
180   %121 = phi i16 [ %119, %118 ], [ %129, %128 ]
181   %122 = sext i16 %121 to i32
182   %123 = mul i32 %122, 2
183   %124 = sub i32 4, %123
184   %125 = icmp ult i32 4, %123
185   %126 = icmp ult i32 %124, 2
186   %127 = or i1 %125, %126
187   br i1 %127, label %139, label %128
189 128:                                              ; preds = %120
190   %129 = add i16 %121, 1
191   %130 = icmp slt i16 %129, 2
192   br i1 %130, label %120, label %131
194 131:                                              ; preds = %128
195   %132 = load i16, ptr %10, align 1
196   br label %133
198 133:                                              ; preds = %133, %131
199   %134 = phi i16 [ %132, %131 ], [ %135, %133 ]
200   %135 = add i16 %134, 1
201   %136 = icmp slt i16 %135, 6
202   br i1 %136, label %133, label %137
204 137:                                              ; preds = %133
205   %138 = load i16, ptr %0, align 1
206   ret i16 %138
208 139:                                              ; preds = %120, %108, %96, %84, %72, %60, %48, %35, %21, %13
209   call void @llvm.trap() #2
210   unreachable
213 ; Function Attrs: cold noreturn nounwind
214 declare void @llvm.trap() #1
216 attributes #0 = { nounwind }
217 attributes #1 = { cold noreturn nounwind }
218 attributes #2 = { noreturn nounwind }