llvm.org GIT mirror llvm / aeb864e
[NFC][InstSimplify] Some tests for dropping null check after uadd.with.overflow of non-null (PR43246) https://rise4fun.com/Alive/WRzq Name: C <= Y && Y != 0 --> C <= Y iff C != 0 Pre: C != 0 %y_is_nonnull = icmp ne i64 %y, 0 %no_overflow = icmp ule i64 C, %y %r = and i1 %y_is_nonnull, %no_overflow => %r = %no_overflow Name: C <= Y || Y != 0 --> Y != 0 iff C != 0 Pre: C != 0 %y_is_nonnull = icmp ne i64 %y, 0 %no_overflow = icmp ule i64 C, %y %r = or i1 %y_is_nonnull, %no_overflow => %r = %y_is_nonnull Name: C > Y || Y == 0 --> C > Y iff C != 0 Pre: C != 0 %y_is_null = icmp eq i64 %y, 0 %overflow = icmp ugt i64 C, %y %r = or i1 %y_is_null, %overflow => %r = %overflow Name: C > Y && Y == 0 --> Y == 0 iff C != 0 Pre: C != 0 %y_is_null = icmp eq i64 %y, 0 %overflow = icmp ugt i64 C, %y %r = and i1 %y_is_null, %overflow => %r = %y_is_null https://bugs.llvm.org/show_bug.cgi?id=43246 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371339 91177308-0d34-0410-b5e6-96231b3b80d8 Roman Lebedev a month ago
1 changed file(s) with 278 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1 ; RUN: opt %s -instsimplify -S | FileCheck %s
2
3 ; Here we have add some offset to a non-null pointer,
4 ; and check that the result does not overflow and is not a null pointer.
5 ; But since the base pointer is already non-null, and we check for overflow,
6 ; that will already catch the get null pointer,
7 ; so the separate null check is redundant and can be dropped.
8
9 define i1 @t0(i8* nonnull %base, i64 %offset) {
10 ; CHECK-LABEL: @t0(
11 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
12 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
13 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
14 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp uge i64 [[ADJUSTED]], [[BASE_INT]]
15 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
16 ; CHECK-NEXT: ret i1 [[RES]]
17 ;
18 %base_int = ptrtoint i8* %base to i64
19 %adjusted = add i64 %base_int, %offset
20 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
21 %no_overflow_during_adjustment = icmp uge i64 %adjusted, %base_int
22 %res = and i1 %non_null_after_adjustment, %no_overflow_during_adjustment
23 ret i1 %res
24 }
25 define i1 @t1(i8* nonnull %base, i64 %offset) {
26 ; CHECK-LABEL: @t1(
27 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
28 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
29 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
30 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ule i64 [[BASE_INT]], [[ADJUSTED]]
31 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
32 ; CHECK-NEXT: ret i1 [[RES]]
33 ;
34 %base_int = ptrtoint i8* %base to i64
35 %adjusted = add i64 %base_int, %offset
36 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
37 %no_overflow_during_adjustment = icmp ule i64 %base_int, %adjusted ; swapped
38 %res = and i1 %non_null_after_adjustment, %no_overflow_during_adjustment
39 ret i1 %res
40 }
41 define i1 @t2(i8* nonnull %base, i64 %offset) {
42 ; CHECK-LABEL: @t2(
43 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
44 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
45 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
46 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp uge i64 [[ADJUSTED]], [[BASE_INT]]
47 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
48 ; CHECK-NEXT: ret i1 [[RES]]
49 ;
50 %base_int = ptrtoint i8* %base to i64
51 %adjusted = add i64 %base_int, %offset
52 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
53 %no_overflow_during_adjustment = icmp uge i64 %adjusted, %base_int
54 %res = and i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
55 ret i1 %res
56 }
57 define i1 @t3(i8* nonnull %base, i64 %offset) {
58 ; CHECK-LABEL: @t3(
59 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
60 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
61 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
62 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ule i64 [[BASE_INT]], [[ADJUSTED]]
63 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
64 ; CHECK-NEXT: ret i1 [[RES]]
65 ;
66 %base_int = ptrtoint i8* %base to i64
67 %adjusted = add i64 %base_int, %offset
68 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
69 %no_overflow_during_adjustment = icmp ule i64 %base_int, %adjusted ; swapped
70 %res = and i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
71 ret i1 %res
72 }
73
74 ; If the joining operator was 'or', i.e. we check that either we produced null
75 ; pointer, or no overflow happened, then the overflow check itself is redundant.
76
77 define i1 @t4(i8* nonnull %base, i64 %offset) {
78 ; CHECK-LABEL: @t4(
79 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
80 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
81 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
82 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp uge i64 [[ADJUSTED]], [[BASE_INT]]
83 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
84 ; CHECK-NEXT: ret i1 [[RES]]
85 ;
86 %base_int = ptrtoint i8* %base to i64
87 %adjusted = add i64 %base_int, %offset
88 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
89 %no_overflow_during_adjustment = icmp uge i64 %adjusted, %base_int
90 %res = or i1 %non_null_after_adjustment, %no_overflow_during_adjustment
91 ret i1 %res
92 }
93 define i1 @t5(i8* nonnull %base, i64 %offset) {
94 ; CHECK-LABEL: @t5(
95 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
96 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
97 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
98 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ule i64 [[BASE_INT]], [[ADJUSTED]]
99 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
100 ; CHECK-NEXT: ret i1 [[RES]]
101 ;
102 %base_int = ptrtoint i8* %base to i64
103 %adjusted = add i64 %base_int, %offset
104 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
105 %no_overflow_during_adjustment = icmp ule i64 %base_int, %adjusted ; swapped
106 %res = or i1 %non_null_after_adjustment, %no_overflow_during_adjustment
107 ret i1 %res
108 }
109 define i1 @t6(i8* nonnull %base, i64 %offset) {
110 ; CHECK-LABEL: @t6(
111 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
112 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
113 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
114 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp uge i64 [[ADJUSTED]], [[BASE_INT]]
115 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
116 ; CHECK-NEXT: ret i1 [[RES]]
117 ;
118 %base_int = ptrtoint i8* %base to i64
119 %adjusted = add i64 %base_int, %offset
120 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
121 %no_overflow_during_adjustment = icmp uge i64 %adjusted, %base_int
122 %res = or i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
123 ret i1 %res
124 }
125 define i1 @t7(i8* nonnull %base, i64 %offset) {
126 ; CHECK-LABEL: @t7(
127 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
128 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
129 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp ne i64 [[ADJUSTED]], 0
130 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ule i64 [[BASE_INT]], [[ADJUSTED]]
131 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
132 ; CHECK-NEXT: ret i1 [[RES]]
133 ;
134 %base_int = ptrtoint i8* %base to i64
135 %adjusted = add i64 %base_int, %offset
136 %non_null_after_adjustment = icmp ne i64 %adjusted, 0
137 %no_overflow_during_adjustment = icmp ule i64 %base_int, %adjusted ; swapped
138 %res = or i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
139 ret i1 %res
140 }
141
142 ; Or, we could be checking the reverse condition, that we either get null pointer,
143 ; or overflow happens, then again, the standalone null check is redundant and
144 ; can be dropped.
145
146 define i1 @t8(i8* nonnull %base, i64 %offset) {
147 ; CHECK-LABEL: @t8(
148 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
149 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
150 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
151 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ult i64 [[ADJUSTED]], [[BASE_INT]]
152 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
153 ; CHECK-NEXT: ret i1 [[RES]]
154 ;
155 %base_int = ptrtoint i8* %base to i64
156 %adjusted = add i64 %base_int, %offset
157 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
158 %no_overflow_during_adjustment = icmp ult i64 %adjusted, %base_int
159 %res = or i1 %non_null_after_adjustment, %no_overflow_during_adjustment
160 ret i1 %res
161 }
162 define i1 @t9(i8* nonnull %base, i64 %offset) {
163 ; CHECK-LABEL: @t9(
164 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
165 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
166 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
167 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ugt i64 [[BASE_INT]], [[ADJUSTED]]
168 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
169 ; CHECK-NEXT: ret i1 [[RES]]
170 ;
171 %base_int = ptrtoint i8* %base to i64
172 %adjusted = add i64 %base_int, %offset
173 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
174 %no_overflow_during_adjustment = icmp ugt i64 %base_int, %adjusted ; swapped
175 %res = or i1 %non_null_after_adjustment, %no_overflow_during_adjustment
176 ret i1 %res
177 }
178 define i1 @t10(i8* nonnull %base, i64 %offset) {
179 ; CHECK-LABEL: @t10(
180 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
181 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
182 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
183 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ult i64 [[ADJUSTED]], [[BASE_INT]]
184 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
185 ; CHECK-NEXT: ret i1 [[RES]]
186 ;
187 %base_int = ptrtoint i8* %base to i64
188 %adjusted = add i64 %base_int, %offset
189 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
190 %no_overflow_during_adjustment = icmp ult i64 %adjusted, %base_int
191 %res = or i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
192 ret i1 %res
193 }
194 define i1 @t11(i8* nonnull %base, i64 %offset) {
195 ; CHECK-LABEL: @t11(
196 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
197 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
198 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
199 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ugt i64 [[BASE_INT]], [[ADJUSTED]]
200 ; CHECK-NEXT: [[RES:%.*]] = or i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
201 ; CHECK-NEXT: ret i1 [[RES]]
202 ;
203 %base_int = ptrtoint i8* %base to i64
204 %adjusted = add i64 %base_int, %offset
205 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
206 %no_overflow_during_adjustment = icmp ugt i64 %base_int, %adjusted ; swapped
207 %res = or i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
208 ret i1 %res
209 }
210
211 ; If the joining operator was 'and', i.e. we check that we both get null pointer
212 ; AND overflow happens, then the overflow check is redundant.
213
214 define i1 @t12(i8* nonnull %base, i64 %offset) {
215 ; CHECK-LABEL: @t12(
216 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
217 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
218 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
219 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ult i64 [[ADJUSTED]], [[BASE_INT]]
220 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
221 ; CHECK-NEXT: ret i1 [[RES]]
222 ;
223 %base_int = ptrtoint i8* %base to i64
224 %adjusted = add i64 %base_int, %offset
225 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
226 %no_overflow_during_adjustment = icmp ult i64 %adjusted, %base_int
227 %res = and i1 %non_null_after_adjustment, %no_overflow_during_adjustment
228 ret i1 %res
229 }
230 define i1 @t13(i8* nonnull %base, i64 %offset) {
231 ; CHECK-LABEL: @t13(
232 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
233 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
234 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
235 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ugt i64 [[BASE_INT]], [[ADJUSTED]]
236 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NON_NULL_AFTER_ADJUSTMENT]], [[NO_OVERFLOW_DURING_ADJUSTMENT]]
237 ; CHECK-NEXT: ret i1 [[RES]]
238 ;
239 %base_int = ptrtoint i8* %base to i64
240 %adjusted = add i64 %base_int, %offset
241 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
242 %no_overflow_during_adjustment = icmp ugt i64 %base_int, %adjusted ; swapped
243 %res = and i1 %non_null_after_adjustment, %no_overflow_during_adjustment
244 ret i1 %res
245 }
246 define i1 @t14(i8* nonnull %base, i64 %offset) {
247 ; CHECK-LABEL: @t14(
248 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
249 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
250 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
251 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ult i64 [[ADJUSTED]], [[BASE_INT]]
252 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
253 ; CHECK-NEXT: ret i1 [[RES]]
254 ;
255 %base_int = ptrtoint i8* %base to i64
256 %adjusted = add i64 %base_int, %offset
257 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
258 %no_overflow_during_adjustment = icmp ult i64 %adjusted, %base_int
259 %res = and i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
260 ret i1 %res
261 }
262 define i1 @t15(i8* nonnull %base, i64 %offset) {
263 ; CHECK-LABEL: @t15(
264 ; CHECK-NEXT: [[BASE_INT:%.*]] = ptrtoint i8* [[BASE:%.*]] to i64
265 ; CHECK-NEXT: [[ADJUSTED:%.*]] = add i64 [[BASE_INT]], [[OFFSET:%.*]]
266 ; CHECK-NEXT: [[NON_NULL_AFTER_ADJUSTMENT:%.*]] = icmp eq i64 [[ADJUSTED]], 0
267 ; CHECK-NEXT: [[NO_OVERFLOW_DURING_ADJUSTMENT:%.*]] = icmp ugt i64 [[BASE_INT]], [[ADJUSTED]]
268 ; CHECK-NEXT: [[RES:%.*]] = and i1 [[NO_OVERFLOW_DURING_ADJUSTMENT]], [[NON_NULL_AFTER_ADJUSTMENT]]
269 ; CHECK-NEXT: ret i1 [[RES]]
270 ;
271 %base_int = ptrtoint i8* %base to i64
272 %adjusted = add i64 %base_int, %offset
273 %non_null_after_adjustment = icmp eq i64 %adjusted, 0
274 %no_overflow_during_adjustment = icmp ugt i64 %base_int, %adjusted ; swapped
275 %res = and i1 %no_overflow_during_adjustment, %non_null_after_adjustment ; swapped
276 ret i1 %res
277 }