@@ -899,3 +899,90 @@ other.dst:
899
899
pow2.dst:
900
900
ret void
901
901
}
902
+
903
+ define void @switch_large_enough_for_clustering (i32 %x , ptr %dst ) {
904
+ ; CHECK-LABEL: switch_large_enough_for_clustering:
905
+ ; CHECK: ; %bb.0: ; %entry
906
+ ; CHECK-NEXT: cmp w0, #1
907
+ ; CHECK-NEXT: b.le LBB12_5
908
+ ; CHECK-NEXT: ; %bb.1: ; %entry
909
+ ; CHECK-NEXT: cmp w0, #7
910
+ ; CHECK-NEXT: b.eq LBB12_9
911
+ ; CHECK-NEXT: ; %bb.2: ; %entry
912
+ ; CHECK-NEXT: cmp w0, #4
913
+ ; CHECK-NEXT: b.eq LBB12_7
914
+ ; CHECK-NEXT: ; %bb.3: ; %entry
915
+ ; CHECK-NEXT: cmp w0, #2
916
+ ; CHECK-NEXT: b.eq LBB12_8
917
+ ; CHECK-NEXT: LBB12_4: ; %exit
918
+ ; CHECK-NEXT: ret
919
+ ; CHECK-NEXT: LBB12_5: ; %entry
920
+ ; CHECK-NEXT: cbz w0, LBB12_8
921
+ ; CHECK-NEXT: ; %bb.6: ; %entry
922
+ ; CHECK-NEXT: cmp w0, #1
923
+ ; CHECK-NEXT: b.ne LBB12_4
924
+ ; CHECK-NEXT: LBB12_7: ; %succ.2
925
+ ; CHECK-NEXT: str wzr, [x1]
926
+ ; CHECK-NEXT: ret
927
+ ; CHECK-NEXT: LBB12_8: ; %succ.1
928
+ ; CHECK-NEXT: strb wzr, [x1]
929
+ ; CHECK-NEXT: ret
930
+ ; CHECK-NEXT: LBB12_9: ; %succ.3
931
+ ; CHECK-NEXT: strh wzr, [x1]
932
+ ; CHECK-NEXT: ret
933
+ ;
934
+ ; GISEL-LABEL: switch_large_enough_for_clustering:
935
+ ; GISEL: ; %bb.0: ; %entry
936
+ ; GISEL-NEXT: cmp w0, #2
937
+ ; GISEL-NEXT: b.lt LBB12_5
938
+ ; GISEL-NEXT: ; %bb.1: ; %entry
939
+ ; GISEL-NEXT: cmp w0, #7
940
+ ; GISEL-NEXT: b.eq LBB12_9
941
+ ; GISEL-NEXT: ; %bb.2: ; %entry
942
+ ; GISEL-NEXT: cmp w0, #4
943
+ ; GISEL-NEXT: b.eq LBB12_7
944
+ ; GISEL-NEXT: ; %bb.3: ; %entry
945
+ ; GISEL-NEXT: cmp w0, #2
946
+ ; GISEL-NEXT: b.eq LBB12_8
947
+ ; GISEL-NEXT: LBB12_4: ; %exit
948
+ ; GISEL-NEXT: ret
949
+ ; GISEL-NEXT: LBB12_5: ; %entry
950
+ ; GISEL-NEXT: cbz w0, LBB12_8
951
+ ; GISEL-NEXT: ; %bb.6: ; %entry
952
+ ; GISEL-NEXT: cmp w0, #1
953
+ ; GISEL-NEXT: b.ne LBB12_4
954
+ ; GISEL-NEXT: LBB12_7: ; %succ.2
955
+ ; GISEL-NEXT: str wzr, [x1]
956
+ ; GISEL-NEXT: ret
957
+ ; GISEL-NEXT: LBB12_8: ; %succ.1
958
+ ; GISEL-NEXT: strb wzr, [x1]
959
+ ; GISEL-NEXT: ret
960
+ ; GISEL-NEXT: LBB12_9: ; %succ.3
961
+ ; GISEL-NEXT: strh wzr, [x1]
962
+ ; GISEL-NEXT: ret
963
+ entry:
964
+ switch i32 %x , label %exit [
965
+ i32 0 , label %succ.1
966
+ i32 2 , label %succ.1
967
+ i32 1 , label %succ.2
968
+ i32 4 , label %succ.2
969
+ i32 7 , label %succ.3
970
+ ]
971
+
972
+ succ.1 :
973
+ store i8 0 , ptr %dst
974
+ br label %exit
975
+
976
+ succ.2 :
977
+ call void @llvm.memset.p0.i64 (ptr %dst , i8 0 , i64 4 , i1 false )
978
+ br label %exit
979
+
980
+ succ.3 :
981
+ call void @llvm.memset.p0.i64 (ptr %dst , i8 0 , i64 2 , i1 false )
982
+ br label %exit
983
+
984
+ exit:
985
+ ret void
986
+ }
987
+
988
+ declare void @llvm.memset.p0.i64 (ptr writeonly captures(none), i8 , i64 , i1 immarg)
0 commit comments