@@ -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+
8071002declare void @use_bool (i1 )
8081003declare void @use_ptr (ptr )
0 commit comments