@@ -804,5 +804,200 @@ bb5:
804
804
br label %bb5
805
805
}
806
806
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
+
807
1002
declare void @use_bool (i1 )
808
1003
declare void @use_ptr (ptr )
0 commit comments