@@ -1846,6 +1846,193 @@ join:
1846
1846
ret i64 %phi1
1847
1847
}
1848
1848
1849
+ define i64 @load_with_sunk_gep (i1 %cond , ptr %p , i64 %a , i64 %b ) {
1850
+ ; CHECK-LABEL: @load_with_sunk_gep(
1851
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
1852
+ ; CHECK: if:
1853
+ ; CHECK-NEXT: call void @dummy()
1854
+ ; CHECK-NEXT: br label [[JOIN]]
1855
+ ; CHECK: join:
1856
+ ; CHECK-NEXT: [[B_SINK:%.*]] = phi i64 [ [[A:%.*]], [[IF]] ], [ [[B:%.*]], [[TMP0:%.*]] ]
1857
+ ; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 [[B_SINK]]
1858
+ ; CHECK-NEXT: [[V_B:%.*]] = load i64, ptr [[GEP_B]], align 8
1859
+ ; CHECK-NEXT: ret i64 [[V_B]]
1860
+ ;
1861
+ br i1 %cond , label %if , label %else
1862
+
1863
+ if:
1864
+ call void @dummy ()
1865
+ %gep.a = getelementptr i8 , ptr %p , i64 %a
1866
+ %v.a = load i64 , ptr %gep.a
1867
+ br label %join
1868
+
1869
+ else:
1870
+ %gep.b = getelementptr i8 , ptr %p , i64 %b
1871
+ %v.b = load i64 , ptr %gep.b
1872
+ br label %join
1873
+
1874
+ join:
1875
+ %v = phi i64 [ %v.a , %if ], [ %v.b , %else ]
1876
+ ret i64 %v
1877
+ }
1878
+
1879
+ define i64 @load_with_non_sunk_gep_both (i1 %cond , ptr %p.a , ptr %p.b , i64 %a , i64 %b ) {
1880
+ ; CHECK-LABEL: @load_with_non_sunk_gep_both(
1881
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
1882
+ ; CHECK: if:
1883
+ ; CHECK-NEXT: call void @dummy()
1884
+ ; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr i8, ptr [[P_A:%.*]], i64 [[A:%.*]]
1885
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
1886
+ ; CHECK: else:
1887
+ ; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr i8, ptr [[P_B:%.*]], i64 [[B:%.*]]
1888
+ ; CHECK-NEXT: br label [[JOIN]]
1889
+ ; CHECK: join:
1890
+ ; CHECK-NEXT: [[GEP_B_SINK:%.*]] = phi ptr [ [[GEP_B]], [[ELSE]] ], [ [[GEP_A]], [[IF]] ]
1891
+ ; CHECK-NEXT: [[V_B:%.*]] = load i64, ptr [[GEP_B_SINK]], align 8
1892
+ ; CHECK-NEXT: ret i64 [[V_B]]
1893
+ ;
1894
+ br i1 %cond , label %if , label %else
1895
+
1896
+ if:
1897
+ call void @dummy ()
1898
+ %gep.a = getelementptr i8 , ptr %p.a , i64 %a
1899
+ %v.a = load i64 , ptr %gep.a
1900
+ br label %join
1901
+
1902
+ else:
1903
+ %gep.b = getelementptr i8 , ptr %p.b , i64 %b
1904
+ %v.b = load i64 , ptr %gep.b
1905
+ br label %join
1906
+
1907
+ join:
1908
+ %v = phi i64 [ %v.a , %if ], [ %v.b , %else ]
1909
+ ret i64 %v
1910
+ }
1911
+
1912
+ define i64 @load_with_non_sunk_gep_left (i1 %cond , ptr %p.a , ptr %p.b , i64 %b ) {
1913
+ ; CHECK-LABEL: @load_with_non_sunk_gep_left(
1914
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
1915
+ ; CHECK: if:
1916
+ ; CHECK-NEXT: call void @dummy()
1917
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
1918
+ ; CHECK: else:
1919
+ ; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr i8, ptr [[P_B:%.*]], i64 [[B:%.*]]
1920
+ ; CHECK-NEXT: br label [[JOIN]]
1921
+ ; CHECK: join:
1922
+ ; CHECK-NEXT: [[GEP_B_SINK:%.*]] = phi ptr [ [[GEP_B]], [[ELSE]] ], [ [[P_A:%.*]], [[IF]] ]
1923
+ ; CHECK-NEXT: [[V_B:%.*]] = load i64, ptr [[GEP_B_SINK]], align 8
1924
+ ; CHECK-NEXT: ret i64 [[V_B]]
1925
+ ;
1926
+ br i1 %cond , label %if , label %else
1927
+
1928
+ if:
1929
+ call void @dummy ()
1930
+ %v.a = load i64 , ptr %p.a
1931
+ br label %join
1932
+
1933
+ else:
1934
+ %gep.b = getelementptr i8 , ptr %p.b , i64 %b
1935
+ %v.b = load i64 , ptr %gep.b
1936
+ br label %join
1937
+
1938
+ join:
1939
+ %v = phi i64 [ %v.a , %if ], [ %v.b , %else ]
1940
+ ret i64 %v
1941
+ }
1942
+
1943
+ define i64 @load_with_non_sunk_gep_right (i1 %cond , ptr %p.a , ptr %p.b , i64 %a ) {
1944
+ ; CHECK-LABEL: @load_with_non_sunk_gep_right(
1945
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[JOIN:%.*]]
1946
+ ; CHECK: if:
1947
+ ; CHECK-NEXT: call void @dummy()
1948
+ ; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr i8, ptr [[P_A:%.*]], i64 [[A:%.*]]
1949
+ ; CHECK-NEXT: br label [[JOIN]]
1950
+ ; CHECK: join:
1951
+ ; CHECK-NEXT: [[P_B_SINK:%.*]] = phi ptr [ [[GEP_A]], [[IF]] ], [ [[P_B:%.*]], [[TMP0:%.*]] ]
1952
+ ; CHECK-NEXT: [[V_B:%.*]] = load i64, ptr [[P_B_SINK]], align 8
1953
+ ; CHECK-NEXT: ret i64 [[V_B]]
1954
+ ;
1955
+ br i1 %cond , label %if , label %else
1956
+
1957
+ if:
1958
+ call void @dummy ()
1959
+ %gep.a = getelementptr i8 , ptr %p.a , i64 %a
1960
+ %v.a = load i64 , ptr %gep.a
1961
+ br label %join
1962
+
1963
+ else:
1964
+ %v.b = load i64 , ptr %p.b
1965
+ br label %join
1966
+
1967
+ join:
1968
+ %v = phi i64 [ %v.a , %if ], [ %v.b , %else ]
1969
+ ret i64 %v
1970
+ }
1971
+
1972
+ define void @store_with_non_sunk_gep (i1 %cond , ptr %p.a , ptr %p.b , i64 %a , i64 %b ) {
1973
+ ; CHECK-LABEL: @store_with_non_sunk_gep(
1974
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
1975
+ ; CHECK: if:
1976
+ ; CHECK-NEXT: call void @dummy()
1977
+ ; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr i8, ptr [[P_A:%.*]], i64 [[A:%.*]]
1978
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
1979
+ ; CHECK: else:
1980
+ ; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr i8, ptr [[P_B:%.*]], i64 [[B:%.*]]
1981
+ ; CHECK-NEXT: br label [[JOIN]]
1982
+ ; CHECK: join:
1983
+ ; CHECK-NEXT: [[GEP_B_SINK:%.*]] = phi ptr [ [[GEP_B]], [[ELSE]] ], [ [[GEP_A]], [[IF]] ]
1984
+ ; CHECK-NEXT: store i64 0, ptr [[GEP_B_SINK]], align 8
1985
+ ; CHECK-NEXT: ret void
1986
+ ;
1987
+ br i1 %cond , label %if , label %else
1988
+
1989
+ if:
1990
+ call void @dummy ()
1991
+ %gep.a = getelementptr i8 , ptr %p.a , i64 %a
1992
+ store i64 0 , ptr %gep.a
1993
+ br label %join
1994
+
1995
+ else:
1996
+ %gep.b = getelementptr i8 , ptr %p.b , i64 %b
1997
+ store i64 0 , ptr %gep.b
1998
+ br label %join
1999
+
2000
+ join:
2001
+ ret void
2002
+ }
2003
+
2004
+ define void @store_with_non_sunk_gep_as_value (i1 %cond , ptr %p , ptr %p.a , ptr %p.b , i64 %a , i64 %b ) {
2005
+ ; CHECK-LABEL: @store_with_non_sunk_gep_as_value(
2006
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2007
+ ; CHECK: if:
2008
+ ; CHECK-NEXT: call void @dummy()
2009
+ ; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr i8, ptr [[P_A:%.*]], i64 [[A:%.*]]
2010
+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2011
+ ; CHECK: else:
2012
+ ; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr i8, ptr [[P_B:%.*]], i64 [[B:%.*]]
2013
+ ; CHECK-NEXT: br label [[JOIN]]
2014
+ ; CHECK: join:
2015
+ ; CHECK-NEXT: [[GEP_B_SINK:%.*]] = phi ptr [ [[GEP_B]], [[ELSE]] ], [ [[GEP_A]], [[IF]] ]
2016
+ ; CHECK-NEXT: store ptr [[GEP_B_SINK]], ptr [[P:%.*]], align 8
2017
+ ; CHECK-NEXT: ret void
2018
+ ;
2019
+ br i1 %cond , label %if , label %else
2020
+
2021
+ if:
2022
+ call void @dummy ()
2023
+ %gep.a = getelementptr i8 , ptr %p.a , i64 %a
2024
+ store ptr %gep.a , ptr %p
2025
+ br label %join
2026
+
2027
+ else:
2028
+ %gep.b = getelementptr i8 , ptr %p.b , i64 %b
2029
+ store ptr %gep.b , ptr %p
2030
+ br label %join
2031
+
2032
+ join:
2033
+ ret void
2034
+ }
2035
+
1849
2036
declare void @dummy ()
1850
2037
declare void @use.ptr (ptr )
1851
2038
0 commit comments