@@ -765,3 +765,81 @@ follow_2:
765
765
%vv = load i32 , i32* %x , align 4
766
766
ret i32 %vv
767
767
}
768
+
769
+ declare i1 @foo ()
770
+ declare i1 @bar ()
771
+
772
+ ; %v3 is partially redundant, bb3 has multiple predecessors coming through
773
+ ; critical edges. The other successors of those predecessors have same loads.
774
+ ; We can move all loads into predecessors.
775
+
776
+ define void @test17 (i64* %p1 , i64* %p2 , i64* %p3 , i64* %p4 )
777
+ ; CHECK-LABEL: @test17(
778
+ ; CHECK-NEXT: entry:
779
+ ; CHECK-NEXT: [[V1:%.*]] = load i64, i64* [[P1:%.*]], align 8
780
+ ; CHECK-NEXT: [[COND1:%.*]] = icmp sgt i64 [[V1]], 200
781
+ ; CHECK-NEXT: br i1 [[COND1]], label [[BB200:%.*]], label [[BB1:%.*]]
782
+ ; CHECK: bb1:
783
+ ; CHECK-NEXT: [[COND2:%.*]] = icmp sgt i64 [[V1]], 100
784
+ ; CHECK-NEXT: br i1 [[COND2]], label [[BB100:%.*]], label [[BB2:%.*]]
785
+ ; CHECK: bb2:
786
+ ; CHECK-NEXT: [[V2:%.*]] = add nsw i64 [[V1]], 1
787
+ ; CHECK-NEXT: store i64 [[V2]], i64* [[P1]], align 8
788
+ ; CHECK-NEXT: br label [[BB3:%.*]]
789
+ ; CHECK: bb3:
790
+ ; CHECK-NEXT: [[V3:%.*]] = load i64, i64* [[P1]], align 8
791
+ ; CHECK-NEXT: store i64 [[V3]], i64* [[P2:%.*]], align 8
792
+ ; CHECK-NEXT: ret void
793
+ ; CHECK: bb100:
794
+ ; CHECK-NEXT: [[COND3:%.*]] = call i1 @foo()
795
+ ; CHECK-NEXT: br i1 [[COND3]], label [[BB3]], label [[BB101:%.*]]
796
+ ; CHECK: bb101:
797
+ ; CHECK-NEXT: [[V4:%.*]] = load i64, i64* [[P1]], align 8
798
+ ; CHECK-NEXT: store i64 [[V4]], i64* [[P3:%.*]], align 8
799
+ ; CHECK-NEXT: ret void
800
+ ; CHECK: bb200:
801
+ ; CHECK-NEXT: [[COND4:%.*]] = call i1 @bar()
802
+ ; CHECK-NEXT: br i1 [[COND4]], label [[BB3]], label [[BB201:%.*]]
803
+ ; CHECK: bb201:
804
+ ; CHECK-NEXT: [[V5:%.*]] = load i64, i64* [[P1]], align 8
805
+ ; CHECK-NEXT: store i64 [[V5]], i64* [[P4:%.*]], align 8
806
+ ; CHECK-NEXT: ret void
807
+ ;
808
+ {
809
+ entry:
810
+ %v1 = load i64 , i64* %p1 , align 8
811
+ %cond1 = icmp sgt i64 %v1 , 200
812
+ br i1 %cond1 , label %bb200 , label %bb1
813
+
814
+ bb1:
815
+ %cond2 = icmp sgt i64 %v1 , 100
816
+ br i1 %cond2 , label %bb100 , label %bb2
817
+
818
+ bb2:
819
+ %v2 = add nsw i64 %v1 , 1
820
+ store i64 %v2 , i64* %p1 , align 8
821
+ br label %bb3
822
+
823
+ bb3:
824
+ %v3 = load i64 , i64* %p1 , align 8
825
+ store i64 %v3 , i64* %p2 , align 8
826
+ ret void
827
+
828
+ bb100:
829
+ %cond3 = call i1 @foo ()
830
+ br i1 %cond3 , label %bb3 , label %bb101
831
+
832
+ bb101:
833
+ %v4 = load i64 , i64* %p1 , align 8
834
+ store i64 %v4 , i64* %p3 , align 8
835
+ ret void
836
+
837
+ bb200:
838
+ %cond4 = call i1 @bar ()
839
+ br i1 %cond4 , label %bb3 , label %bb201
840
+
841
+ bb201:
842
+ %v5 = load i64 , i64* %p1 , align 8
843
+ store i64 %v5 , i64* %p4 , align 8
844
+ ret void
845
+ }
0 commit comments