@@ -1294,3 +1294,100 @@ 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+ %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