@@ -270,11 +270,103 @@ define i1 @load_ptr(ptr %p) {
270
270
271
271
define i1 @load_ptr_null_valid (ptr %p ) null_pointer_is_valid {
272
272
; CHECK-LABEL: @load_ptr_null_valid(
273
- ; CHECK-NEXT: [[LOAD_P:%.*]] = load ptr, ptr [[P:%.*]], align 8, !dereferenceable !0
273
+ ; CHECK-NEXT: [[LOAD_P:%.*]] = load ptr, ptr [[P:%.*]], align 8, !dereferenceable [[META0:![0-9]+]]
274
274
; CHECK-NEXT: [[R:%.*]] = icmp ne ptr [[LOAD_P]], null
275
275
; CHECK-NEXT: ret i1 [[R]]
276
276
;
277
277
%load_p = load ptr , ptr %p , !dereferenceable !{i64 8 }
278
278
%r = icmp ne ptr %load_p , null
279
279
ret i1 %r
280
280
}
281
+
282
+ define i1 @non_eq_disjoint_or_common_op (i8 %x , i8 %y , i8 %ww , i8 %a ) {
283
+ ; CHECK-LABEL: @non_eq_disjoint_or_common_op(
284
+ ; CHECK-NEXT: [[W:%.*]] = add nuw i8 [[WW:%.*]], 1
285
+ ; CHECK-NEXT: [[Z:%.*]] = add i8 [[Y:%.*]], [[W]]
286
+ ; CHECK-NEXT: [[XY:%.*]] = or disjoint i8 [[X:%.*]], [[Y]]
287
+ ; CHECK-NEXT: [[XZ:%.*]] = or disjoint i8 [[X]], [[Z]]
288
+ ; CHECK-NEXT: [[AXY:%.*]] = add i8 [[A:%.*]], [[XY]]
289
+ ; CHECK-NEXT: [[AXZ:%.*]] = add i8 [[A]], [[XZ]]
290
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AXY]], [[AXZ]]
291
+ ; CHECK-NEXT: ret i1 [[R]]
292
+ ;
293
+ %w = add nuw i8 %ww , 1
294
+ %z = add i8 %y , %w
295
+
296
+ %xy = or disjoint i8 %x , %y
297
+ %xz = or disjoint i8 %x , %z
298
+
299
+ %axy = add i8 %a , %xy
300
+ %axz = add i8 %a , %xz
301
+ %r = icmp eq i8 %axy , %axz
302
+ ret i1 %r
303
+ }
304
+
305
+ define i1 @non_eq_disjoint_or_common_op_fail (i8 %x , i8 %y , i8 %ww , i8 %a ) {
306
+ ; CHECK-LABEL: @non_eq_disjoint_or_common_op_fail(
307
+ ; CHECK-NEXT: [[W:%.*]] = add nuw i8 [[WW:%.*]], 1
308
+ ; CHECK-NEXT: [[Z:%.*]] = add i8 [[Y:%.*]], [[W]]
309
+ ; CHECK-NEXT: [[XY:%.*]] = or i8 [[X:%.*]], [[Y]]
310
+ ; CHECK-NEXT: [[XZ:%.*]] = or disjoint i8 [[X]], [[Z]]
311
+ ; CHECK-NEXT: [[AXY:%.*]] = add i8 [[A:%.*]], [[XY]]
312
+ ; CHECK-NEXT: [[AXZ:%.*]] = add i8 [[A]], [[XZ]]
313
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AXY]], [[AXZ]]
314
+ ; CHECK-NEXT: ret i1 [[R]]
315
+ ;
316
+ %w = add nuw i8 %ww , 1
317
+ %z = add i8 %y , %w
318
+
319
+ %xy = or i8 %x , %y
320
+ %xz = or disjoint i8 %x , %z
321
+
322
+ %axy = add i8 %a , %xy
323
+ %axz = add i8 %a , %xz
324
+ %r = icmp eq i8 %axy , %axz
325
+ ret i1 %r
326
+ }
327
+
328
+ define i1 @non_eq_xor_common_op (i8 %x , i8 %y , i8 %ww , i8 %a ) {
329
+ ; CHECK-LABEL: @non_eq_xor_common_op(
330
+ ; CHECK-NEXT: [[W:%.*]] = add nuw i8 [[WW:%.*]], 1
331
+ ; CHECK-NEXT: [[Z:%.*]] = add i8 [[Y:%.*]], [[W]]
332
+ ; CHECK-NEXT: [[XY:%.*]] = xor i8 [[Y]], [[X:%.*]]
333
+ ; CHECK-NEXT: [[XZ:%.*]] = xor i8 [[X]], [[Z]]
334
+ ; CHECK-NEXT: [[AXY:%.*]] = add i8 [[A:%.*]], [[XY]]
335
+ ; CHECK-NEXT: [[AXZ:%.*]] = add i8 [[A]], [[XZ]]
336
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AXY]], [[AXZ]]
337
+ ; CHECK-NEXT: ret i1 [[R]]
338
+ ;
339
+ %w = add nuw i8 %ww , 1
340
+ %z = add i8 %y , %w
341
+
342
+ %xy = xor i8 %y , %x
343
+ %xz = xor i8 %x , %z
344
+
345
+ %axy = add i8 %a , %xy
346
+ %axz = add i8 %a , %xz
347
+ %r = icmp eq i8 %axy , %axz
348
+ ret i1 %r
349
+ }
350
+
351
+ define i1 @non_eq_xor_common_op_fail (i8 %x , i8 %y , i8 %ww , i8 %a ) {
352
+ ; CHECK-LABEL: @non_eq_xor_common_op_fail(
353
+ ; CHECK-NEXT: [[W:%.*]] = add nsw i8 [[WW:%.*]], 1
354
+ ; CHECK-NEXT: [[Z:%.*]] = add i8 [[Y:%.*]], [[W]]
355
+ ; CHECK-NEXT: [[XY:%.*]] = xor i8 [[Y]], [[X:%.*]]
356
+ ; CHECK-NEXT: [[XZ:%.*]] = xor i8 [[X]], [[Z]]
357
+ ; CHECK-NEXT: [[AXY:%.*]] = add i8 [[A:%.*]], [[XY]]
358
+ ; CHECK-NEXT: [[AXZ:%.*]] = add i8 [[A]], [[XZ]]
359
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AXY]], [[AXZ]]
360
+ ; CHECK-NEXT: ret i1 [[R]]
361
+ ;
362
+ %w = add nsw i8 %ww , 1
363
+ %z = add i8 %y , %w
364
+
365
+ %xy = xor i8 %y , %x
366
+ %xz = xor i8 %x , %z
367
+
368
+ %axy = add i8 %a , %xy
369
+ %axz = add i8 %a , %xz
370
+ %r = icmp eq i8 %axy , %axz
371
+ ret i1 %r
372
+ }
0 commit comments