Skip to content

Commit 25871b3

Browse files
committed
[InstSimplify] Add tests for ptrtoint of gep fold (NFC)
1 parent 9e261c5 commit 25871b3

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=instsimplify < %s | FileCheck %s
3+
4+
define i64 @ptrtoint_gep_sub(ptr %ptr, i64 %end.addr) {
5+
; CHECK-LABEL: define i64 @ptrtoint_gep_sub(
6+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[END_ADDR:%.*]]) {
7+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i64
8+
; CHECK-NEXT: [[SIZE:%.*]] = sub i64 [[END_ADDR]], [[PTR_ADDR]]
9+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[SIZE]]
10+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i64
11+
; CHECK-NEXT: ret i64 [[END_ADDR2]]
12+
;
13+
%ptr.addr = ptrtoint ptr %ptr to i64
14+
%size = sub i64 %end.addr, %ptr.addr
15+
%end = getelementptr i8, ptr %ptr, i64 %size
16+
%end.addr2 = ptrtoint ptr %end to i64
17+
ret i64 %end.addr2
18+
}
19+
20+
define <2 x i64> @ptrtoint_gep_sub_vector(<2 x ptr> %ptr, <2 x i64> %end.addr) {
21+
; CHECK-LABEL: define <2 x i64> @ptrtoint_gep_sub_vector(
22+
; CHECK-SAME: <2 x ptr> [[PTR:%.*]], <2 x i64> [[END_ADDR:%.*]]) {
23+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint <2 x ptr> [[PTR]] to <2 x i64>
24+
; CHECK-NEXT: [[SIZE:%.*]] = sub <2 x i64> [[END_ADDR]], [[PTR_ADDR]]
25+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, <2 x ptr> [[PTR]], <2 x i64> [[SIZE]]
26+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint <2 x ptr> [[END]] to <2 x i64>
27+
; CHECK-NEXT: ret <2 x i64> [[END_ADDR2]]
28+
;
29+
%ptr.addr = ptrtoint <2 x ptr> %ptr to <2 x i64>
30+
%size = sub <2 x i64> %end.addr, %ptr.addr
31+
%end = getelementptr i8, <2 x ptr> %ptr, <2 x i64> %size
32+
%end.addr2 = ptrtoint <2 x ptr> %end to <2 x i64>
33+
ret <2 x i64> %end.addr2
34+
}
35+
36+
define i64 @ptrtoint_gep_sub_wrong_gep_type(ptr %ptr, i64 %end.addr) {
37+
; CHECK-LABEL: define i64 @ptrtoint_gep_sub_wrong_gep_type(
38+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[END_ADDR:%.*]]) {
39+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i64
40+
; CHECK-NEXT: [[SIZE:%.*]] = sub i64 [[END_ADDR]], [[PTR_ADDR]]
41+
; CHECK-NEXT: [[END:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[SIZE]]
42+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i64
43+
; CHECK-NEXT: ret i64 [[END_ADDR2]]
44+
;
45+
%ptr.addr = ptrtoint ptr %ptr to i64
46+
%size = sub i64 %end.addr, %ptr.addr
47+
%end = getelementptr i32, ptr %ptr, i64 %size
48+
%end.addr2 = ptrtoint ptr %end to i64
49+
ret i64 %end.addr2
50+
}
51+
52+
define i64 @ptrtoint_gep_sub_wrong_ptrtoint_op(ptr %ptr, i64 %end.addr, ptr %ptr2) {
53+
; CHECK-LABEL: define i64 @ptrtoint_gep_sub_wrong_ptrtoint_op(
54+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[END_ADDR:%.*]], ptr [[PTR2:%.*]]) {
55+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR2]] to i64
56+
; CHECK-NEXT: [[SIZE:%.*]] = sub i64 [[END_ADDR]], [[PTR_ADDR]]
57+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[SIZE]]
58+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i64
59+
; CHECK-NEXT: ret i64 [[END_ADDR2]]
60+
;
61+
%ptr.addr = ptrtoint ptr %ptr2 to i64
62+
%size = sub i64 %end.addr, %ptr.addr
63+
%end = getelementptr i8, ptr %ptr, i64 %size
64+
%end.addr2 = ptrtoint ptr %end to i64
65+
ret i64 %end.addr2
66+
}
67+
68+
define i64 @ptrtoint_gep_sub_wrong_operation(ptr %ptr, i64 %end.addr) {
69+
; CHECK-LABEL: define i64 @ptrtoint_gep_sub_wrong_operation(
70+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[END_ADDR:%.*]]) {
71+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i64
72+
; CHECK-NEXT: [[SIZE:%.*]] = add i64 [[END_ADDR]], [[PTR_ADDR]]
73+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[SIZE]]
74+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i64
75+
; CHECK-NEXT: ret i64 [[END_ADDR2]]
76+
;
77+
%ptr.addr = ptrtoint ptr %ptr to i64
78+
%size = add i64 %end.addr, %ptr.addr
79+
%end = getelementptr i8, ptr %ptr, i64 %size
80+
%end.addr2 = ptrtoint ptr %end to i64
81+
ret i64 %end.addr2
82+
}
83+
84+
define i64 @ptrtoint_gep_sub_wrong_operand_order(ptr %ptr, i64 %end.addr) {
85+
; CHECK-LABEL: define i64 @ptrtoint_gep_sub_wrong_operand_order(
86+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[END_ADDR:%.*]]) {
87+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i64
88+
; CHECK-NEXT: [[SIZE:%.*]] = sub i64 [[PTR_ADDR]], [[END_ADDR]]
89+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[SIZE]]
90+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i64
91+
; CHECK-NEXT: ret i64 [[END_ADDR2]]
92+
;
93+
%ptr.addr = ptrtoint ptr %ptr to i64
94+
%size = sub i64 %ptr.addr, %end.addr
95+
%end = getelementptr i8, ptr %ptr, i64 %size
96+
%end.addr2 = ptrtoint ptr %end to i64
97+
ret i64 %end.addr2
98+
}
99+
100+
define i32 @ptrtoint_gep_sub_wrong_type(ptr %ptr, i64 %end.addr) {
101+
; CHECK-LABEL: define i32 @ptrtoint_gep_sub_wrong_type(
102+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[END_ADDR:%.*]]) {
103+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i64
104+
; CHECK-NEXT: [[SIZE:%.*]] = sub i64 [[END_ADDR]], [[PTR_ADDR]]
105+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[SIZE]]
106+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i32
107+
; CHECK-NEXT: ret i32 [[END_ADDR2]]
108+
;
109+
%ptr.addr = ptrtoint ptr %ptr to i64
110+
%size = sub i64 %end.addr, %ptr.addr
111+
%end = getelementptr i8, ptr %ptr, i64 %size
112+
%end.addr2 = ptrtoint ptr %end to i32
113+
ret i32 %end.addr2
114+
}
115+
116+
define i32 @ptrtoint_gep_sub_narrow_type(ptr %ptr, i32 %end.addr) {
117+
; CHECK-LABEL: define i32 @ptrtoint_gep_sub_narrow_type(
118+
; CHECK-SAME: ptr [[PTR:%.*]], i32 [[END_ADDR:%.*]]) {
119+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i32
120+
; CHECK-NEXT: [[SIZE:%.*]] = sub i32 [[END_ADDR]], [[PTR_ADDR]]
121+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i32 [[SIZE]]
122+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i32
123+
; CHECK-NEXT: ret i32 [[END_ADDR2]]
124+
;
125+
%ptr.addr = ptrtoint ptr %ptr to i32
126+
%size = sub i32 %end.addr, %ptr.addr
127+
%end = getelementptr i8, ptr %ptr, i32 %size
128+
%end.addr2 = ptrtoint ptr %end to i32
129+
ret i32 %end.addr2
130+
}
131+
132+
define i128 @ptrtoint_gep_sub_wide_type(ptr %ptr, i128 %end.addr) {
133+
; CHECK-LABEL: define i128 @ptrtoint_gep_sub_wide_type(
134+
; CHECK-SAME: ptr [[PTR:%.*]], i128 [[END_ADDR:%.*]]) {
135+
; CHECK-NEXT: [[PTR_ADDR:%.*]] = ptrtoint ptr [[PTR]] to i128
136+
; CHECK-NEXT: [[SIZE:%.*]] = sub i128 [[END_ADDR]], [[PTR_ADDR]]
137+
; CHECK-NEXT: [[END:%.*]] = getelementptr i8, ptr [[PTR]], i128 [[SIZE]]
138+
; CHECK-NEXT: [[END_ADDR2:%.*]] = ptrtoint ptr [[END]] to i128
139+
; CHECK-NEXT: ret i128 [[END_ADDR2]]
140+
;
141+
%ptr.addr = ptrtoint ptr %ptr to i128
142+
%size = sub i128 %end.addr, %ptr.addr
143+
%end = getelementptr i8, ptr %ptr, i128 %size
144+
%end.addr2 = ptrtoint ptr %end to i128
145+
ret i128 %end.addr2
146+
}

0 commit comments

Comments
 (0)