@@ -1702,4 +1702,165 @@ return:
1702
1702
ret void
1703
1703
}
1704
1704
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
+
1705
1866
!12 = !{i32 1 }
0 commit comments