Skip to content

Commit c03d3a8

Browse files
committed
[InstCombine] Add tests for canonicalizing (gep <not i8> p, (exact_ins X, C)); NFC
1 parent 80ffec7 commit c03d3a8

File tree

1 file changed

+124
-8
lines changed

1 file changed

+124
-8
lines changed

llvm/test/Transforms/InstCombine/getelementptr.ll

Lines changed: 124 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ target datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64-f16:32"
1414
@Global_as1 = external addrspace(1) global [10 x i8]
1515

1616
declare void @use(ptr)
17+
declare void @use.i64(i64)
1718

1819
; Test noop elimination
1920
define ptr @test1(ptr %I) {
@@ -592,8 +593,8 @@ define i32 @test21() {
592593
}
593594

594595

595-
@A = global i32 1 ; <ptr> [#uses=1]
596-
@B = global i32 2 ; <ptr> [#uses=1]
596+
@A = global i32 1 ; <ptr> [#uses=1]
597+
@B = global i32 2 ; <ptr> [#uses=1]
597598

598599
define i1 @test22() {
599600
; CHECK-LABEL: @test22(
@@ -612,8 +613,8 @@ define i1 @test23() {
612613
; CHECK-LABEL: @test23(
613614
; CHECK-NEXT: ret i1 false
614615
;
615-
%A = getelementptr %X, ptr null, i64 0, i32 0, i64 0 ; <ptr> [#uses=1]
616-
%B = icmp ne ptr %A, null ; <i1> [#uses=1]
616+
%A = getelementptr %X, ptr null, i64 0, i32 0, i64 0 ; <ptr> [#uses=1]
617+
%B = icmp ne ptr %A, null ; <i1> [#uses=1]
617618
ret i1 %B
618619
}
619620

@@ -1179,9 +1180,9 @@ define ptr @test45(ptr %c1, ptr %c2) {
11791180
;
11801181
%ptrtoint1 = ptrtoint ptr %c1 to i64
11811182
%ptrtoint2 = ptrtoint ptr %c2 to i64
1182-
%sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
1183+
%sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
11831184
%shr = sdiv i64 %sub, 7
1184-
%gep = getelementptr inbounds %struct.C, ptr %c1, i64 %shr ; C1 + (C2 - C1)
1185+
%gep = getelementptr inbounds %struct.C, ptr %c1, i64 %shr ; C1 + (C2 - C1)
11851186
ret ptr %gep
11861187
}
11871188

@@ -1370,8 +1371,8 @@ define ptr @D98588(ptr %c1, i64 %offset) {
13701371
%c2_next = getelementptr inbounds i64, ptr %c1, i64 %offset
13711372
%ptrtoint1 = ptrtoint ptr %c1 to i64
13721373
%ptrtoint2 = ptrtoint ptr %c2_next to i64
1373-
%sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
1374-
%gep = getelementptr inbounds i8, ptr %c1, i64 %sub ; C1 + (C2 - C1)
1374+
%sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1
1375+
%gep = getelementptr inbounds i8, ptr %c1, i64 %sub ; C1 + (C2 - C1)
13751376
ret ptr %gep
13761377
}
13771378

@@ -1790,4 +1791,119 @@ define ptr @gep_sel_const_nuw(i1 %c) {
17901791
ret ptr %gep
17911792
}
17921793

1794+
define ptr @gep_of_udiv(ptr %p, i64 %x) {
1795+
; CHECK-LABEL: @gep_of_udiv(
1796+
; CHECK-NEXT: [[IDX:%.*]] = udiv exact i64 [[X:%.*]], 12
1797+
; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
1798+
; CHECK-NEXT: ret ptr [[R]]
1799+
;
1800+
%idx = udiv exact i64 %x, 12
1801+
%r = getelementptr i32, ptr %p, i64 %idx
1802+
ret ptr %r
1803+
}
1804+
1805+
define ptr @gep_of_udiv_fail_not_divisible(ptr %p, i64 %x) {
1806+
; CHECK-LABEL: @gep_of_udiv_fail_not_divisible(
1807+
; CHECK-NEXT: [[IDX:%.*]] = udiv exact i64 [[X:%.*]], 13
1808+
; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
1809+
; CHECK-NEXT: ret ptr [[R]]
1810+
;
1811+
%idx = udiv exact i64 %x, 13
1812+
%r = getelementptr i32, ptr %p, i64 %idx
1813+
ret ptr %r
1814+
}
1815+
1816+
1817+
define ptr @gep_of_sdiv(ptr %p, i64 %x) {
1818+
; CHECK-LABEL: @gep_of_sdiv(
1819+
; CHECK-NEXT: [[IDX:%.*]] = sdiv exact i64 [[X:%.*]], -36
1820+
; CHECK-NEXT: [[R:%.*]] = getelementptr nusw nuw i32, ptr [[P:%.*]], i64 [[IDX]]
1821+
; CHECK-NEXT: ret ptr [[R]]
1822+
;
1823+
%idx = sdiv exact i64 %x, -36
1824+
%r = getelementptr nusw nuw i32, ptr %p, i64 %idx
1825+
ret ptr %r
1826+
}
1827+
1828+
1829+
define ptr @gep_of_sdiv_fail_not_divisible(ptr %p, i64 %x) {
1830+
; CHECK-LABEL: @gep_of_sdiv_fail_not_divisible(
1831+
; CHECK-NEXT: [[IDX:%.*]] = sdiv exact i64 [[X:%.*]], -35
1832+
; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
1833+
; CHECK-NEXT: ret ptr [[R]]
1834+
;
1835+
%idx = sdiv exact i64 %x, -35
1836+
%r = getelementptr i32, ptr %p, i64 %idx
1837+
ret ptr %r
1838+
}
1839+
1840+
define ptr @gep_of_sdiv_fail_ub(ptr %p, i64 %x) {
1841+
; CHECK-LABEL: @gep_of_sdiv_fail_ub(
1842+
; CHECK-NEXT: [[IDX:%.*]] = sdiv i64 [[X:%.*]], -4
1843+
; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
1844+
; CHECK-NEXT: ret ptr [[R]]
1845+
;
1846+
%idx = sdiv i64 %x, -4
1847+
%r = getelementptr i32, ptr %p, i64 %idx
1848+
ret ptr %r
1849+
}
1850+
1851+
define ptr @gep_of_lshr(ptr %p, i64 %x) {
1852+
; CHECK-LABEL: @gep_of_lshr(
1853+
; CHECK-NEXT: [[IDX:%.*]] = lshr exact i64 [[X:%.*]], 3
1854+
; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
1855+
; CHECK-NEXT: ret ptr [[R]]
1856+
;
1857+
%idx = lshr exact i64 %x, 3
1858+
%r = getelementptr i32, ptr %p, i64 %idx
1859+
ret ptr %r
1860+
}
1861+
1862+
define ptr @gep_of_ashr(ptr %p, i64 %x) {
1863+
; CHECK-LABEL: @gep_of_ashr(
1864+
; CHECK-NEXT: [[IDX:%.*]] = ashr exact i64 [[X:%.*]], 3
1865+
; CHECK-NEXT: [[R:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDX]]
1866+
; CHECK-NEXT: ret ptr [[R]]
1867+
;
1868+
%idx = ashr exact i64 %x, 3
1869+
%r = getelementptr inbounds i32, ptr %p, i64 %idx
1870+
ret ptr %r
1871+
}
1872+
1873+
define ptr @gep_of_ashr_fail_multiuse(ptr %p, i64 %x) {
1874+
; CHECK-LABEL: @gep_of_ashr_fail_multiuse(
1875+
; CHECK-NEXT: [[IDX:%.*]] = ashr exact i64 [[X:%.*]], 3
1876+
; CHECK-NEXT: call void @use.i64(i64 [[IDX]])
1877+
; CHECK-NEXT: [[R:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[IDX]]
1878+
; CHECK-NEXT: ret ptr [[R]]
1879+
;
1880+
%idx = ashr exact i64 %x, 3
1881+
call void @use.i64(i64 %idx)
1882+
%r = getelementptr inbounds i32, ptr %p, i64 %idx
1883+
ret ptr %r
1884+
}
1885+
1886+
define ptr @gep_of_lshr_fail_missing_exact(ptr %p, i64 %x) {
1887+
; CHECK-LABEL: @gep_of_lshr_fail_missing_exact(
1888+
; CHECK-NEXT: [[IDX:%.*]] = lshr i64 [[X:%.*]], 3
1889+
; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
1890+
; CHECK-NEXT: ret ptr [[R]]
1891+
;
1892+
%idx = lshr i64 %x, 3
1893+
%r = getelementptr i32, ptr %p, i64 %idx
1894+
ret ptr %r
1895+
}
1896+
1897+
define ptr @gep_of_ashr_fail_not_divisible(ptr %p, i64 %x) {
1898+
; CHECK-LABEL: @gep_of_ashr_fail_not_divisible(
1899+
; CHECK-NEXT: [[IDX:%.*]] = ashr exact i64 [[X:%.*]], 1
1900+
; CHECK-NEXT: [[R:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[IDX]]
1901+
; CHECK-NEXT: ret ptr [[R]]
1902+
;
1903+
%idx = ashr exact i64 %x, 1
1904+
%r = getelementptr i32, ptr %p, i64 %idx
1905+
ret ptr %r
1906+
}
1907+
1908+
17931909
!0 = !{!"branch_weights", i32 2, i32 10}

0 commit comments

Comments
 (0)