|
3 | 3 | ; RUN: opt < %s -instcombine -S -data-layout="E-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" | FileCheck %s --check-prefixes=ALL,BE
|
4 | 4 | ; RUN: opt < %s -instcombine -S -data-layout="e-p:64:64:64-p1:32:32:32-p2:64:64:64-p3:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128-n8:16:32:64" | FileCheck %s --check-prefixes=ALL,LE
|
5 | 5 |
|
| 6 | +declare void @use_i32(i32) |
| 7 | +declare void @use_v2i32(<2 x i32>) |
| 8 | + |
6 | 9 | @inbuf = external global [32832 x i8]
|
7 | 10 |
|
8 | 11 | define i32 @test1(i32 %A) {
|
@@ -242,8 +245,8 @@ define i1 @test20(i1 %B) {
|
242 | 245 |
|
243 | 246 | define i32 @test21(i32 %X) {
|
244 | 247 | ; ALL-LABEL: @test21(
|
245 |
| -; ALL-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 255 |
246 |
| -; ALL-NEXT: ret i32 [[TMP1]] |
| 248 | +; ALL-NEXT: [[SEXT:%.*]] = and i32 [[X:%.*]], 255 |
| 249 | +; ALL-NEXT: ret i32 [[SEXT]] |
247 | 250 | ;
|
248 | 251 | %c1 = trunc i32 %X to i8
|
249 | 252 | %c2 = sext i8 %c1 to i32
|
@@ -1500,6 +1503,183 @@ define i32 @test93(i32 %A) {
|
1500 | 1503 | ret i32 %D
|
1501 | 1504 | }
|
1502 | 1505 |
|
| 1506 | +define i8 @trunc_lshr_sext(i8 %A) { |
| 1507 | +; ALL-LABEL: @trunc_lshr_sext( |
| 1508 | +; ALL-NEXT: [[D:%.*]] = ashr i8 [[A:%.*]], 6 |
| 1509 | +; ALL-NEXT: ret i8 [[D]] |
| 1510 | +; |
| 1511 | + %B = sext i8 %A to i32 |
| 1512 | + %C = lshr i32 %B, 6 |
| 1513 | + %D = trunc i32 %C to i8 |
| 1514 | + ret i8 %D |
| 1515 | +} |
| 1516 | + |
| 1517 | +define <2 x i8> @trunc_lshr_sext_uses1(<2 x i8> %A) { |
| 1518 | +; ALL-LABEL: @trunc_lshr_sext_uses1( |
| 1519 | +; ALL-NEXT: [[B:%.*]] = sext <2 x i8> [[A:%.*]] to <2 x i32> |
| 1520 | +; ALL-NEXT: call void @use_v2i32(<2 x i32> [[B]]) |
| 1521 | +; ALL-NEXT: [[C:%.*]] = lshr <2 x i32> [[B]], <i32 6, i32 6> |
| 1522 | +; ALL-NEXT: [[D:%.*]] = trunc <2 x i32> [[C]] to <2 x i8> |
| 1523 | +; ALL-NEXT: ret <2 x i8> [[D]] |
| 1524 | +; |
| 1525 | + %B = sext <2 x i8> %A to <2 x i32> |
| 1526 | + call void @use_v2i32(<2 x i32> %B) |
| 1527 | + %C = lshr <2 x i32> %B, <i32 6, i32 6> |
| 1528 | + %D = trunc <2 x i32> %C to <2 x i8> |
| 1529 | + ret <2 x i8> %D |
| 1530 | +} |
| 1531 | + |
| 1532 | +define i8 @trunc_lshr_sext_uses2(i8 %A) { |
| 1533 | +; ALL-LABEL: @trunc_lshr_sext_uses2( |
| 1534 | +; ALL-NEXT: [[B:%.*]] = sext i8 [[A:%.*]] to i32 |
| 1535 | +; ALL-NEXT: [[C:%.*]] = lshr i32 [[B]], 6 |
| 1536 | +; ALL-NEXT: call void @use_i32(i32 [[C]]) |
| 1537 | +; ALL-NEXT: [[D:%.*]] = trunc i32 [[C]] to i8 |
| 1538 | +; ALL-NEXT: ret i8 [[D]] |
| 1539 | +; |
| 1540 | + %B = sext i8 %A to i32 |
| 1541 | + %C = lshr i32 %B, 6 |
| 1542 | + call void @use_i32(i32 %C) |
| 1543 | + %D = trunc i32 %C to i8 |
| 1544 | + ret i8 %D |
| 1545 | +} |
| 1546 | + |
| 1547 | +define <2 x i8 >@trunc_lshr_sext_uses3(<2 x i8> %A) { |
| 1548 | +; ALL-LABEL: @trunc_lshr_sext_uses3( |
| 1549 | +; ALL-NEXT: [[B:%.*]] = sext <2 x i8> [[A:%.*]] to <2 x i32> |
| 1550 | +; ALL-NEXT: call void @use_v2i32(<2 x i32> [[B]]) |
| 1551 | +; ALL-NEXT: [[C:%.*]] = lshr <2 x i32> [[B]], <i32 6, i32 6> |
| 1552 | +; ALL-NEXT: call void @use_v2i32(<2 x i32> [[C]]) |
| 1553 | +; ALL-NEXT: [[D:%.*]] = trunc <2 x i32> [[C]] to <2 x i8> |
| 1554 | +; ALL-NEXT: ret <2 x i8> [[D]] |
| 1555 | +; |
| 1556 | + %B = sext <2 x i8 >%A to <2 x i32> |
| 1557 | + call void @use_v2i32(<2 x i32> %B) |
| 1558 | + %C = lshr <2 x i32> %B, <i32 6, i32 6> |
| 1559 | + call void @use_v2i32(<2 x i32> %C) |
| 1560 | + %D = trunc <2 x i32 >%C to <2 x i8> |
| 1561 | + ret <2 x i8> %D |
| 1562 | +} |
| 1563 | + |
| 1564 | +define <2 x i8> @trunc_lshr_overshift_sext(<2 x i8> %A) { |
| 1565 | +; ALL-LABEL: @trunc_lshr_overshift_sext( |
| 1566 | +; ALL-NEXT: [[B:%.*]] = sext <2 x i8> [[A:%.*]] to <2 x i32> |
| 1567 | +; ALL-NEXT: [[C:%.*]] = lshr <2 x i32> [[B]], <i32 8, i32 8> |
| 1568 | +; ALL-NEXT: [[D:%.*]] = trunc <2 x i32> [[C]] to <2 x i8> |
| 1569 | +; ALL-NEXT: ret <2 x i8> [[D]] |
| 1570 | +; |
| 1571 | + %B = sext <2 x i8> %A to <2 x i32> |
| 1572 | + %C = lshr <2 x i32> %B, <i32 8, i32 8> |
| 1573 | + %D = trunc <2 x i32> %C to <2 x i8> |
| 1574 | + ret <2 x i8> %D |
| 1575 | +} |
| 1576 | + |
| 1577 | +define i8 @trunc_lshr_overshift_sext_uses1(i8 %A) { |
| 1578 | +; ALL-LABEL: @trunc_lshr_overshift_sext_uses1( |
| 1579 | +; ALL-NEXT: [[B:%.*]] = sext i8 [[A:%.*]] to i32 |
| 1580 | +; ALL-NEXT: call void @use_i32(i32 [[B]]) |
| 1581 | +; ALL-NEXT: [[D:%.*]] = ashr i8 [[A]], 7 |
| 1582 | +; ALL-NEXT: ret i8 [[D]] |
| 1583 | +; |
| 1584 | + %B = sext i8 %A to i32 |
| 1585 | + call void @use_i32(i32 %B) |
| 1586 | + %C = lshr i32 %B, 8 |
| 1587 | + %D = trunc i32 %C to i8 |
| 1588 | + ret i8 %D |
| 1589 | +} |
| 1590 | + |
| 1591 | +define <2 x i8> @trunc_lshr_overshift_sext_uses2(<2 x i8> %A) { |
| 1592 | +; ALL-LABEL: @trunc_lshr_overshift_sext_uses2( |
| 1593 | +; ALL-NEXT: [[B:%.*]] = sext <2 x i8> [[A:%.*]] to <2 x i32> |
| 1594 | +; ALL-NEXT: [[C:%.*]] = lshr <2 x i32> [[B]], <i32 8, i32 8> |
| 1595 | +; ALL-NEXT: call void @use_v2i32(<2 x i32> [[C]]) |
| 1596 | +; ALL-NEXT: [[D:%.*]] = trunc <2 x i32> [[C]] to <2 x i8> |
| 1597 | +; ALL-NEXT: ret <2 x i8> [[D]] |
| 1598 | +; |
| 1599 | + %B = sext <2 x i8> %A to <2 x i32> |
| 1600 | + %C = lshr <2 x i32> %B, <i32 8, i32 8> |
| 1601 | + call void @use_v2i32(<2 x i32> %C) |
| 1602 | + %D = trunc <2 x i32> %C to <2 x i8> |
| 1603 | + ret <2 x i8> %D |
| 1604 | +} |
| 1605 | + |
| 1606 | +define i8 @trunc_lshr_overshift_sext_uses3(i8 %A) { |
| 1607 | +; ALL-LABEL: @trunc_lshr_overshift_sext_uses3( |
| 1608 | +; ALL-NEXT: [[B:%.*]] = sext i8 [[A:%.*]] to i32 |
| 1609 | +; ALL-NEXT: call void @use_i32(i32 [[B]]) |
| 1610 | +; ALL-NEXT: [[C:%.*]] = lshr i32 [[B]], 8 |
| 1611 | +; ALL-NEXT: call void @use_i32(i32 [[C]]) |
| 1612 | +; ALL-NEXT: [[D:%.*]] = trunc i32 [[C]] to i8 |
| 1613 | +; ALL-NEXT: ret i8 [[D]] |
| 1614 | +; |
| 1615 | + %B = sext i8 %A to i32 |
| 1616 | + call void @use_i32(i32 %B) |
| 1617 | + %C = lshr i32 %B, 8 |
| 1618 | + call void @use_i32(i32 %C) |
| 1619 | + %D = trunc i32 %C to i8 |
| 1620 | + ret i8 %D |
| 1621 | +} |
| 1622 | + |
| 1623 | +define <2 x i8> @trunc_lshr_overshift2_sext(<2 x i8> %A) { |
| 1624 | +; ALL-LABEL: @trunc_lshr_overshift2_sext( |
| 1625 | +; ALL-NEXT: [[B:%.*]] = sext <2 x i8> [[A:%.*]] to <2 x i32> |
| 1626 | +; ALL-NEXT: [[C:%.*]] = lshr <2 x i32> [[B]], <i32 25, i32 25> |
| 1627 | +; ALL-NEXT: [[D:%.*]] = trunc <2 x i32> [[C]] to <2 x i8> |
| 1628 | +; ALL-NEXT: ret <2 x i8> [[D]] |
| 1629 | +; |
| 1630 | + %B = sext <2 x i8> %A to <2 x i32> |
| 1631 | + %C = lshr <2 x i32> %B, <i32 25, i32 25> |
| 1632 | + %D = trunc <2 x i32> %C to <2 x i8> |
| 1633 | + ret <2 x i8> %D |
| 1634 | +} |
| 1635 | + |
| 1636 | +define i8 @trunc_lshr_overshift2_sext_uses1(i8 %A) { |
| 1637 | +; ALL-LABEL: @trunc_lshr_overshift2_sext_uses1( |
| 1638 | +; ALL-NEXT: [[B:%.*]] = sext i8 [[A:%.*]] to i32 |
| 1639 | +; ALL-NEXT: call void @use_i32(i32 [[B]]) |
| 1640 | +; ALL-NEXT: [[C:%.*]] = lshr i32 [[B]], 25 |
| 1641 | +; ALL-NEXT: [[D:%.*]] = trunc i32 [[C]] to i8 |
| 1642 | +; ALL-NEXT: ret i8 [[D]] |
| 1643 | +; |
| 1644 | + %B = sext i8 %A to i32 |
| 1645 | + call void @use_i32(i32 %B) |
| 1646 | + %C = lshr i32 %B, 25 |
| 1647 | + %D = trunc i32 %C to i8 |
| 1648 | + ret i8 %D |
| 1649 | +} |
| 1650 | + |
| 1651 | +define <2 x i8> @trunc_lshr_overshift2_sext_uses2(<2 x i8> %A) { |
| 1652 | +; ALL-LABEL: @trunc_lshr_overshift2_sext_uses2( |
| 1653 | +; ALL-NEXT: [[B:%.*]] = sext <2 x i8> [[A:%.*]] to <2 x i32> |
| 1654 | +; ALL-NEXT: [[C:%.*]] = lshr <2 x i32> [[B]], <i32 25, i32 25> |
| 1655 | +; ALL-NEXT: call void @use_v2i32(<2 x i32> [[C]]) |
| 1656 | +; ALL-NEXT: [[D:%.*]] = trunc <2 x i32> [[C]] to <2 x i8> |
| 1657 | +; ALL-NEXT: ret <2 x i8> [[D]] |
| 1658 | +; |
| 1659 | + %B = sext <2 x i8> %A to <2 x i32> |
| 1660 | + %C = lshr <2 x i32> %B, <i32 25, i32 25> |
| 1661 | + call void @use_v2i32(<2 x i32> %C) |
| 1662 | + %D = trunc <2 x i32> %C to <2 x i8> |
| 1663 | + ret <2 x i8> %D |
| 1664 | +} |
| 1665 | + |
| 1666 | +define i8 @trunc_lshr_overshift2_sext_uses3(i8 %A) { |
| 1667 | +; ALL-LABEL: @trunc_lshr_overshift2_sext_uses3( |
| 1668 | +; ALL-NEXT: [[B:%.*]] = sext i8 [[A:%.*]] to i32 |
| 1669 | +; ALL-NEXT: call void @use_i32(i32 [[B]]) |
| 1670 | +; ALL-NEXT: [[C:%.*]] = lshr i32 [[B]], 25 |
| 1671 | +; ALL-NEXT: call void @use_i32(i32 [[C]]) |
| 1672 | +; ALL-NEXT: [[D:%.*]] = trunc i32 [[C]] to i8 |
| 1673 | +; ALL-NEXT: ret i8 [[D]] |
| 1674 | +; |
| 1675 | + %B = sext i8 %A to i32 |
| 1676 | + call void @use_i32(i32 %B) |
| 1677 | + %C = lshr i32 %B, 25 |
| 1678 | + call void @use_i32(i32 %C) |
| 1679 | + %D = trunc i32 %C to i8 |
| 1680 | + ret i8 %D |
| 1681 | +} |
| 1682 | + |
1503 | 1683 | ; The following four tests sext + lshr + trunc patterns.
|
1504 | 1684 | ; PR33078
|
1505 | 1685 |
|
|
0 commit comments