@@ -1511,3 +1511,218 @@ define i64 @eggs(ptr noundef readonly %arg) {
15111511 %tmp39 = or i64 %tmp38 , %tmp37
15121512 ret i64 %tmp39
15131513}
1514+
1515+ define i32 @loadCombine_4consecutive_mixsize1 (ptr %p ) {
1516+ ; ALL-LABEL: @loadCombine_4consecutive_mixsize1(
1517+ ; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2
1518+ ; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 3
1519+ ; ALL-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 2
1520+ ; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1
1521+ ; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1
1522+ ; ALL-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i32
1523+ ; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
1524+ ; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
1525+ ; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 16
1526+ ; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 24
1527+ ; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]
1528+ ; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]
1529+ ; ALL-NEXT: ret i32 [[O2]]
1530+ ;
1531+ %p1 = getelementptr i8 , ptr %p , i32 2
1532+ %p2 = getelementptr i8 , ptr %p , i32 3
1533+ %l1 = load i16 , ptr %p
1534+ %l2 = load i8 , ptr %p1
1535+ %l3 = load i8 , ptr %p2
1536+
1537+ %e1 = zext i16 %l1 to i32
1538+ %e2 = zext i8 %l2 to i32
1539+ %e3 = zext i8 %l3 to i32
1540+
1541+ %s2 = shl i32 %e2 , 16
1542+ %s3 = shl i32 %e3 , 24
1543+
1544+ %o1 = or i32 %e1 , %s2
1545+ %o2 = or i32 %o1 , %s3
1546+ ret i32 %o2
1547+ }
1548+
1549+ define i32 @loadCombine_4consecutive_mixsize1_BE (ptr %p ) {
1550+ ; ALL-LABEL: @loadCombine_4consecutive_mixsize1_BE(
1551+ ; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2
1552+ ; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 3
1553+ ; ALL-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 2
1554+ ; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1
1555+ ; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1
1556+ ; ALL-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i32
1557+ ; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
1558+ ; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
1559+ ; ALL-NEXT: [[S1:%.*]] = shl i32 [[E1]], 16
1560+ ; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8
1561+ ; ALL-NEXT: [[O1:%.*]] = or i32 [[S1]], [[S2]]
1562+ ; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[E3]]
1563+ ; ALL-NEXT: ret i32 [[O2]]
1564+ ;
1565+ %p1 = getelementptr i8 , ptr %p , i32 2
1566+ %p2 = getelementptr i8 , ptr %p , i32 3
1567+ %l1 = load i16 , ptr %p
1568+ %l2 = load i8 , ptr %p1
1569+ %l3 = load i8 , ptr %p2
1570+
1571+ %e1 = zext i16 %l1 to i32
1572+ %e2 = zext i8 %l2 to i32
1573+ %e3 = zext i8 %l3 to i32
1574+
1575+ %s1 = shl i32 %e1 , 16
1576+ %s2 = shl i32 %e2 , 8
1577+
1578+ %o1 = or i32 %s1 , %s2
1579+ %o2 = or i32 %o1 , %e3
1580+ ret i32 %o2
1581+ }
1582+
1583+ define i32 @loadCombine_4consecutive_rev_mixsize1 (ptr %p ) {
1584+ ; ALL-LABEL: @loadCombine_4consecutive_rev_mixsize1(
1585+ ; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2
1586+ ; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
1587+ ; ALL-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 2
1588+ ; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P2]], align 1
1589+ ; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P3]], align 1
1590+ ; ALL-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i32
1591+ ; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
1592+ ; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
1593+ ; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 16
1594+ ; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 24
1595+ ; ALL-NEXT: [[O1:%.*]] = or i32 [[S3]], [[S2]]
1596+ ; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[E1]]
1597+ ; ALL-NEXT: ret i32 [[O2]]
1598+ ;
1599+ %p2 = getelementptr i8 , ptr %p , i32 2
1600+ %p3 = getelementptr i8 , ptr %p , i32 3
1601+ %l1 = load i16 , ptr %p
1602+ %l2 = load i8 , ptr %p2
1603+ %l3 = load i8 , ptr %p3
1604+
1605+ %e1 = zext i16 %l1 to i32
1606+ %e2 = zext i8 %l2 to i32
1607+ %e3 = zext i8 %l3 to i32
1608+
1609+ %s2 = shl i32 %e2 , 16
1610+ %s3 = shl i32 %e3 , 24
1611+
1612+ %o1 = or i32 %s3 , %s2
1613+ %o2 = or i32 %o1 , %e1
1614+ ret i32 %o2
1615+ }
1616+
1617+ define i32 @loadCombine_4consecutive_rev_mixsize1_BE (ptr %p ) {
1618+ ; ALL-LABEL: @loadCombine_4consecutive_rev_mixsize1_BE(
1619+ ; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2
1620+ ; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
1621+ ; ALL-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 2
1622+ ; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P2]], align 1
1623+ ; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P3]], align 1
1624+ ; ALL-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i32
1625+ ; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
1626+ ; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
1627+ ; ALL-NEXT: [[S1:%.*]] = shl i32 [[E1]], 16
1628+ ; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8
1629+ ; ALL-NEXT: [[O1:%.*]] = or i32 [[E3]], [[S2]]
1630+ ; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S1]]
1631+ ; ALL-NEXT: ret i32 [[O2]]
1632+ ;
1633+ %p2 = getelementptr i8 , ptr %p , i32 2
1634+ %p3 = getelementptr i8 , ptr %p , i32 3
1635+ %l1 = load i16 , ptr %p
1636+ %l2 = load i8 , ptr %p2
1637+ %l3 = load i8 , ptr %p3
1638+
1639+ %e1 = zext i16 %l1 to i32
1640+ %e2 = zext i8 %l2 to i32
1641+ %e3 = zext i8 %l3 to i32
1642+
1643+ %s1 = shl i32 %e1 , 16
1644+ %s2 = shl i32 %e2 , 8
1645+
1646+ %o1 = or i32 %e3 , %s2
1647+ %o2 = or i32 %o1 , %s1
1648+ ret i32 %o2
1649+ }
1650+
1651+ define i32 @loadCombine_4consecutive_mixsize2 (ptr %p ) {
1652+ ; ALL-LABEL: @loadCombine_4consecutive_mixsize2(
1653+ ; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
1654+ ; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
1655+ ; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1
1656+ ; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1
1657+ ; ALL-NEXT: [[L3:%.*]] = load i16, ptr [[P2]], align 2
1658+ ; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
1659+ ; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
1660+ ; ALL-NEXT: [[E3:%.*]] = zext i16 [[L3]] to i32
1661+ ; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8
1662+ ; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16
1663+ ; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]
1664+ ; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]
1665+ ; ALL-NEXT: ret i32 [[O2]]
1666+ ;
1667+ %p1 = getelementptr i8 , ptr %p , i32 1
1668+ %p2 = getelementptr i8 , ptr %p , i32 2
1669+ %l1 = load i8 , ptr %p
1670+ %l2 = load i8 , ptr %p1
1671+ %l3 = load i16 , ptr %p2
1672+
1673+ %e1 = zext i8 %l1 to i32
1674+ %e2 = zext i8 %l2 to i32
1675+ %e3 = zext i16 %l3 to i32
1676+
1677+ %s2 = shl i32 %e2 , 8
1678+ %s3 = shl i32 %e3 , 16
1679+
1680+ %o1 = or i32 %e1 , %s2
1681+ %o2 = or i32 %o1 , %s3
1682+ ret i32 %o2
1683+ }
1684+
1685+ define i32 @loadCombine_4consecutive_lower_index_comes_before (ptr %p ) {
1686+ ; ALL-LABEL: @loadCombine_4consecutive_lower_index_comes_before(
1687+ ; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1
1688+ ; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2
1689+ ; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3
1690+ ; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1
1691+ ; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1
1692+ ; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1
1693+ ; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1
1694+ ; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32
1695+ ; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32
1696+ ; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32
1697+ ; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32
1698+ ; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8
1699+ ; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16
1700+ ; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24
1701+ ; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]
1702+ ; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]
1703+ ; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]
1704+ ; ALL-NEXT: ret i32 [[O3]]
1705+ ;
1706+ %p1 = getelementptr i8 , ptr %p , i32 1
1707+ %p2 = getelementptr i8 , ptr %p , i32 2
1708+ %p3 = getelementptr i8 , ptr %p , i32 3
1709+ %l4 = load i8 , ptr %p3
1710+ %l3 = load i8 , ptr %p2
1711+ %l2 = load i8 , ptr %p1
1712+ %l1 = load i8 , ptr %p
1713+
1714+ %e1 = zext i8 %l1 to i32
1715+ %e2 = zext i8 %l2 to i32
1716+ %e3 = zext i8 %l3 to i32
1717+ %e4 = zext i8 %l4 to i32
1718+
1719+ %s2 = shl i32 %e2 , 8
1720+ %s3 = shl i32 %e3 , 16
1721+ %s4 = shl i32 %e4 , 24
1722+
1723+ %o1 = or i32 %e1 , %s2
1724+ %o2 = or i32 %o1 , %s3
1725+ %o3 = or i32 %o2 , %s4
1726+ ret i32 %o3
1727+ }
1728+
0 commit comments