Skip to content

Commit 999bab7

Browse files
committed
[SimplifyCFG] Add tests for sinking of load/store + gep (NFC)
1 parent c31ac81 commit 999bab7

File tree

1 file changed

+187
-0
lines changed

1 file changed

+187
-0
lines changed

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

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,6 +1846,193 @@ join:
18461846
ret i64 %phi1
18471847
}
18481848

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+
18492036
declare void @dummy()
18502037
declare void @use.ptr(ptr)
18512038

0 commit comments

Comments
 (0)