@@ -728,3 +728,104 @@ loop.latch:
728
728
exit:
729
729
ret i32 10
730
730
}
731
+
732
+ ; Do not unswitch if the condition depends on an atomic load. Duplicating such
733
+ ; loads is not safe.
734
+ ; TODO
735
+ define i32 @no_partial_unswitch_atomic_load_unordered (i32* %ptr , i32 %N ) {
736
+ ; CHECK-LABEL: @no_partial_unswitch_atomic_load_unordered
737
+ ; CHECK-NEXT: entry:
738
+ ; CHECK-NEXT: load
739
+ ;
740
+ entry:
741
+ br label %loop.header
742
+
743
+ loop.header:
744
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
745
+ %lv = load atomic i32 , i32* %ptr unordered , align 4
746
+ %sc = icmp eq i32 %lv , 100
747
+ br i1 %sc , label %noclobber , label %clobber
748
+
749
+ noclobber:
750
+ br label %loop.latch
751
+
752
+ clobber:
753
+ call void @clobber ()
754
+ br label %loop.latch
755
+
756
+ loop.latch:
757
+ %c = icmp ult i32 %iv , %N
758
+ %iv.next = add i32 %iv , 1
759
+ br i1 %c , label %loop.header , label %exit
760
+
761
+ exit:
762
+ ret i32 10
763
+ }
764
+
765
+ ; Do not unswitch if the condition depends on an atomic load. Duplicating such
766
+ ; loads is not safe.
767
+ ; TODO
768
+ define i32 @no_partial_unswitch_atomic_load_monotonic (i32* %ptr , i32 %N ) {
769
+ ; CHECK-LABEL: @no_partial_unswitch_atomic_load_monotonic
770
+ ; CHECK-NEXT: entry:
771
+ ; CHECK-NEXT: load
772
+ ;
773
+ entry:
774
+ br label %loop.header
775
+
776
+ loop.header:
777
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
778
+ %lv = load atomic i32 , i32* %ptr monotonic , align 4
779
+ %sc = icmp eq i32 %lv , 100
780
+ br i1 %sc , label %noclobber , label %clobber
781
+
782
+ noclobber:
783
+ br label %loop.latch
784
+
785
+ clobber:
786
+ call void @clobber ()
787
+ br label %loop.latch
788
+
789
+ loop.latch:
790
+ %c = icmp ult i32 %iv , %N
791
+ %iv.next = add i32 %iv , 1
792
+ br i1 %c , label %loop.header , label %exit
793
+
794
+ exit:
795
+ ret i32 10
796
+ }
797
+
798
+
799
+ declare i32 @get_value ()
800
+
801
+ ; Do not unswitch if the condition depends on a call, that may clobber memory.
802
+ ; Duplicating such a call is not safe.
803
+ define i32 @no_partial_unswitch_cond_call (i32* %ptr , i32 %N ) {
804
+ ; CHECK-LABEL: @no_partial_unswitch_cond_call
805
+ ; CHECK-NEXT: entry:
806
+ ; CHECK-NEXT: br label %loop.header
807
+ ;
808
+ entry:
809
+ br label %loop.header
810
+
811
+ loop.header:
812
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
813
+ %lv = call i32 @get_value ()
814
+ %sc = icmp eq i32 %lv , 100
815
+ br i1 %sc , label %noclobber , label %clobber
816
+
817
+ noclobber:
818
+ br label %loop.latch
819
+
820
+ clobber:
821
+ call void @clobber ()
822
+ br label %loop.latch
823
+
824
+ loop.latch:
825
+ %c = icmp ult i32 %iv , %N
826
+ %iv.next = add i32 %iv , 1
827
+ br i1 %c , label %loop.header , label %exit
828
+
829
+ exit:
830
+ ret i32 10
831
+ }
0 commit comments