@@ -1181,3 +1181,139 @@ define i32 @lshr_add_use2(i1 %x, i1 %y, i32* %p) {
1181
1181
%r = lshr i32 %sub , 31
1182
1182
ret i32 %r
1183
1183
}
1184
+
1185
+ define i32 @lshr_add_sexts (i1 %x , i1 %y ) {
1186
+ ; CHECK-LABEL: @lshr_add_sexts(
1187
+ ; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
1188
+ ; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1189
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1190
+ ; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
1191
+ ; CHECK-NEXT: ret i32 [[R]]
1192
+ ;
1193
+ %xs = sext i1 %x to i32
1194
+ %ys = sext i1 %y to i32
1195
+ %sub = add i32 %xs , %ys
1196
+ %r = lshr i32 %sub , 31
1197
+ ret i32 %r
1198
+ }
1199
+
1200
+ define i5 @and_add_sexts (i1 %x , i1 %y ) {
1201
+ ; CHECK-LABEL: @and_add_sexts(
1202
+ ; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i5
1203
+ ; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i5
1204
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i5 [[XS]], [[YS]]
1205
+ ; CHECK-NEXT: [[R:%.*]] = and i5 [[SUB]], -2
1206
+ ; CHECK-NEXT: ret i5 [[R]]
1207
+ ;
1208
+ %xs = sext i1 %x to i5
1209
+ %ys = sext i1 %y to i5
1210
+ %sub = add i5 %xs , %ys
1211
+ %r = and i5 %sub , 30
1212
+ ret i5 %r
1213
+ }
1214
+
1215
+ define <2 x i8 > @ashr_add_sexts (<2 x i1 > %x , <2 x i1 > %y ) {
1216
+ ; CHECK-LABEL: @ashr_add_sexts(
1217
+ ; CHECK-NEXT: [[XS:%.*]] = sext <2 x i1> [[X:%.*]] to <2 x i8>
1218
+ ; CHECK-NEXT: [[YS:%.*]] = sext <2 x i1> [[Y:%.*]] to <2 x i8>
1219
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw <2 x i8> [[YS]], [[XS]]
1220
+ ; CHECK-NEXT: [[R:%.*]] = ashr <2 x i8> [[SUB]], <i8 1, i8 1>
1221
+ ; CHECK-NEXT: ret <2 x i8> [[R]]
1222
+ ;
1223
+ %xs = sext <2 x i1 > %x to <2 x i8 >
1224
+ %ys = sext <2 x i1 > %y to <2 x i8 >
1225
+ %sub = add nsw <2 x i8 > %ys , %xs
1226
+ %r = ashr <2 x i8 > %sub , <i8 1 , i8 1 >
1227
+ ret <2 x i8 > %r
1228
+ }
1229
+
1230
+ define i32 @cmp_math_sexts (i32 %x , i32 %y ) {
1231
+ ; CHECK-LABEL: @cmp_math_sexts(
1232
+ ; CHECK-NEXT: [[GT:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
1233
+ ; CHECK-NEXT: [[LT:%.*]] = icmp ult i32 [[X]], [[Y]]
1234
+ ; CHECK-NEXT: [[XZ:%.*]] = sext i1 [[GT]] to i32
1235
+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i1 [[LT]] to i32
1236
+ ; CHECK-NEXT: [[S:%.*]] = add nsw i32 [[XZ]], [[TMP1]]
1237
+ ; CHECK-NEXT: [[R:%.*]] = lshr i32 [[S]], 31
1238
+ ; CHECK-NEXT: ret i32 [[R]]
1239
+ ;
1240
+ %gt = icmp ugt i32 %x , %y
1241
+ %lt = icmp ult i32 %x , %y
1242
+ %xz = sext i1 %gt to i32
1243
+ %yz = zext i1 %lt to i32
1244
+ %s = sub i32 %xz , %yz
1245
+ %r = lshr i32 %s , 31
1246
+ ret i32 %r
1247
+ }
1248
+
1249
+ ; Negative test - wrong type
1250
+
1251
+ define i32 @lshr_add_nonbool_sexts (i2 %x , i1 %y ) {
1252
+ ; CHECK-LABEL: @lshr_add_nonbool_sexts(
1253
+ ; CHECK-NEXT: [[XS:%.*]] = sext i2 [[X:%.*]] to i32
1254
+ ; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1255
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1256
+ ; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
1257
+ ; CHECK-NEXT: ret i32 [[R]]
1258
+ ;
1259
+ %xs = sext i2 %x to i32
1260
+ %ys = sext i1 %y to i32
1261
+ %sub = add i32 %xs , %ys
1262
+ %r = lshr i32 %sub , 31
1263
+ ret i32 %r
1264
+ }
1265
+
1266
+ ; Negative test - wrong demand
1267
+
1268
+ define i32 @and31_add_sexts (i1 %x , i1 %y ) {
1269
+ ; CHECK-LABEL: @and31_add_sexts(
1270
+ ; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
1271
+ ; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1272
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1273
+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[SUB]], 31
1274
+ ; CHECK-NEXT: ret i32 [[R]]
1275
+ ;
1276
+ %xs = sext i1 %x to i32
1277
+ %ys = sext i1 %y to i32
1278
+ %sub = add i32 %xs , %ys
1279
+ %r = and i32 %sub , 31
1280
+ ret i32 %r
1281
+ }
1282
+
1283
+ ; Negative test - extra use
1284
+
1285
+ define i32 @lshr_add_use_sexts (i1 %x , i1 %y , i32* %p ) {
1286
+ ; CHECK-LABEL: @lshr_add_use_sexts(
1287
+ ; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
1288
+ ; CHECK-NEXT: store i32 [[XS]], i32* [[P:%.*]], align 4
1289
+ ; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1290
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1291
+ ; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
1292
+ ; CHECK-NEXT: ret i32 [[R]]
1293
+ ;
1294
+ %xs = sext i1 %x to i32
1295
+ store i32 %xs , i32* %p
1296
+ %ys = sext i1 %y to i32
1297
+ %sub = add i32 %xs , %ys
1298
+ %r = lshr i32 %sub , 31
1299
+ ret i32 %r
1300
+ }
1301
+
1302
+ ; Negative test - extra use
1303
+
1304
+ define i32 @lshr_add_use2_sexts (i1 %x , i1 %y , i32* %p ) {
1305
+ ; CHECK-LABEL: @lshr_add_use2_sexts(
1306
+ ; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
1307
+ ; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1308
+ ; CHECK-NEXT: store i32 [[YS]], i32* [[P:%.*]], align 4
1309
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1310
+ ; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
1311
+ ; CHECK-NEXT: ret i32 [[R]]
1312
+ ;
1313
+ %xs = sext i1 %x to i32
1314
+ %ys = sext i1 %y to i32
1315
+ store i32 %ys , i32* %p
1316
+ %sub = add i32 %xs , %ys
1317
+ %r = lshr i32 %sub , 31
1318
+ ret i32 %r
1319
+ }
0 commit comments