@@ -14,6 +14,7 @@ target datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64-f16:32"
14
14
@Global_as1 = external addrspace (1 ) global [10 x i8 ]
15
15
16
16
declare void @use (ptr )
17
+ declare void @use.i64 (i64 )
17
18
18
19
; Test noop elimination
19
20
define ptr @test1 (ptr %I ) {
@@ -592,8 +593,8 @@ define i32 @test21() {
592
593
}
593
594
594
595
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]
597
598
598
599
define i1 @test22 () {
599
600
; CHECK-LABEL: @test22(
@@ -612,8 +613,8 @@ define i1 @test23() {
612
613
; CHECK-LABEL: @test23(
613
614
; CHECK-NEXT: ret i1 false
614
615
;
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]
617
618
ret i1 %B
618
619
}
619
620
@@ -1179,9 +1180,9 @@ define ptr @test45(ptr %c1, ptr %c2) {
1179
1180
;
1180
1181
%ptrtoint1 = ptrtoint ptr %c1 to i64
1181
1182
%ptrtoint2 = ptrtoint ptr %c2 to i64
1182
- %sub = sub i64 %ptrtoint2 , %ptrtoint1 ; C2 - C1
1183
+ %sub = sub i64 %ptrtoint2 , %ptrtoint1 ; C2 - C1
1183
1184
%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)
1185
1186
ret ptr %gep
1186
1187
}
1187
1188
@@ -1370,8 +1371,8 @@ define ptr @D98588(ptr %c1, i64 %offset) {
1370
1371
%c2_next = getelementptr inbounds i64 , ptr %c1 , i64 %offset
1371
1372
%ptrtoint1 = ptrtoint ptr %c1 to i64
1372
1373
%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)
1375
1376
ret ptr %gep
1376
1377
}
1377
1378
@@ -1790,4 +1791,119 @@ define ptr @gep_sel_const_nuw(i1 %c) {
1790
1791
ret ptr %gep
1791
1792
}
1792
1793
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
+
1793
1909
!0 = !{!"branch_weights" , i32 2 , i32 10 }
0 commit comments