Skip to content

Commit 8344dfa

Browse files
committed
Add reverse load pattern tests
1 parent e399dd6 commit 8344dfa

File tree

2 files changed

+460
-0
lines changed

2 files changed

+460
-0
lines changed

llvm/test/Transforms/AggressiveInstCombine/AArch64/or-load.ll

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)