@@ -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