Skip to content

Commit c8b4337

Browse files
committed
[LoopUnswitch] Add test cases with atomic loads & call
1 parent 87b628d commit c8b4337

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

llvm/test/Transforms/LoopUnswitch/partial-unswitch.ll

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,3 +728,104 @@ loop.latch:
728728
exit:
729729
ret i32 10
730730
}
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

Comments
 (0)