Skip to content

Commit cfef05e

Browse files
committed
[InstCombine] Add tests for (inttoptr (add (ptrtoint %Base), %Offset)).
Precommit tests for #153421.
1 parent dbadab9 commit cfef05e

File tree

1 file changed

+215
-1
lines changed

1 file changed

+215
-1
lines changed

llvm/test/Transforms/InstCombine/fold-bin-operand.ll

Lines changed: 215 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3-
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
3+
target datalayout = "E-p:64:64:64-p1:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
44

55
define i1 @f(i1 %x) {
66
; CHECK-LABEL: @f(
@@ -30,6 +30,220 @@ define i32 @g(i32 %x) {
3030
ret i32 %b
3131
}
3232

33+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp(ptr %src, ptr %p2) {
34+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp(
35+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
36+
; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
37+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
38+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
39+
; CHECK-NEXT: ret i1 [[C]]
40+
;
41+
%i = ptrtoint ptr %src to i64
42+
%a = add i64 %i, 10
43+
%p = inttoptr i64 %a to ptr
44+
%c = icmp eq ptr %p, %p2
45+
ret i1 %c
46+
}
47+
48+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_operands_swapped(ptr %src, ptr %p2) {
49+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_operands_swapped(
50+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
51+
; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
52+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
53+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
54+
; CHECK-NEXT: ret i1 [[C]]
55+
;
56+
%i = ptrtoint ptr %src to i64
57+
%a = add i64 10, %i
58+
%p = inttoptr i64 %a to ptr
59+
%c = icmp eq ptr %p, %p2
60+
ret i1 %c
61+
}
62+
63+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset(ptr %src, i64 %off, ptr %p2) {
64+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset(
65+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
66+
; CHECK-NEXT: [[A:%.*]] = add i64 [[OFF:%.*]], [[I]]
67+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
68+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
69+
; CHECK-NEXT: ret i1 [[C]]
70+
;
71+
%i = ptrtoint ptr %src to i64
72+
%a = add i64 %i, %off
73+
%p = inttoptr i64 %a to ptr
74+
%c = icmp eq ptr %p, %p2
75+
ret i1 %c
76+
}
77+
78+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset_operands_swapped(ptr %src, i64 %off, ptr %p2) {
79+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset_operands_swapped(
80+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
81+
; CHECK-NEXT: [[A:%.*]] = add i64 [[OFF:%.*]], [[I]]
82+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
83+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
84+
; CHECK-NEXT: ret i1 [[C]]
85+
;
86+
%i = ptrtoint ptr %src to i64
87+
%a = add i64 %off, %i
88+
%p = inttoptr i64 %a to ptr
89+
%c = icmp eq ptr %p, %p2
90+
ret i1 %c
91+
}
92+
93+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_different_src_address_spaces(ptr addrspace(1) %src, ptr %p2) {
94+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_different_src_address_spaces(
95+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr addrspace(1) [[SRC:%.*]] to i64
96+
; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
97+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
98+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
99+
; CHECK-NEXT: ret i1 [[C]]
100+
;
101+
%i = ptrtoint ptr addrspace(1) %src to i64
102+
%a = add i64 %i, 10
103+
%p = inttoptr i64 %a to ptr
104+
%c = icmp eq ptr %p, %p2
105+
ret i1 %c
106+
}
107+
108+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_different_dst_address_spaces(ptr %src, ptr addrspace(1) %p2) {
109+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_different_dst_address_spaces(
110+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
111+
; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
112+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr addrspace(1)
113+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr addrspace(1) [[P2:%.*]], [[P]]
114+
; CHECK-NEXT: ret i1 [[C]]
115+
;
116+
%i = ptrtoint ptr %src to i64
117+
%a = add i64 %i, 10
118+
%p = inttoptr i64 %a to ptr addrspace(1)
119+
%c = icmp eq ptr addrspace(1) %p, %p2
120+
ret i1 %c
121+
}
122+
123+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_int_type_does_not_match_ptr_ty(ptr %src, ptr %p2) {
124+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_int_type_does_not_match_ptr_ty(
125+
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
126+
; CHECK-NEXT: [[I:%.*]] = trunc i64 [[TMP1]] to i8
127+
; CHECK-NEXT: [[A:%.*]] = add i8 [[I]], 10
128+
; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[A]] to i64
129+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[TMP2]] to ptr
130+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
131+
; CHECK-NEXT: ret i1 [[C]]
132+
;
133+
%i = ptrtoint ptr %src to i8
134+
%a = add i8 %i, 10
135+
%p = inttoptr i8 %a to ptr
136+
%c = icmp eq ptr %p, %p2
137+
ret i1 %c
138+
}
139+
140+
define i1 @multiple_inttoptr_add_ptrtoint_used_by_single_icmp(ptr %src) {
141+
; CHECK-LABEL: @multiple_inttoptr_add_ptrtoint_used_by_single_icmp(
142+
; CHECK-NEXT: ret i1 false
143+
;
144+
%i = ptrtoint ptr %src to i64
145+
%a = add i64 %i, 10
146+
%p = inttoptr i64 %a to ptr
147+
%a.2 = add i64 %i, 11
148+
%p.2 = inttoptr i64 %a.2 to ptr
149+
%c = icmp eq ptr %p, %p.2
150+
ret i1 %c
151+
}
152+
153+
define i1 @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_non_constant_offset(ptr %src, i64 %off.1) {
154+
; CHECK-LABEL: @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_non_constant_offset(
155+
; CHECK-NEXT: ret i1 false
156+
;
157+
%i = ptrtoint ptr %src to i64
158+
%a = add i64 %i, 10
159+
%p = inttoptr i64 %a to ptr
160+
%a.2 = add i64 %i, 11
161+
%p.2 = inttoptr i64 %a.2 to ptr
162+
%c = icmp eq ptr %p, %p.2
163+
ret i1 %c
164+
}
165+
166+
define i1 @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_multiple_non_constant_offset(ptr %src, i64 %off.1, i64 %off.2) {
167+
; CHECK-LABEL: @multiple_inttoptr_add_ptrtoint_used_by_single_icmp_multiple_non_constant_offset(
168+
; CHECK-NEXT: [[C:%.*]] = icmp eq i64 [[OFF_1:%.*]], [[OFF_2:%.*]]
169+
; CHECK-NEXT: ret i1 [[C]]
170+
;
171+
%i = ptrtoint ptr %src to i64
172+
%a = add i64 %i, %off.1
173+
%p = inttoptr i64 %a to ptr
174+
%a.2 = add i64 %i, %off.2
175+
%p.2 = inttoptr i64 %a.2 to ptr
176+
%c = icmp eq ptr %p, %p.2
177+
ret i1 %c
178+
}
179+
180+
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_in_different_bb(i1 %bc, ptr %src, ptr %p2) {
181+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_in_different_bb(
182+
; CHECK-NEXT: br i1 [[BC:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
183+
; CHECK: then:
184+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
185+
; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
186+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
187+
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
188+
; CHECK-NEXT: ret i1 [[C]]
189+
; CHECK: else:
190+
; CHECK-NEXT: ret i1 false
191+
;
192+
%i = ptrtoint ptr %src to i64
193+
%a = add i64 %i, 10
194+
%p = inttoptr i64 %a to ptr
195+
br i1 %bc, label %then, label %else
196+
197+
then:
198+
%c = icmp eq ptr %p, %p2
199+
ret i1 %c
200+
201+
else:
202+
ret i1 false
203+
}
204+
205+
define i1 @inttoptr_add_ptrtoint_used_by_multiple_icmps(ptr %src, ptr %p2, ptr %p3) {
206+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_multiple_icmps(
207+
; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
208+
; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
209+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
210+
; CHECK-NEXT: [[C_1:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
211+
; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[P3:%.*]], [[P]]
212+
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[C_1]], [[C_2]]
213+
; CHECK-NEXT: ret i1 [[XOR]]
214+
;
215+
%i = ptrtoint ptr %src to i64
216+
%a = add i64 %i, 10
217+
%p = inttoptr i64 %a to ptr
218+
%c.1 = icmp eq ptr %p, %p2
219+
%c.2 = icmp eq ptr %p, %p3
220+
%xor = xor i1 %c.1, %c.2
221+
ret i1 %xor
222+
}
223+
224+
declare void @foo(ptr)
225+
226+
define i1 @inttoptr_add_ptrtoint_used_by_multiple_icmps_and_other_user(ptr %src, ptr %p2, ptr %p3) {
227+
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_multiple_icmps_and_other_user(
228+
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
229+
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], 10
230+
; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[TMP2]] to ptr
231+
; CHECK-NEXT: [[C_1:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
232+
; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[P3:%.*]], [[P]]
233+
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[C_1]], [[C_2]]
234+
; CHECK-NEXT: call void @foo(ptr [[P]])
235+
; CHECK-NEXT: ret i1 [[XOR]]
236+
;
237+
%i = ptrtoint ptr %src to i64
238+
%a = add i64 %i, 10
239+
%p = inttoptr i64 %a to ptr
240+
%c.1 = icmp eq ptr %p, %p2
241+
%c.2 = icmp eq ptr %p, %p3
242+
%xor = xor i1 %c.1, %c.2
243+
call void @foo(ptr %p)
244+
ret i1 %xor
245+
}
246+
33247
define i32 @h(i1 %A, i32 %B) {
34248
; CHECK-LABEL: @h(
35249
; CHECK-NEXT: EntryBlock:

0 commit comments

Comments
 (0)