Skip to content

Commit bd5fbab

Browse files
committed
[SimplifyCFG] Add tests for sinking with multiple uses (NFC)
1 parent dc726c3 commit bd5fbab

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed

llvm/test/Transforms/SimplifyCFG/X86/sink-common-code.ll

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,4 +1702,165 @@ return:
17021702
ret void
17031703
}
17041704

1705+
define ptr @multi_use_in_phi(i1 %cond, ptr %p, i64 %a, i64 %b) {
1706+
; CHECK-LABEL: @multi_use_in_phi(
1707+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
1708+
; CHECK: if:
1709+
; CHECK-NEXT: call void @dummy()
1710+
; CHECK-NEXT: [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
1711+
; CHECK-NEXT: br label [[JOIN:%.*]]
1712+
; CHECK: else:
1713+
; CHECK-NEXT: [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
1714+
; CHECK-NEXT: br label [[JOIN]]
1715+
; CHECK: join:
1716+
; CHECK-NEXT: [[GEP1_B_SINK:%.*]] = phi ptr [ [[GEP1_B]], [[ELSE]] ], [ [[GEP1_A]], [[IF]] ]
1717+
; CHECK-NEXT: [[PHI1:%.*]] = phi ptr [ [[GEP1_A]], [[IF]] ], [ [[GEP1_B]], [[ELSE]] ]
1718+
; CHECK-NEXT: [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B_SINK]], i64 [[B:%.*]]
1719+
; CHECK-NEXT: call void @use.ptr(ptr [[PHI1]])
1720+
; CHECK-NEXT: ret ptr [[GEP2_B]]
1721+
;
1722+
br i1 %cond, label %if, label %else
1723+
1724+
if:
1725+
call void @dummy()
1726+
%gep1.a = getelementptr i8, ptr %p, i64 %a
1727+
%gep2.a = getelementptr i8, ptr %gep1.a, i64 %b
1728+
br label %join
1729+
1730+
else:
1731+
%gep1.b = getelementptr i8, ptr %p, i64 %a
1732+
%gep2.b = getelementptr i8, ptr %gep1.b, i64 %b
1733+
br label %join
1734+
1735+
join:
1736+
%phi1 = phi ptr [ %gep1.a, %if ], [ %gep1.b, %else ]
1737+
%phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
1738+
call void @use.ptr(ptr %phi1)
1739+
ret ptr %phi2
1740+
}
1741+
1742+
define ptr @multi_use_in_phi_inconsistent(i1 %cond, ptr %p, i64 %a, i64 %b) {
1743+
; CHECK-LABEL: @multi_use_in_phi_inconsistent(
1744+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
1745+
; CHECK: if:
1746+
; CHECK-NEXT: call void @dummy()
1747+
; CHECK-NEXT: [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
1748+
; CHECK-NEXT: br label [[JOIN:%.*]]
1749+
; CHECK: else:
1750+
; CHECK-NEXT: [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
1751+
; CHECK-NEXT: br label [[JOIN]]
1752+
; CHECK: join:
1753+
; CHECK-NEXT: [[GEP1_B_SINK:%.*]] = phi ptr [ [[GEP1_B]], [[ELSE]] ], [ [[GEP1_A]], [[IF]] ]
1754+
; CHECK-NEXT: [[PHI1:%.*]] = phi ptr [ [[GEP1_A]], [[IF]] ], [ [[P]], [[ELSE]] ]
1755+
; CHECK-NEXT: [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B_SINK]], i64 [[B:%.*]]
1756+
; CHECK-NEXT: call void @use.ptr(ptr [[PHI1]])
1757+
; CHECK-NEXT: ret ptr [[GEP2_B]]
1758+
;
1759+
br i1 %cond, label %if, label %else
1760+
1761+
if:
1762+
call void @dummy()
1763+
%gep1.a = getelementptr i8, ptr %p, i64 %a
1764+
%gep2.a = getelementptr i8, ptr %gep1.a, i64 %b
1765+
br label %join
1766+
1767+
else:
1768+
%gep1.b = getelementptr i8, ptr %p, i64 %a
1769+
%gep2.b = getelementptr i8, ptr %gep1.b, i64 %b
1770+
br label %join
1771+
1772+
join:
1773+
%phi1 = phi ptr [ %gep1.a, %if ], [ %p, %else ]
1774+
%phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
1775+
call void @use.ptr(ptr %phi1)
1776+
ret ptr %phi2
1777+
}
1778+
1779+
define i64 @multi_use_in_block(i1 %cond, ptr %p, i64 %a, i64 %b) {
1780+
; CHECK-LABEL: @multi_use_in_block(
1781+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
1782+
; CHECK: if:
1783+
; CHECK-NEXT: call void @dummy()
1784+
; CHECK-NEXT: [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
1785+
; CHECK-NEXT: [[V_A:%.*]] = load i64, ptr [[GEP1_A]], align 8
1786+
; CHECK-NEXT: [[GEP2_A:%.*]] = getelementptr i8, ptr [[GEP1_A]], i64 [[V_A]]
1787+
; CHECK-NEXT: br label [[JOIN:%.*]]
1788+
; CHECK: else:
1789+
; CHECK-NEXT: [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
1790+
; CHECK-NEXT: [[V_B:%.*]] = load i64, ptr [[GEP1_B]], align 8
1791+
; CHECK-NEXT: [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B]], i64 [[V_B]]
1792+
; CHECK-NEXT: br label [[JOIN]]
1793+
; CHECK: join:
1794+
; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ [[V_A]], [[IF]] ], [ [[V_B]], [[ELSE]] ]
1795+
; CHECK-NEXT: [[PHI2:%.*]] = phi ptr [ [[GEP2_A]], [[IF]] ], [ [[GEP2_B]], [[ELSE]] ]
1796+
; CHECK-NEXT: call void @use.ptr(ptr [[PHI2]])
1797+
; CHECK-NEXT: ret i64 [[PHI1]]
1798+
;
1799+
br i1 %cond, label %if, label %else
1800+
1801+
if:
1802+
call void @dummy()
1803+
%gep1.a = getelementptr i8, ptr %p, i64 %a
1804+
%v.a = load i64, ptr %gep1.a
1805+
%gep2.a = getelementptr i8, ptr %gep1.a, i64 %v.a
1806+
br label %join
1807+
1808+
else:
1809+
%gep1.b = getelementptr i8, ptr %p, i64 %a
1810+
%v.b = load i64, ptr %gep1.b
1811+
%gep2.b = getelementptr i8, ptr %gep1.b, i64 %v.b
1812+
br label %join
1813+
1814+
join:
1815+
%phi1 = phi i64 [ %v.a, %if ], [ %v.b, %else ]
1816+
%phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
1817+
call void @use.ptr(ptr %phi2)
1818+
ret i64 %phi1
1819+
}
1820+
1821+
define i64 @multi_use_in_block_inconsistent(i1 %cond, ptr %p, i64 %a, i64 %b) {
1822+
; CHECK-LABEL: @multi_use_in_block_inconsistent(
1823+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
1824+
; CHECK: if:
1825+
; CHECK-NEXT: call void @dummy()
1826+
; CHECK-NEXT: [[GEP1_A:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[A:%.*]]
1827+
; CHECK-NEXT: [[V_A:%.*]] = load i64, ptr [[GEP1_A]], align 8
1828+
; CHECK-NEXT: [[GEP2_A:%.*]] = getelementptr i8, ptr [[GEP1_A]], i64 [[V_A]]
1829+
; CHECK-NEXT: br label [[JOIN:%.*]]
1830+
; CHECK: else:
1831+
; CHECK-NEXT: [[GEP1_B:%.*]] = getelementptr i8, ptr [[P]], i64 [[A]]
1832+
; CHECK-NEXT: [[V_B:%.*]] = load i64, ptr [[P]], align 8
1833+
; CHECK-NEXT: [[GEP2_B:%.*]] = getelementptr i8, ptr [[GEP1_B]], i64 [[V_B]]
1834+
; CHECK-NEXT: br label [[JOIN]]
1835+
; CHECK: join:
1836+
; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ [[V_A]], [[IF]] ], [ [[V_B]], [[ELSE]] ]
1837+
; CHECK-NEXT: [[PHI2:%.*]] = phi ptr [ [[GEP2_A]], [[IF]] ], [ [[GEP2_B]], [[ELSE]] ]
1838+
; CHECK-NEXT: call void @use.ptr(ptr [[PHI2]])
1839+
; CHECK-NEXT: ret i64 [[PHI1]]
1840+
;
1841+
br i1 %cond, label %if, label %else
1842+
1843+
if:
1844+
call void @dummy()
1845+
%gep1.a = getelementptr i8, ptr %p, i64 %a
1846+
%v.a = load i64, ptr %gep1.a
1847+
%gep2.a = getelementptr i8, ptr %gep1.a, i64 %v.a
1848+
br label %join
1849+
1850+
else:
1851+
%gep1.b = getelementptr i8, ptr %p, i64 %a
1852+
%v.b = load i64, ptr %p
1853+
%gep2.b = getelementptr i8, ptr %gep1.b, i64 %v.b
1854+
br label %join
1855+
1856+
join:
1857+
%phi1 = phi i64 [ %v.a, %if ], [ %v.b, %else ]
1858+
%phi2 = phi ptr [ %gep2.a, %if ], [ %gep2.b, %else ]
1859+
call void @use.ptr(ptr %phi2)
1860+
ret i64 %phi1
1861+
}
1862+
1863+
declare void @dummy()
1864+
declare void @use.ptr(ptr)
1865+
17051866
!12 = !{i32 1}

0 commit comments

Comments
 (0)