Skip to content

Commit e360e77

Browse files
committed
[GVN] Add additional tests after 216d1a7.
Further extend test coverage added in 216d1a7 (cherry-picked from b1fb613)
1 parent 8eb1947 commit e360e77

File tree

1 file changed

+260
-0
lines changed

1 file changed

+260
-0
lines changed

llvm/test/Transforms/GVN/PRE/pre-load-through-select.ll

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,266 @@ exit:
382382
ret i32 %res.2
383383
}
384384

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+
385645
define i32 @test_pointer_phi_select_single_block_store(i32* %a, i32* %b) {
386646
; CHECK-LABEL: @test_pointer_phi_select_single_block_store(
387647
; CHECK-NEXT: entry:

0 commit comments

Comments
 (0)