Skip to content

Commit 3f2ff7c

Browse files
committed
[Test] Add some tests showing room for optimization exploiting undef and UB
1 parent e37653d commit 3f2ff7c

File tree

1 file changed

+222
-0
lines changed

1 file changed

+222
-0
lines changed

llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,228 @@ failure:
731731
unreachable
732732
}
733733

734+
; TODO: We can break the backedge here by assuming that undef = sub.
735+
define i32 @test_multiple_pred_undef_1() {
736+
; CHECK-LABEL: @test_multiple_pred_undef_1(
737+
; CHECK-NEXT: entry:
738+
; CHECK-NEXT: br label [[LOOP:%.*]]
739+
; CHECK: loop:
740+
; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
741+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
742+
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
743+
; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
744+
; CHECK: if.true:
745+
; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
746+
; CHECK: if.true.1:
747+
; CHECK-NEXT: br label [[BACKEDGE]]
748+
; CHECK: if.true.2:
749+
; CHECK-NEXT: br label [[BACKEDGE]]
750+
; CHECK: if.false:
751+
; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
752+
; CHECK: if.false.1:
753+
; CHECK-NEXT: br label [[BACKEDGE]]
754+
; CHECK: if.false.2:
755+
; CHECK-NEXT: br label [[BACKEDGE]]
756+
; CHECK: backedge:
757+
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ [[SUB]], [[IF_TRUE_1]] ], [ undef, [[IF_TRUE_2]] ]
758+
; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
759+
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
760+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
761+
; CHECK: done:
762+
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
763+
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
764+
; CHECK: failure:
765+
; CHECK-NEXT: unreachable
766+
;
767+
entry:
768+
br label %loop
769+
770+
loop: ; preds = %backedge, %entry
771+
%sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
772+
%sub = sub i32 4, %sum
773+
%is.positive = icmp sgt i32 %sub, 0
774+
br i1 %is.positive, label %if.true, label %if.false
775+
776+
if.true:
777+
br i1 undef, label %if.true.1, label %if.true.2
778+
779+
if.true.1:
780+
br label %backedge
781+
782+
if.true.2:
783+
br label %backedge
784+
785+
if.false: ; preds = %loop
786+
br i1 undef, label %if.false.1, label %if.false.2
787+
788+
if.false.1:
789+
br label %backedge
790+
791+
if.false.2:
792+
br label %backedge
793+
794+
backedge:
795+
%merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ %sub, %if.true.1 ], [ undef, %if.true.2 ]
796+
%sum.next = add i32 %sum, %merge.phi
797+
%loop.cond = icmp ne i32 %sum.next, 4
798+
br i1 %loop.cond, label %loop, label %done
799+
800+
done: ; preds = %backedge
801+
%sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
802+
ret i32 %sum.next.lcssa
803+
804+
failure:
805+
unreachable
806+
}
807+
808+
; TODO: We can break the backedge here by assuming that undef = sub.
809+
define i32 @test_multiple_pred_undef_2() {
810+
; CHECK-LABEL: @test_multiple_pred_undef_2(
811+
; CHECK-NEXT: entry:
812+
; CHECK-NEXT: br label [[LOOP:%.*]]
813+
; CHECK: loop:
814+
; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
815+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
816+
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
817+
; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
818+
; CHECK: if.true:
819+
; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
820+
; CHECK: if.true.1:
821+
; CHECK-NEXT: br label [[BACKEDGE]]
822+
; CHECK: if.true.2:
823+
; CHECK-NEXT: br label [[BACKEDGE]]
824+
; CHECK: if.false:
825+
; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
826+
; CHECK: if.false.1:
827+
; CHECK-NEXT: br label [[BACKEDGE]]
828+
; CHECK: if.false.2:
829+
; CHECK-NEXT: br label [[BACKEDGE]]
830+
; CHECK: backedge:
831+
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ undef, [[IF_TRUE_1]] ], [ [[SUB]], [[IF_TRUE_2]] ]
832+
; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
833+
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
834+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
835+
; CHECK: done:
836+
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
837+
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
838+
; CHECK: failure:
839+
; CHECK-NEXT: unreachable
840+
;
841+
entry:
842+
br label %loop
843+
844+
loop: ; preds = %backedge, %entry
845+
%sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
846+
%sub = sub i32 4, %sum
847+
%is.positive = icmp sgt i32 %sub, 0
848+
br i1 %is.positive, label %if.true, label %if.false
849+
850+
if.true:
851+
br i1 undef, label %if.true.1, label %if.true.2
852+
853+
if.true.1:
854+
br label %backedge
855+
856+
if.true.2:
857+
br label %backedge
858+
859+
if.false: ; preds = %loop
860+
br i1 undef, label %if.false.1, label %if.false.2
861+
862+
if.false.1:
863+
br label %backedge
864+
865+
if.false.2:
866+
br label %backedge
867+
868+
backedge:
869+
%merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ undef, %if.true.1 ], [ %sub, %if.true.2 ]
870+
%sum.next = add i32 %sum, %merge.phi
871+
%loop.cond = icmp ne i32 %sum.next, 4
872+
br i1 %loop.cond, label %loop, label %done
873+
874+
done: ; preds = %backedge
875+
%sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
876+
ret i32 %sum.next.lcssa
877+
878+
failure:
879+
unreachable
880+
}
881+
882+
; TODO: We can break the backedge here by exploiting undef.
883+
define i32 @test_multiple_pred_undef_3() {
884+
; CHECK-LABEL: @test_multiple_pred_undef_3(
885+
; CHECK-NEXT: entry:
886+
; CHECK-NEXT: br label [[LOOP:%.*]]
887+
; CHECK: loop:
888+
; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
889+
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
890+
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
891+
; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
892+
; CHECK: if.true:
893+
; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
894+
; CHECK: if.true.1:
895+
; CHECK-NEXT: br label [[BACKEDGE]]
896+
; CHECK: if.true.2:
897+
; CHECK-NEXT: br label [[BACKEDGE]]
898+
; CHECK: if.false:
899+
; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
900+
; CHECK: if.false.1:
901+
; CHECK-NEXT: br label [[BACKEDGE]]
902+
; CHECK: if.false.2:
903+
; CHECK-NEXT: br label [[BACKEDGE]]
904+
; CHECK: backedge:
905+
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ undef, [[IF_TRUE_1]] ], [ undef, [[IF_TRUE_2]] ]
906+
; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
907+
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
908+
; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
909+
; CHECK: done:
910+
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
911+
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
912+
; CHECK: failure:
913+
; CHECK-NEXT: unreachable
914+
;
915+
entry:
916+
br label %loop
917+
918+
loop: ; preds = %backedge, %entry
919+
%sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]
920+
%sub = sub i32 4, %sum
921+
%is.positive = icmp sgt i32 %sub, 0
922+
br i1 %is.positive, label %if.true, label %if.false
923+
924+
if.true:
925+
br i1 undef, label %if.true.1, label %if.true.2
926+
927+
if.true.1:
928+
br label %backedge
929+
930+
if.true.2:
931+
br label %backedge
932+
933+
if.false: ; preds = %loop
934+
br i1 undef, label %if.false.1, label %if.false.2
935+
936+
if.false.1:
937+
br label %backedge
938+
939+
if.false.2:
940+
br label %backedge
941+
942+
backedge:
943+
%merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ undef, %if.true.1 ], [ undef, %if.true.2 ]
944+
%sum.next = add i32 %sum, %merge.phi
945+
%loop.cond = icmp ne i32 %sum.next, 4
946+
br i1 %loop.cond, label %loop, label %done
947+
948+
done: ; preds = %backedge
949+
%sum.next.lcssa = phi i32 [ %sum.next, %backedge ]
950+
ret i32 %sum.next.lcssa
951+
952+
failure:
953+
unreachable
954+
}
955+
734956
; TODO: We can break the backedge here.
735957
define i32 @test_select(i32 %limit) {
736958
; CHECK-LABEL: @test_select(

0 commit comments

Comments
 (0)