@@ -918,6 +918,289 @@ bb5: ; preds = %bb3, %bb
918
918
ret i32 %i7
919
919
}
920
920
921
+ declare void @side.effect ()
922
+ declare i8 @get.i8 ()
923
+
924
+ define i8 @udiv_by_zero (i8 %x , i8 %i , i8 %v ) {
925
+ ; CHECK-LABEL: @udiv_by_zero(
926
+ ; CHECK-NEXT: entry:
927
+ ; CHECK-NEXT: switch i8 [[I:%.*]], label [[SW_DEFAULT:%.*]] [
928
+ ; CHECK-NEXT: i8 0, label [[RETURN:%.*]]
929
+ ; CHECK-NEXT: i8 2, label [[SW_BB1:%.*]]
930
+ ; CHECK-NEXT: i8 9, label [[SW_BB2:%.*]]
931
+ ; CHECK-NEXT: ]
932
+ ; CHECK: sw.bb1:
933
+ ; CHECK-NEXT: br label [[RETURN]]
934
+ ; CHECK: sw.bb2:
935
+ ; CHECK-NEXT: br label [[RETURN]]
936
+ ; CHECK: sw.default:
937
+ ; CHECK-NEXT: br label [[RETURN]]
938
+ ; CHECK: return:
939
+ ; CHECK-NEXT: [[Y:%.*]] = phi i8 [ 2, [[SW_BB1]] ], [ 9, [[SW_BB2]] ], [ [[V:%.*]], [[SW_DEFAULT]] ], [ 0, [[ENTRY:%.*]] ]
940
+ ; CHECK-NEXT: [[R:%.*]] = udiv i8 [[X:%.*]], [[Y]]
941
+ ; CHECK-NEXT: ret i8 [[R]]
942
+ ;
943
+ entry:
944
+ switch i8 %i , label %sw.default [
945
+ i8 0 , label %sw.bb0
946
+ i8 2 , label %sw.bb1
947
+ i8 9 , label %sw.bb2
948
+ ]
949
+
950
+ sw.bb0:
951
+ br label %return
952
+
953
+ sw.bb1:
954
+ br label %return
955
+ sw.bb2:
956
+ br label %return
957
+ sw.default:
958
+ br label %return
959
+
960
+ return:
961
+ %y = phi i8 [ 0 , %sw.bb0 ], [ 2 , %sw.bb1 ], [ 9 , %sw.bb2 ], [ %v , %sw.default ]
962
+ %r = udiv i8 %x , %y
963
+ ret i8 %r
964
+ }
965
+
966
+ define i8 @urem_by_zero (i8 %x , i8 %i , i8 %v ) {
967
+ ; CHECK-LABEL: @urem_by_zero(
968
+ ; CHECK-NEXT: entry:
969
+ ; CHECK-NEXT: switch i8 [[I:%.*]], label [[SW_DEFAULT:%.*]] [
970
+ ; CHECK-NEXT: i8 0, label [[RETURN:%.*]]
971
+ ; CHECK-NEXT: i8 2, label [[SW_BB1:%.*]]
972
+ ; CHECK-NEXT: i8 9, label [[SW_BB2:%.*]]
973
+ ; CHECK-NEXT: ]
974
+ ; CHECK: sw.bb1:
975
+ ; CHECK-NEXT: br label [[RETURN]]
976
+ ; CHECK: sw.bb2:
977
+ ; CHECK-NEXT: br label [[RETURN]]
978
+ ; CHECK: sw.default:
979
+ ; CHECK-NEXT: br label [[RETURN]]
980
+ ; CHECK: return:
981
+ ; CHECK-NEXT: [[Y:%.*]] = phi i8 [ 2, [[SW_BB1]] ], [ 9, [[SW_BB2]] ], [ 0, [[SW_DEFAULT]] ], [ [[V:%.*]], [[ENTRY:%.*]] ]
982
+ ; CHECK-NEXT: [[R:%.*]] = urem i8 [[X:%.*]], [[Y]]
983
+ ; CHECK-NEXT: ret i8 [[R]]
984
+ ;
985
+ entry:
986
+ switch i8 %i , label %sw.default [
987
+ i8 0 , label %sw.bb0
988
+ i8 2 , label %sw.bb1
989
+ i8 9 , label %sw.bb2
990
+ ]
991
+
992
+ sw.bb0:
993
+ br label %return
994
+
995
+ sw.bb1:
996
+ br label %return
997
+ sw.bb2:
998
+ br label %return
999
+ sw.default:
1000
+ br label %return
1001
+
1002
+ return:
1003
+ %y = phi i8 [ %v , %sw.bb0 ], [ 2 , %sw.bb1 ], [ 9 , %sw.bb2 ], [ 0 , %sw.default ]
1004
+ %r = urem i8 %x , %y
1005
+ ret i8 %r
1006
+ }
1007
+
1008
+ define i8 @udiv_of_zero_okay (i8 %x , i8 %i , i8 %v ) {
1009
+ ; CHECK-LABEL: @udiv_of_zero_okay(
1010
+ ; CHECK-NEXT: entry:
1011
+ ; CHECK-NEXT: switch i8 [[I:%.*]], label [[SW_DEFAULT:%.*]] [
1012
+ ; CHECK-NEXT: i8 0, label [[RETURN:%.*]]
1013
+ ; CHECK-NEXT: i8 2, label [[SW_BB1:%.*]]
1014
+ ; CHECK-NEXT: i8 9, label [[SW_BB2:%.*]]
1015
+ ; CHECK-NEXT: ]
1016
+ ; CHECK: sw.bb1:
1017
+ ; CHECK-NEXT: br label [[RETURN]]
1018
+ ; CHECK: sw.bb2:
1019
+ ; CHECK-NEXT: br label [[RETURN]]
1020
+ ; CHECK: sw.default:
1021
+ ; CHECK-NEXT: br label [[RETURN]]
1022
+ ; CHECK: return:
1023
+ ; CHECK-NEXT: [[Y:%.*]] = phi i8 [ 2, [[SW_BB1]] ], [ 9, [[SW_BB2]] ], [ [[V:%.*]], [[SW_DEFAULT]] ], [ 0, [[ENTRY:%.*]] ]
1024
+ ; CHECK-NEXT: [[R:%.*]] = udiv i8 [[Y]], [[X:%.*]]
1025
+ ; CHECK-NEXT: ret i8 [[R]]
1026
+ ;
1027
+ entry:
1028
+ switch i8 %i , label %sw.default [
1029
+ i8 0 , label %sw.bb0
1030
+ i8 2 , label %sw.bb1
1031
+ i8 9 , label %sw.bb2
1032
+ ]
1033
+
1034
+ sw.bb0:
1035
+ br label %return
1036
+
1037
+ sw.bb1:
1038
+ br label %return
1039
+ sw.bb2:
1040
+ br label %return
1041
+ sw.default:
1042
+ br label %return
1043
+
1044
+ return:
1045
+ %y = phi i8 [ 0 , %sw.bb0 ], [ 2 , %sw.bb1 ], [ 9 , %sw.bb2 ], [ %v , %sw.default ]
1046
+ %r = udiv i8 %y , %x
1047
+ ret i8 %r
1048
+ }
1049
+
1050
+ define i8 @srem_by_zero (i8 %x , i8 %i ) {
1051
+ ; CHECK-LABEL: @srem_by_zero(
1052
+ ; CHECK-NEXT: entry:
1053
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[I:%.*]], 9
1054
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1055
+ ; CHECK: if.then:
1056
+ ; CHECK-NEXT: call void @side.effect()
1057
+ ; CHECK-NEXT: br label [[IF_END:%.*]]
1058
+ ; CHECK: if.else:
1059
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @get.i8()
1060
+ ; CHECK-NEXT: br label [[IF_END]]
1061
+ ; CHECK: if.end:
1062
+ ; CHECK-NEXT: [[Y:%.*]] = phi i8 [ 0, [[IF_THEN]] ], [ [[V]], [[IF_ELSE]] ]
1063
+ ; CHECK-NEXT: [[R:%.*]] = srem i8 [[X:%.*]], [[Y]]
1064
+ ; CHECK-NEXT: ret i8 [[R]]
1065
+ ;
1066
+ entry:
1067
+ %cmp = icmp ult i8 %i , 9
1068
+ br i1 %cmp , label %if.then , label %if.else
1069
+
1070
+ if.then:
1071
+ call void @side.effect ()
1072
+ br label %if.end
1073
+
1074
+ if.else:
1075
+ %v = call i8 @get.i8 ()
1076
+ br label %if.end
1077
+
1078
+ if.end:
1079
+ %y = phi i8 [ 0 , %if.then ], [ %v , %if.else ]
1080
+ %r = srem i8 %x , %y
1081
+ ret i8 %r
1082
+ }
1083
+
1084
+ define i8 @srem_no_overflow_okay (i8 %i ) {
1085
+ ; CHECK-LABEL: @srem_no_overflow_okay(
1086
+ ; CHECK-NEXT: entry:
1087
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[I:%.*]], 9
1088
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1089
+ ; CHECK: if.then:
1090
+ ; CHECK-NEXT: call void @side.effect()
1091
+ ; CHECK-NEXT: br label [[IF_END:%.*]]
1092
+ ; CHECK: if.else:
1093
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @get.i8()
1094
+ ; CHECK-NEXT: br label [[IF_END]]
1095
+ ; CHECK: if.end:
1096
+ ; CHECK-NEXT: [[Y:%.*]] = phi i8 [ -1, [[IF_THEN]] ], [ [[V]], [[IF_ELSE]] ]
1097
+ ; CHECK-NEXT: [[R:%.*]] = srem i8 [[Y]], -128
1098
+ ; CHECK-NEXT: ret i8 [[R]]
1099
+ ;
1100
+ entry:
1101
+ %cmp = icmp ult i8 %i , 9
1102
+ br i1 %cmp , label %if.then , label %if.else
1103
+
1104
+ if.then:
1105
+ call void @side.effect ()
1106
+ br label %if.end
1107
+
1108
+ if.else:
1109
+ %v = call i8 @get.i8 ()
1110
+ br label %if.end
1111
+
1112
+ if.end:
1113
+ %y = phi i8 [ -1 , %if.then ], [ %v , %if.else ]
1114
+ %r = srem i8 %y , 128
1115
+ ret i8 %r
1116
+ }
1117
+
1118
+ define i8 @sdiv_overflow_ub (i8 %i ) {
1119
+ ; CHECK-LABEL: @sdiv_overflow_ub(
1120
+ ; CHECK-NEXT: entry:
1121
+ ; CHECK-NEXT: switch i8 [[I:%.*]], label [[SW_DEFAULT:%.*]] [
1122
+ ; CHECK-NEXT: i8 0, label [[RETURN:%.*]]
1123
+ ; CHECK-NEXT: i8 2, label [[SW_BB1:%.*]]
1124
+ ; CHECK-NEXT: i8 9, label [[SW_BB2:%.*]]
1125
+ ; CHECK-NEXT: ]
1126
+ ; CHECK: sw.bb1:
1127
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @get.i8()
1128
+ ; CHECK-NEXT: br label [[RETURN]]
1129
+ ; CHECK: sw.bb2:
1130
+ ; CHECK-NEXT: br label [[RETURN]]
1131
+ ; CHECK: sw.default:
1132
+ ; CHECK-NEXT: unreachable
1133
+ ; CHECK: return:
1134
+ ; CHECK-NEXT: [[Y:%.*]] = phi i8 [ [[V]], [[SW_BB1]] ], [ -1, [[SW_BB2]] ], [ 4, [[ENTRY:%.*]] ]
1135
+ ; CHECK-NEXT: [[R:%.*]] = sdiv i8 -128, [[Y]]
1136
+ ; CHECK-NEXT: ret i8 [[R]]
1137
+ ;
1138
+ entry:
1139
+ switch i8 %i , label %sw.default [
1140
+ i8 0 , label %sw.bb0
1141
+ i8 2 , label %sw.bb1
1142
+ i8 9 , label %sw.bb2
1143
+ ]
1144
+
1145
+ sw.bb0:
1146
+ br label %return
1147
+ sw.bb1:
1148
+ %v = call i8 @get.i8 ()
1149
+ br label %return
1150
+ sw.bb2:
1151
+ br label %return
1152
+ sw.default:
1153
+ unreachable
1154
+
1155
+ return:
1156
+ %y = phi i8 [ 4 , %sw.bb0 ], [ %v , %sw.bb1 ], [ -1 , %sw.bb2 ]
1157
+ %r = sdiv i8 128 , %y
1158
+ ret i8 %r
1159
+ }
1160
+
1161
+ define i8 @sdiv_overflow_ub_2x (i8 %i ) {
1162
+ ; CHECK-LABEL: @sdiv_overflow_ub_2x(
1163
+ ; CHECK-NEXT: entry:
1164
+ ; CHECK-NEXT: switch i8 [[I:%.*]], label [[SW_DEFAULT:%.*]] [
1165
+ ; CHECK-NEXT: i8 0, label [[RETURN:%.*]]
1166
+ ; CHECK-NEXT: i8 2, label [[SW_BB1:%.*]]
1167
+ ; CHECK-NEXT: i8 9, label [[SW_BB2:%.*]]
1168
+ ; CHECK-NEXT: ]
1169
+ ; CHECK: sw.bb1:
1170
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @get.i8()
1171
+ ; CHECK-NEXT: br label [[RETURN]]
1172
+ ; CHECK: sw.bb2:
1173
+ ; CHECK-NEXT: br label [[RETURN]]
1174
+ ; CHECK: sw.default:
1175
+ ; CHECK-NEXT: unreachable
1176
+ ; CHECK: return:
1177
+ ; CHECK-NEXT: [[Y:%.*]] = phi i8 [ [[V]], [[SW_BB1]] ], [ -1, [[SW_BB2]] ], [ 0, [[ENTRY:%.*]] ]
1178
+ ; CHECK-NEXT: [[R:%.*]] = sdiv i8 -128, [[Y]]
1179
+ ; CHECK-NEXT: ret i8 [[R]]
1180
+ ;
1181
+ entry:
1182
+ switch i8 %i , label %sw.default [
1183
+ i8 0 , label %sw.bb0
1184
+ i8 2 , label %sw.bb1
1185
+ i8 9 , label %sw.bb2
1186
+ ]
1187
+
1188
+ sw.bb0:
1189
+ br label %return
1190
+ sw.bb1:
1191
+ %v = call i8 @get.i8 ()
1192
+ br label %return
1193
+ sw.bb2:
1194
+ br label %return
1195
+ sw.default:
1196
+ unreachable
1197
+
1198
+ return:
1199
+ %y = phi i8 [ 0 , %sw.bb0 ], [ %v , %sw.bb1 ], [ -1 , %sw.bb2 ]
1200
+ %r = sdiv i8 128 , %y
1201
+ ret i8 %r
1202
+ }
1203
+
921
1204
attributes #0 = { null_pointer_is_valid }
922
1205
;.
923
1206
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
0 commit comments