Skip to content

Commit 9711f6b

Browse files
committed
[GVN] Add additional tests for pointer replacement (NFC)
1 parent 7d74ca9 commit 9711f6b

File tree

1 file changed

+195
-0
lines changed

1 file changed

+195
-0
lines changed

llvm/test/Transforms/GVN/condprop.ll

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,5 +804,200 @@ bb5:
804804
br label %bb5
805805
}
806806

807+
define void @select_same_obj(i1 %c, ptr %p, i64 %x) {
808+
; CHECK-LABEL: @select_same_obj(
809+
; CHECK-NEXT: entry:
810+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[X:%.*]]
811+
; CHECK-NEXT: [[P3:%.*]] = select i1 [[C:%.*]], ptr [[P]], ptr [[P2]]
812+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], [[P3]]
813+
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[EXIT:%.*]]
814+
; CHECK: if:
815+
; CHECK-NEXT: call void @use_ptr(ptr [[P]])
816+
; CHECK-NEXT: call void @use_ptr(ptr [[P3]])
817+
; CHECK-NEXT: ret void
818+
; CHECK: exit:
819+
; CHECK-NEXT: ret void
820+
;
821+
entry:
822+
%p2 = getelementptr i8, ptr %p, i64 %x
823+
%p3 = select i1 %c, ptr %p, ptr %p2
824+
%cmp = icmp eq ptr %p, %p3
825+
br i1 %cmp, label %if, label %exit
826+
827+
if:
828+
call void @use_ptr(ptr %p)
829+
call void @use_ptr(ptr %p3)
830+
ret void
831+
832+
exit:
833+
ret void
834+
}
835+
836+
define void @select_different_obj(i1 %c, ptr %p, ptr %p2) {
837+
; CHECK-LABEL: @select_different_obj(
838+
; CHECK-NEXT: entry:
839+
; CHECK-NEXT: [[P3:%.*]] = select i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P2:%.*]]
840+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], [[P3]]
841+
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[EXIT:%.*]]
842+
; CHECK: if:
843+
; CHECK-NEXT: call void @use_ptr(ptr [[P]])
844+
; CHECK-NEXT: call void @use_ptr(ptr [[P3]])
845+
; CHECK-NEXT: ret void
846+
; CHECK: exit:
847+
; CHECK-NEXT: ret void
848+
;
849+
entry:
850+
%p3 = select i1 %c, ptr %p, ptr %p2
851+
%cmp = icmp eq ptr %p, %p3
852+
br i1 %cmp, label %if, label %exit
853+
854+
if:
855+
call void @use_ptr(ptr %p)
856+
call void @use_ptr(ptr %p3)
857+
ret void
858+
859+
exit:
860+
ret void
861+
}
862+
863+
define void @select_same_obj_is_select(i1 %c, ptr %p, ptr %p2, i64 %x) {
864+
; CHECK-LABEL: @select_same_obj_is_select(
865+
; CHECK-NEXT: entry:
866+
; CHECK-NEXT: [[P3:%.*]] = select i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P2:%.*]]
867+
; CHECK-NEXT: [[P4:%.*]] = getelementptr i8, ptr [[P3]], i64 [[X:%.*]]
868+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P3]], [[P4]]
869+
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[EXIT:%.*]]
870+
; CHECK: if:
871+
; CHECK-NEXT: call void @use_ptr(ptr [[P3]])
872+
; CHECK-NEXT: call void @use_ptr(ptr [[P3]])
873+
; CHECK-NEXT: ret void
874+
; CHECK: exit:
875+
; CHECK-NEXT: ret void
876+
;
877+
entry:
878+
%p3 = select i1 %c, ptr %p, ptr %p2
879+
%p4 = getelementptr i8, ptr %p3, i64 %x
880+
%cmp = icmp eq ptr %p3, %p4
881+
br i1 %cmp, label %if, label %exit
882+
883+
if:
884+
call void @use_ptr(ptr %p3)
885+
call void @use_ptr(ptr %p4)
886+
ret void
887+
888+
exit:
889+
ret void
890+
}
891+
892+
define void @phi_same_obj(i1 %c, ptr %p, i64 %x) {
893+
; CHECK-LABEL: @phi_same_obj(
894+
; CHECK-NEXT: entry:
895+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[X:%.*]]
896+
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
897+
; CHECK: if:
898+
; CHECK-NEXT: br label [[JOIN]]
899+
; CHECK: join:
900+
; CHECK-NEXT: [[P3:%.*]] = phi ptr [ [[P]], [[IF]] ], [ [[P2]], [[ENTRY:%.*]] ]
901+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], [[P3]]
902+
; CHECK-NEXT: br i1 [[CMP]], label [[IF2:%.*]], label [[EXIT:%.*]]
903+
; CHECK: if2:
904+
; CHECK-NEXT: call void @use_ptr(ptr [[P]])
905+
; CHECK-NEXT: call void @use_ptr(ptr [[P3]])
906+
; CHECK-NEXT: ret void
907+
; CHECK: exit:
908+
; CHECK-NEXT: ret void
909+
;
910+
entry:
911+
%p2 = getelementptr i8, ptr %p, i64 %x
912+
br i1 %c, label %if, label %join
913+
914+
if:
915+
br label %join
916+
917+
join:
918+
%p3 = phi ptr [ %p, %if ], [ %p2, %entry ]
919+
%cmp = icmp eq ptr %p, %p3
920+
br i1 %cmp, label %if2, label %exit
921+
922+
if2:
923+
call void @use_ptr(ptr %p)
924+
call void @use_ptr(ptr %p3)
925+
ret void
926+
927+
exit:
928+
ret void
929+
}
930+
931+
define void @phi_different_obj(i1 %c, ptr %p, ptr %p2) {
932+
; CHECK-LABEL: @phi_different_obj(
933+
; CHECK-NEXT: entry:
934+
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
935+
; CHECK: if:
936+
; CHECK-NEXT: br label [[JOIN]]
937+
; CHECK: join:
938+
; CHECK-NEXT: [[P3:%.*]] = phi ptr [ [[P:%.*]], [[IF]] ], [ [[P2:%.*]], [[ENTRY:%.*]] ]
939+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P]], [[P3]]
940+
; CHECK-NEXT: br i1 [[CMP]], label [[IF2:%.*]], label [[EXIT:%.*]]
941+
; CHECK: if2:
942+
; CHECK-NEXT: call void @use_ptr(ptr [[P]])
943+
; CHECK-NEXT: call void @use_ptr(ptr [[P3]])
944+
; CHECK-NEXT: ret void
945+
; CHECK: exit:
946+
; CHECK-NEXT: ret void
947+
;
948+
entry:
949+
br i1 %c, label %if, label %join
950+
951+
if:
952+
br label %join
953+
954+
join:
955+
%p3 = phi ptr [ %p, %if ], [ %p2, %entry ]
956+
%cmp = icmp eq ptr %p, %p3
957+
br i1 %cmp, label %if2, label %exit
958+
959+
if2:
960+
call void @use_ptr(ptr %p)
961+
call void @use_ptr(ptr %p3)
962+
ret void
963+
964+
exit:
965+
ret void
966+
}
967+
968+
define void @phi_same_obj_cycle(i1 %c, ptr %p, i64 %x) {
969+
; CHECK-LABEL: @phi_same_obj_cycle(
970+
; CHECK-NEXT: entry:
971+
; CHECK-NEXT: br label [[LOOP:%.*]]
972+
; CHECK: loop:
973+
; CHECK-NEXT: [[P_IV:%.*]] = phi ptr [ [[P:%.*]], [[ENTRY:%.*]] ], [ [[P_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
974+
; CHECK-NEXT: [[P_NEXT]] = getelementptr i8, ptr [[P_IV]], i64 [[X:%.*]]
975+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[P_IV]], [[P]]
976+
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[LOOP_LATCH]]
977+
; CHECK: if:
978+
; CHECK-NEXT: call void @use_ptr(ptr [[P_IV]])
979+
; CHECK-NEXT: call void @use_ptr(ptr [[P]])
980+
; CHECK-NEXT: br label [[LOOP_LATCH]]
981+
; CHECK: loop.latch:
982+
; CHECK-NEXT: br label [[LOOP]]
983+
;
984+
entry:
985+
br label %loop
986+
987+
loop:
988+
%p.iv = phi ptr [ %p, %entry ], [ %p.next, %loop.latch ]
989+
%p.next = getelementptr i8, ptr %p.iv, i64 %x
990+
%cmp = icmp eq ptr %p.iv, %p
991+
br i1 %cmp, label %if, label %loop.latch
992+
993+
if:
994+
call void @use_ptr(ptr %p.iv)
995+
call void @use_ptr(ptr %p)
996+
br label %loop.latch
997+
998+
loop.latch:
999+
br label %loop
1000+
}
1001+
8071002
declare void @use_bool(i1)
8081003
declare void @use_ptr(ptr)

0 commit comments

Comments
 (0)