@@ -343,6 +343,271 @@ end:
343
343
ret i32 0
344
344
}
345
345
346
+ ; Test from PR75155
347
+ define i32 @simplify_slt_smax_val (i32 %a , i32 %b ) {
348
+ ; CHECK-LABEL: define i32 @simplify_slt_smax_val
349
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
350
+ ; CHECK-NEXT: start:
351
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
352
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
353
+ ; CHECK: then:
354
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
355
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
356
+ ; CHECK-NEXT: ret i32 [[MAX]]
357
+ ; CHECK: else:
358
+ ; CHECK-NEXT: ret i32 -1
359
+ ;
360
+ start:
361
+ %cmp = icmp slt i32 %a , %b
362
+ br i1 %cmp , label %then , label %else
363
+ then:
364
+ %add = add nsw i32 %a , 1
365
+ %max = call i32 @llvm.smax.i32 (i32 %b , i32 %add )
366
+ ret i32 %max
367
+ else:
368
+ ret i32 -1
369
+ }
370
+
371
+ define i32 @simplify_slt_smax_val_commuted (i32 %a , i32 %b ) {
372
+ ; CHECK-LABEL: define i32 @simplify_slt_smax_val_commuted
373
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
374
+ ; CHECK-NEXT: start:
375
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
376
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
377
+ ; CHECK: then:
378
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
379
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[ADD]], i32 [[B]])
380
+ ; CHECK-NEXT: ret i32 [[MAX]]
381
+ ; CHECK: else:
382
+ ; CHECK-NEXT: ret i32 -1
383
+ ;
384
+ start:
385
+ %cmp = icmp slt i32 %a , %b
386
+ br i1 %cmp , label %then , label %else
387
+ then:
388
+ %add = add nsw i32 %a , 1
389
+ %max = call i32 @llvm.smax.i32 (i32 %add , i32 %b )
390
+ ret i32 %max
391
+ else:
392
+ ret i32 -1
393
+ }
394
+
395
+ define i32 @simplify_slt_smax_val_at_use (i32 %a , i32 %b ) {
396
+ ; CHECK-LABEL: define i32 @simplify_slt_smax_val_at_use
397
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
398
+ ; CHECK-NEXT: start:
399
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
400
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
401
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
402
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
403
+ ; CHECK: then:
404
+ ; CHECK-NEXT: ret i32 [[MAX]]
405
+ ; CHECK: else:
406
+ ; CHECK-NEXT: ret i32 -1
407
+ ;
408
+ start:
409
+ %cmp = icmp slt i32 %a , %b
410
+ %add = add nsw i32 %a , 1
411
+ %max = call i32 @llvm.smax.i32 (i32 %b , i32 %add )
412
+ br i1 %cmp , label %then , label %else
413
+ then:
414
+ ret i32 %max
415
+ else:
416
+ ret i32 -1
417
+ }
418
+
419
+ define i32 @simplify_sgt_smax_val (i32 %a , i32 %b ) {
420
+ ; CHECK-LABEL: define i32 @simplify_sgt_smax_val
421
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
422
+ ; CHECK-NEXT: start:
423
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], [[B]]
424
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
425
+ ; CHECK: then:
426
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
427
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
428
+ ; CHECK-NEXT: ret i32 [[MAX]]
429
+ ; CHECK: else:
430
+ ; CHECK-NEXT: ret i32 -1
431
+ ;
432
+ start:
433
+ %cmp = icmp sgt i32 %a , %b
434
+ br i1 %cmp , label %then , label %else
435
+ then:
436
+ %add = add nsw i32 %a , 1
437
+ %max = call i32 @llvm.smax.i32 (i32 %b , i32 %add )
438
+ ret i32 %max
439
+ else:
440
+ ret i32 -1
441
+ }
442
+
443
+ define i32 @simplify_sle_smax_val (i32 %a , i32 %b ) {
444
+ ; CHECK-LABEL: define i32 @simplify_sle_smax_val
445
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
446
+ ; CHECK-NEXT: start:
447
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A]], [[B]]
448
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
449
+ ; CHECK: then:
450
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
451
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
452
+ ; CHECK-NEXT: ret i32 [[MAX]]
453
+ ; CHECK: else:
454
+ ; CHECK-NEXT: ret i32 -1
455
+ ;
456
+ start:
457
+ %cmp = icmp sle i32 %a , %b
458
+ br i1 %cmp , label %then , label %else
459
+ then:
460
+ %add = add nsw i32 %a , 1
461
+ %max = call i32 @llvm.smax.i32 (i32 %b , i32 %add )
462
+ ret i32 %max
463
+ else:
464
+ ret i32 -1
465
+ }
466
+
467
+ define i32 @simplify_sge_smax_val (i32 %a , i32 %b ) {
468
+ ; CHECK-LABEL: define i32 @simplify_sge_smax_val
469
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
470
+ ; CHECK-NEXT: start:
471
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A]], [[B]]
472
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
473
+ ; CHECK: then:
474
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
475
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
476
+ ; CHECK-NEXT: ret i32 [[MAX]]
477
+ ; CHECK: else:
478
+ ; CHECK-NEXT: ret i32 -1
479
+ ;
480
+ start:
481
+ %cmp = icmp sge i32 %a , %b
482
+ br i1 %cmp , label %then , label %else
483
+ then:
484
+ %add = add nsw i32 %a , 1
485
+ %max = call i32 @llvm.smax.i32 (i32 %b , i32 %add )
486
+ ret i32 %max
487
+ else:
488
+ ret i32 -1
489
+ }
490
+
491
+ define i32 @simplify_ult_umax_val (i32 %a , i32 %b ) {
492
+ ; CHECK-LABEL: define i32 @simplify_ult_umax_val
493
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
494
+ ; CHECK-NEXT: start:
495
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
496
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
497
+ ; CHECK: then:
498
+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
499
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[B]], i32 [[ADD]])
500
+ ; CHECK-NEXT: ret i32 [[MAX]]
501
+ ; CHECK: else:
502
+ ; CHECK-NEXT: ret i32 -1
503
+ ;
504
+ start:
505
+ %cmp = icmp ult i32 %a , %b
506
+ br i1 %cmp , label %then , label %else
507
+ then:
508
+ %add = add nuw i32 %a , 1
509
+ %max = call i32 @llvm.umax.i32 (i32 %b , i32 %add )
510
+ ret i32 %max
511
+ else:
512
+ ret i32 -1
513
+ }
514
+
515
+ define i32 @simplify_slt_smin_val (i32 %a , i32 %b ) {
516
+ ; CHECK-LABEL: define i32 @simplify_slt_smin_val
517
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
518
+ ; CHECK-NEXT: start:
519
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
520
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
521
+ ; CHECK: then:
522
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
523
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smin.i32(i32 [[B]], i32 [[ADD]])
524
+ ; CHECK-NEXT: ret i32 [[MAX]]
525
+ ; CHECK: else:
526
+ ; CHECK-NEXT: ret i32 -1
527
+ ;
528
+ start:
529
+ %cmp = icmp slt i32 %a , %b
530
+ br i1 %cmp , label %then , label %else
531
+ then:
532
+ %add = add nsw i32 %a , 1
533
+ %max = call i32 @llvm.smin.i32 (i32 %b , i32 %add )
534
+ ret i32 %max
535
+ else:
536
+ ret i32 -1
537
+ }
538
+
539
+ define i32 @simplify_ult_umin_val (i32 %a , i32 %b ) {
540
+ ; CHECK-LABEL: define i32 @simplify_ult_umin_val
541
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
542
+ ; CHECK-NEXT: start:
543
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
544
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
545
+ ; CHECK: then:
546
+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
547
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umin.i32(i32 [[B]], i32 [[ADD]])
548
+ ; CHECK-NEXT: ret i32 [[MAX]]
549
+ ; CHECK: else:
550
+ ; CHECK-NEXT: ret i32 -1
551
+ ;
552
+ start:
553
+ %cmp = icmp ult i32 %a , %b
554
+ br i1 %cmp , label %then , label %else
555
+ then:
556
+ %add = add nuw i32 %a , 1
557
+ %max = call i32 @llvm.umin.i32 (i32 %b , i32 %add )
558
+ ret i32 %max
559
+ else:
560
+ ret i32 -1
561
+ }
562
+
563
+ define i32 @simplify_slt_smax_val_fail1 (i32 %a , i32 %b ) {
564
+ ; CHECK-LABEL: define i32 @simplify_slt_smax_val_fail1
565
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
566
+ ; CHECK-NEXT: start:
567
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
568
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
569
+ ; CHECK: then:
570
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 2
571
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
572
+ ; CHECK-NEXT: ret i32 [[MAX]]
573
+ ; CHECK: else:
574
+ ; CHECK-NEXT: ret i32 -1
575
+ ;
576
+ start:
577
+ %cmp = icmp slt i32 %a , %b
578
+ br i1 %cmp , label %then , label %else
579
+ then:
580
+ %add = add nsw i32 %a , 2
581
+ %max = call i32 @llvm.smax.i32 (i32 %b , i32 %add )
582
+ ret i32 %max
583
+ else:
584
+ ret i32 -1
585
+ }
586
+
587
+ define i32 @simplify_ult_smax_val_fail2 (i32 %a , i32 %b ) {
588
+ ; CHECK-LABEL: define i32 @simplify_ult_smax_val_fail2
589
+ ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
590
+ ; CHECK-NEXT: start:
591
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A]], [[B]]
592
+ ; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
593
+ ; CHECK: then:
594
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
595
+ ; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
596
+ ; CHECK-NEXT: ret i32 [[MAX]]
597
+ ; CHECK: else:
598
+ ; CHECK-NEXT: ret i32 -1
599
+ ;
600
+ start:
601
+ %cmp = icmp ult i32 %a , %b
602
+ br i1 %cmp , label %then , label %else
603
+ then:
604
+ %add = add nsw i32 %a , 1
605
+ %max = call i32 @llvm.smax.i32 (i32 %b , i32 %add )
606
+ ret i32 %max
607
+ else:
608
+ ret i32 -1
609
+ }
610
+
346
611
declare i32 @llvm.smin.i32 (i32 , i32 )
347
612
declare i32 @llvm.smax.i32 (i32 , i32 )
348
613
declare i32 @llvm.umin.i32 (i32 , i32 )
0 commit comments