Skip to content

Commit 2e5bba6

Browse files
committed
[InstCombine] add tests for sext+lshr+trunc; NFC
Shows missing transforms with extra uses and vectors.
1 parent 2c63ea6 commit 2e5bba6

File tree

1 file changed

+182
-2
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+182
-2
lines changed

llvm/test/Transforms/InstCombine/cast.ll

Lines changed: 182 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
; 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
44
; 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
55

6+
declare void @use_i32(i32)
7+
declare void @use_v2i32(<2 x i32>)
8+
69
@inbuf = external global [32832 x i8]
710

811
define i32 @test1(i32 %A) {
@@ -242,8 +245,8 @@ define i1 @test20(i1 %B) {
242245

243246
define i32 @test21(i32 %X) {
244247
; 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]]
247250
;
248251
%c1 = trunc i32 %X to i8
249252
%c2 = sext i8 %c1 to i32
@@ -1500,6 +1503,183 @@ define i32 @test93(i32 %A) {
15001503
ret i32 %D
15011504
}
15021505

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+
15031683
; The following four tests sext + lshr + trunc patterns.
15041684
; PR33078
15051685

0 commit comments

Comments
 (0)