@@ -1294,3 +1294,100 @@ entry:
1294
1294
%div = sdiv i32 %add , %add2
1295
1295
ret i32 %div
1296
1296
}
1297
+
1298
+ define i8 @udiv_if_power_of_two (i8 %x , i8 %y ) {
1299
+ ; CHECK-LABEL: @udiv_if_power_of_two(
1300
+ ; CHECK-NEXT: start:
1301
+ ; CHECK-NEXT: [[TMP0:%.*]] = tail call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[Y:%.*]])
1302
+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[TMP0]], 1
1303
+ ; CHECK-NEXT: br i1 [[TMP1]], label [[BB1:%.*]], label [[BB3:%.*]]
1304
+ ; CHECK: bb1:
1305
+ ; CHECK-NEXT: [[TMP3:%.*]] = udiv i8 [[X:%.*]], [[Y]]
1306
+ ; CHECK-NEXT: br label [[BB3]]
1307
+ ; CHECK: bb3:
1308
+ ; CHECK-NEXT: [[_0_SROA_0_0:%.*]] = phi i8 [ [[TMP3]], [[BB1]] ], [ 0, [[START:%.*]] ]
1309
+ ; CHECK-NEXT: ret i8 [[_0_SROA_0_0]]
1310
+ ;
1311
+ start:
1312
+ %ctpop = tail call i8 @llvm.ctpop.i8 (i8 %y )
1313
+ %cmp = icmp eq i8 %ctpop , 1
1314
+ br i1 %cmp , label %bb1 , label %bb3
1315
+
1316
+ bb1:
1317
+ %div = udiv i8 %x , %y
1318
+ br label %bb3
1319
+
1320
+ bb3:
1321
+ %result = phi i8 [ %div , %bb1 ], [ 0 , %start ]
1322
+ ret i8 %result
1323
+ }
1324
+
1325
+ define i8 @udiv_exact_assume_power_of_two (i8 %x , i8 %y ) {
1326
+ ; CHECK-LABEL: @udiv_exact_assume_power_of_two(
1327
+ ; CHECK-NEXT: start:
1328
+ ; CHECK-NEXT: [[TMP0:%.*]] = tail call range(i8 1, 9) i8 @llvm.ctpop.i8(i8 [[Y:%.*]])
1329
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[TMP0]], 1
1330
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 [[COND]])
1331
+ ; CHECK-NEXT: [[_0:%.*]] = udiv exact i8 [[X:%.*]], [[Y]]
1332
+ ; CHECK-NEXT: ret i8 [[_0]]
1333
+ ;
1334
+ start:
1335
+ %ctpop = tail call i8 @llvm.ctpop.i8 (i8 %y )
1336
+ %cond = icmp eq i8 %ctpop , 1
1337
+ tail call void @llvm.assume (i1 %cond )
1338
+ %div = udiv exact i8 %x , %y
1339
+ ret i8 %div
1340
+ }
1341
+
1342
+ define i7 @udiv_assume_power_of_two_illegal_type (i7 %x , i7 %y ) {
1343
+ ; CHECK-LABEL: @udiv_assume_power_of_two_illegal_type(
1344
+ ; CHECK-NEXT: start:
1345
+ ; CHECK-NEXT: [[TMP0:%.*]] = tail call range(i7 1, 8) i7 @llvm.ctpop.i7(i7 [[Y:%.*]])
1346
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i7 [[TMP0]], 1
1347
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 [[COND]])
1348
+ ; CHECK-NEXT: [[_0:%.*]] = udiv i7 [[X:%.*]], [[Y]]
1349
+ ; CHECK-NEXT: ret i7 [[_0]]
1350
+ ;
1351
+ start:
1352
+ %ctpop = tail call i7 @llvm.ctpop.i7 (i7 %y )
1353
+ %cond = icmp eq i7 %ctpop , 1
1354
+ tail call void @llvm.assume (i1 %cond )
1355
+ %div = udiv i7 %x , %y
1356
+ ret i7 %div
1357
+ }
1358
+
1359
+ define i8 @udiv_assume_power_of_two_multiuse (i8 %x , i8 %y ) {
1360
+ ; CHECK-LABEL: @udiv_assume_power_of_two_multiuse(
1361
+ ; CHECK-NEXT: start:
1362
+ ; CHECK-NEXT: [[TMP0:%.*]] = tail call range(i8 1, 9) i8 @llvm.ctpop.i8(i8 [[Y:%.*]])
1363
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[TMP0]], 1
1364
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 [[COND]])
1365
+ ; CHECK-NEXT: [[_0:%.*]] = udiv i8 [[X:%.*]], [[Y]]
1366
+ ; CHECK-NEXT: call void @use(i8 [[_0]])
1367
+ ; CHECK-NEXT: ret i8 [[_0]]
1368
+ ;
1369
+ start:
1370
+ %ctpop = tail call i8 @llvm.ctpop.i8 (i8 %y )
1371
+ %cond = icmp eq i8 %ctpop , 1
1372
+ tail call void @llvm.assume (i1 %cond )
1373
+ %div = udiv i8 %x , %y
1374
+ call void @use (i8 %div )
1375
+ ret i8 %div
1376
+ }
1377
+
1378
+ define i8 @udiv_power_of_two_negative (i8 %x , i8 %y , i8 %z ) {
1379
+ ; CHECK-LABEL: @udiv_power_of_two_negative(
1380
+ ; CHECK-NEXT: start:
1381
+ ; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[Z:%.*]])
1382
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i8 [[CTPOP]], 1
1383
+ ; CHECK-NEXT: tail call void @llvm.assume(i1 [[COND]])
1384
+ ; CHECK-NEXT: [[_0:%.*]] = udiv i8 [[X:%.*]], [[Y:%.*]]
1385
+ ; CHECK-NEXT: ret i8 [[_0]]
1386
+ ;
1387
+ start:
1388
+ %ctpop = tail call i8 @llvm.ctpop.i8 (i8 %z )
1389
+ %cond = icmp eq i8 %ctpop , 1
1390
+ tail call void @llvm.assume (i1 %cond )
1391
+ %div = udiv i8 %x , %y
1392
+ ret i8 %div
1393
+ }
0 commit comments