@@ -1294,3 +1294,96 @@ entry:
12941294 %div = sdiv i32 %add , %add2
12951295 ret i32 %div
12961296}
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+ %0 = tail call i8 @llvm.ctpop.i8 (i8 %y )
1313+ %1 = icmp eq i8 %0 , 1
1314+ br i1 %1 , label %bb1 , label %bb3
1315+
1316+ bb1:
1317+ %2 = udiv i8 %x , %y
1318+ br label %bb3
1319+
1320+ bb3:
1321+ %_0.sroa.0.0 = phi i8 [ %2 , %bb1 ], [ 0 , %start ]
1322+ ret i8 %_0.sroa.0.0
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+ %0 = tail call i8 @llvm.ctpop.i8 (i8 %y )
1336+ %cond = icmp eq i8 %0 , 1
1337+ tail call void @llvm.assume (i1 %cond )
1338+ %_0 = udiv exact i8 %x , %y
1339+ ret i8 %_0
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+ %0 = tail call i7 @llvm.ctpop.i7 (i7 %y )
1353+ %cond = icmp eq i7 %0 , 1
1354+ tail call void @llvm.assume (i1 %cond )
1355+ %_0 = udiv i7 %x , %y
1356+ ret i7 %_0
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+ %0 = tail call i8 @llvm.ctpop.i8 (i8 %y )
1371+ %cond = icmp eq i8 %0 , 1
1372+ tail call void @llvm.assume (i1 %cond )
1373+ %_0 = udiv i8 %x , %y
1374+ call void @use (i8 %_0 )
1375+ ret i8 %_0
1376+ }
1377+
1378+ define i8 @udiv_power_of_two_negative (i8 %x , i8 %y ) {
1379+ ; CHECK-LABEL: @udiv_power_of_two_negative(
1380+ ; CHECK-NEXT: start:
1381+ ; CHECK-NEXT: [[_0:%.*]] = udiv i8 [[X:%.*]], [[Y:%.*]]
1382+ ; CHECK-NEXT: ret i8 [[_0]]
1383+ ;
1384+ start:
1385+ %0 = tail call i8 @llvm.ctpop.i8 (i8 %y )
1386+ %cond = icmp eq i8 %0 , 1
1387+ %_0 = udiv i8 %x , %y
1388+ ret i8 %_0
1389+ }
0 commit comments