@@ -382,6 +382,266 @@ exit:
382
382
ret i32 %res.2
383
383
}
384
384
385
+ define i32 @test_pointer_phi_select_simp_store_clobber_7 (i32* %a , i32* %b , i32* %c , i1 %cond ) {
386
+ ; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_7(
387
+ ; CHECK-NEXT: entry:
388
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
389
+ ; CHECK: then:
390
+ ; CHECK-NEXT: [[L_1:%.*]] = load i32, i32* [[A:%.*]], align 4
391
+ ; CHECK-NEXT: [[L_2:%.*]] = load i32, i32* [[B:%.*]], align 4
392
+ ; CHECK-NEXT: store i32 99, i32* [[C:%.*]], align 4
393
+ ; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]
394
+ ; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], i32* [[A]], i32* [[B]]
395
+ ; CHECK-NEXT: [[RES_0:%.*]] = load i32, i32* [[A]], align 4
396
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
397
+ ; CHECK: else:
398
+ ; CHECK-NEXT: br label [[EXIT]]
399
+ ; CHECK: exit:
400
+ ; CHECK-NEXT: [[P:%.*]] = phi i32* [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]
401
+ ; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ 10, [[ELSE]] ]
402
+ ; CHECK-NEXT: [[RES_2:%.*]] = load i32, i32* [[P]], align 4
403
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]
404
+ ; CHECK-NEXT: ret i32 [[RES_2]]
405
+ ;
406
+ entry:
407
+ br i1 %cond , label %then , label %else
408
+
409
+ then:
410
+ %l.1 = load i32 , i32* %a , align 4
411
+ %l.2 = load i32 , i32* %b , align 4
412
+ store i32 99 , i32* %c
413
+ %cmp.i.i.i = icmp ult i32 %l.1 , %l.2
414
+ %min.select = select i1 %cmp.i.i.i , i32* %a , i32* %b
415
+ %res.0 = load i32 , i32* %a , align 4
416
+ br label %exit
417
+
418
+ else:
419
+ br label %exit
420
+
421
+ exit:
422
+ %p = phi i32* [ %min.select , %then ], [ %a , %else ]
423
+ %v = phi i32 [ %res.0 , %then ], [ 10 , %else ]
424
+ %res.2 = load i32 , i32* %p , align 4
425
+ %add = add i32 %res.2 , %v
426
+ ret i32 %res.2
427
+ }
428
+
429
+ define i32 @test_pointer_phi_select_simp_store_clobber_8 (i32* %a , i32* %b , i32* %c , i1 %cond ) {
430
+ ; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_8(
431
+ ; CHECK-NEXT: entry:
432
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
433
+ ; CHECK: then:
434
+ ; CHECK-NEXT: [[L_1:%.*]] = load i32, i32* [[A:%.*]], align 4
435
+ ; CHECK-NEXT: [[L_2:%.*]] = load i32, i32* [[B:%.*]], align 4
436
+ ; CHECK-NEXT: store i32 99, i32* [[C:%.*]], align 4
437
+ ; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]
438
+ ; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], i32* [[A]], i32* [[B]]
439
+ ; CHECK-NEXT: [[RES_0:%.*]] = load i32, i32* [[B]], align 4
440
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
441
+ ; CHECK: else:
442
+ ; CHECK-NEXT: br label [[EXIT]]
443
+ ; CHECK: exit:
444
+ ; CHECK-NEXT: [[P:%.*]] = phi i32* [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]
445
+ ; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ 10, [[ELSE]] ]
446
+ ; CHECK-NEXT: [[RES_2:%.*]] = load i32, i32* [[P]], align 4
447
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]
448
+ ; CHECK-NEXT: ret i32 [[RES_2]]
449
+ ;
450
+ entry:
451
+ br i1 %cond , label %then , label %else
452
+
453
+ then:
454
+ %l.1 = load i32 , i32* %a , align 4
455
+ %l.2 = load i32 , i32* %b , align 4
456
+ store i32 99 , i32* %c
457
+ %cmp.i.i.i = icmp ult i32 %l.1 , %l.2
458
+ %min.select = select i1 %cmp.i.i.i , i32* %a , i32* %b
459
+ %res.0 = load i32 , i32* %b , align 4
460
+ br label %exit
461
+
462
+ else:
463
+ br label %exit
464
+
465
+ exit:
466
+ %p = phi i32* [ %min.select , %then ], [ %a , %else ]
467
+ %v = phi i32 [ %res.0 , %then ], [ 10 , %else ]
468
+ %res.2 = load i32 , i32* %p , align 4
469
+ %add = add i32 %res.2 , %v
470
+ ret i32 %res.2
471
+ }
472
+
473
+ define i32 @test_pointer_phi_select_simp_store_clobber_9 (i32* %a , i32* %b , i1 %cond ) {
474
+ ; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_9(
475
+ ; CHECK-NEXT: entry:
476
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
477
+ ; CHECK: then:
478
+ ; CHECK-NEXT: [[L_1:%.*]] = load i32, i32* [[A:%.*]], align 4
479
+ ; CHECK-NEXT: [[L_2:%.*]] = load i32, i32* [[B:%.*]], align 4
480
+ ; CHECK-NEXT: store i32 99, i32* [[A]], align 4
481
+ ; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]
482
+ ; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], i32* [[A]], i32* [[B]]
483
+ ; CHECK-NEXT: [[RES_0:%.*]] = load i32, i32* [[B]], align 4
484
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
485
+ ; CHECK: else:
486
+ ; CHECK-NEXT: br label [[EXIT]]
487
+ ; CHECK: exit:
488
+ ; CHECK-NEXT: [[P:%.*]] = phi i32* [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]
489
+ ; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[RES_0]], [[THEN]] ], [ 10, [[ELSE]] ]
490
+ ; CHECK-NEXT: [[RES_2:%.*]] = load i32, i32* [[P]], align 4
491
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]
492
+ ; CHECK-NEXT: ret i32 [[RES_2]]
493
+ ;
494
+ entry:
495
+ br i1 %cond , label %then , label %else
496
+
497
+ then:
498
+ %l.1 = load i32 , i32* %a , align 4
499
+ %l.2 = load i32 , i32* %b , align 4
500
+ store i32 99 , i32* %a
501
+ %cmp.i.i.i = icmp ult i32 %l.1 , %l.2
502
+ %min.select = select i1 %cmp.i.i.i , i32* %a , i32* %b
503
+ %res.0 = load i32 , i32* %b , align 4
504
+ br label %exit
505
+
506
+ else:
507
+ br label %exit
508
+
509
+ exit:
510
+ %p = phi i32* [ %min.select , %then ], [ %a , %else ]
511
+ %v = phi i32 [ %res.0 , %then ], [ 10 , %else ]
512
+ %res.2 = load i32 , i32* %p , align 4
513
+ %add = add i32 %res.2 , %v
514
+ ret i32 %res.2
515
+ }
516
+
517
+ define i32 @test_pointer_phi_select_simp_store_clobber_10 (i32* %a , i32* %b , i1 %cond ) {
518
+ ; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_10(
519
+ ; CHECK-NEXT: entry:
520
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
521
+ ; CHECK: then:
522
+ ; CHECK-NEXT: [[L_1:%.*]] = load i32, i32* [[A:%.*]], align 4
523
+ ; CHECK-NEXT: store i32 99, i32* [[A]], align 4
524
+ ; CHECK-NEXT: [[L_2:%.*]] = load i32, i32* [[B:%.*]], align 4
525
+ ; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]
526
+ ; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], i32* [[A]], i32* [[B]]
527
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
528
+ ; CHECK: else:
529
+ ; CHECK-NEXT: br label [[EXIT]]
530
+ ; CHECK: exit:
531
+ ; CHECK-NEXT: [[P:%.*]] = phi i32* [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]
532
+ ; CHECK-NEXT: [[V:%.*]] = phi i32 [ [[L_2]], [[THEN]] ], [ 10, [[ELSE]] ]
533
+ ; CHECK-NEXT: [[RES_2:%.*]] = load i32, i32* [[P]], align 4
534
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]
535
+ ; CHECK-NEXT: ret i32 [[RES_2]]
536
+ ;
537
+ entry:
538
+ br i1 %cond , label %then , label %else
539
+
540
+ then:
541
+ %l.1 = load i32 , i32* %a , align 4
542
+ store i32 99 , i32* %a
543
+ %l.2 = load i32 , i32* %b , align 4
544
+ %cmp.i.i.i = icmp ult i32 %l.1 , %l.2
545
+ %min.select = select i1 %cmp.i.i.i , i32* %a , i32* %b
546
+ %res.0 = load i32 , i32* %b , align 4
547
+ br label %exit
548
+
549
+ else:
550
+ br label %exit
551
+
552
+ exit:
553
+ %p = phi i32* [ %min.select , %then ], [ %a , %else ]
554
+ %v = phi i32 [ %res.0 , %then ], [ 10 , %else ]
555
+ %res.2 = load i32 , i32* %p , align 4
556
+ %add = add i32 %res.2 , %v
557
+ ret i32 %res.2
558
+ }
559
+
560
+ define i32 @test_pointer_phi_select_simp_store_clobber_11 (i32* %a , i32* %b , i1 %cond ) {
561
+ ; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_11(
562
+ ; CHECK-NEXT: entry:
563
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
564
+ ; CHECK: then:
565
+ ; CHECK-NEXT: [[L_1:%.*]] = load i32, i32* [[A:%.*]], align 4
566
+ ; CHECK-NEXT: [[L_2:%.*]] = load i32, i32* [[B:%.*]], align 4
567
+ ; CHECK-NEXT: store i32 99, i32* [[B]], align 4
568
+ ; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], [[L_2]]
569
+ ; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], i32* [[A]], i32* [[B]]
570
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
571
+ ; CHECK: else:
572
+ ; CHECK-NEXT: br label [[EXIT]]
573
+ ; CHECK: exit:
574
+ ; CHECK-NEXT: [[P:%.*]] = phi i32* [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]
575
+ ; CHECK-NEXT: [[V:%.*]] = phi i32 [ 99, [[THEN]] ], [ 10, [[ELSE]] ]
576
+ ; CHECK-NEXT: [[RES_2:%.*]] = load i32, i32* [[P]], align 4
577
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]
578
+ ; CHECK-NEXT: ret i32 [[RES_2]]
579
+ ;
580
+ entry:
581
+ br i1 %cond , label %then , label %else
582
+
583
+ then:
584
+ %l.1 = load i32 , i32* %a , align 4
585
+ %l.2 = load i32 , i32* %b , align 4
586
+ store i32 99 , i32* %b
587
+ %cmp.i.i.i = icmp ult i32 %l.1 , %l.2
588
+ %min.select = select i1 %cmp.i.i.i , i32* %a , i32* %b
589
+ %res.0 = load i32 , i32* %b , align 4
590
+ br label %exit
591
+
592
+ else:
593
+ br label %exit
594
+
595
+ exit:
596
+ %p = phi i32* [ %min.select , %then ], [ %a , %else ]
597
+ %v = phi i32 [ %res.0 , %then ], [ 10 , %else ]
598
+ %res.2 = load i32 , i32* %p , align 4
599
+ %add = add i32 %res.2 , %v
600
+ ret i32 %res.2
601
+ }
602
+
603
+ define i32 @test_pointer_phi_select_simp_store_clobber_12 (i32* %a , i32* %b , i1 %cond ) {
604
+ ; CHECK-LABEL: @test_pointer_phi_select_simp_store_clobber_12(
605
+ ; CHECK-NEXT: entry:
606
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
607
+ ; CHECK: then:
608
+ ; CHECK-NEXT: [[L_1:%.*]] = load i32, i32* [[A:%.*]], align 4
609
+ ; CHECK-NEXT: store i32 99, i32* [[B:%.*]], align 4
610
+ ; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp ult i32 [[L_1]], 99
611
+ ; CHECK-NEXT: [[MIN_SELECT:%.*]] = select i1 [[CMP_I_I_I]], i32* [[A]], i32* [[B]]
612
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
613
+ ; CHECK: else:
614
+ ; CHECK-NEXT: br label [[EXIT]]
615
+ ; CHECK: exit:
616
+ ; CHECK-NEXT: [[P:%.*]] = phi i32* [ [[MIN_SELECT]], [[THEN]] ], [ [[A]], [[ELSE]] ]
617
+ ; CHECK-NEXT: [[V:%.*]] = phi i32 [ 99, [[THEN]] ], [ 10, [[ELSE]] ]
618
+ ; CHECK-NEXT: [[RES_2:%.*]] = load i32, i32* [[P]], align 4
619
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[RES_2]], [[V]]
620
+ ; CHECK-NEXT: ret i32 [[RES_2]]
621
+ ;
622
+ entry:
623
+ br i1 %cond , label %then , label %else
624
+
625
+ then:
626
+ %l.1 = load i32 , i32* %a , align 4
627
+ store i32 99 , i32* %b
628
+ %l.2 = load i32 , i32* %b , align 4
629
+ %cmp.i.i.i = icmp ult i32 %l.1 , %l.2
630
+ %min.select = select i1 %cmp.i.i.i , i32* %a , i32* %b
631
+ %res.0 = load i32 , i32* %b , align 4
632
+ br label %exit
633
+
634
+ else:
635
+ br label %exit
636
+
637
+ exit:
638
+ %p = phi i32* [ %min.select , %then ], [ %a , %else ]
639
+ %v = phi i32 [ %res.0 , %then ], [ 10 , %else ]
640
+ %res.2 = load i32 , i32* %p , align 4
641
+ %add = add i32 %res.2 , %v
642
+ ret i32 %res.2
643
+ }
644
+
385
645
define i32 @test_pointer_phi_select_single_block_store (i32* %a , i32* %b ) {
386
646
; CHECK-LABEL: @test_pointer_phi_select_single_block_store(
387
647
; CHECK-NEXT: entry:
0 commit comments