@@ -32,10 +32,8 @@ define i32 @g(i32 %x) {
32
32
33
33
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp (ptr %src , ptr %p2 ) {
34
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]]
35
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[SRC:%.*]], i64 10
36
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2]], [[P:%.*]]
39
37
; CHECK-NEXT: ret i1 [[C]]
40
38
;
41
39
%i = ptrtoint ptr %src to i64
@@ -47,10 +45,8 @@ define i1 @inttoptr_add_ptrtoint_used_by_single_icmp(ptr %src, ptr %p2) {
47
45
48
46
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_operands_swapped (ptr %src , ptr %p2 ) {
49
47
; 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]]
48
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[SRC:%.*]], i64 10
49
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2]], [[P:%.*]]
54
50
; CHECK-NEXT: ret i1 [[C]]
55
51
;
56
52
%i = ptrtoint ptr %src to i64
@@ -62,10 +58,8 @@ define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_operands_swapped(ptr %src,
62
58
63
59
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset (ptr %src , i64 %off , ptr %p2 ) {
64
60
; 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]]
61
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[SRC:%.*]], i64 [[OFF:%.*]]
62
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2]], [[P:%.*]]
69
63
; CHECK-NEXT: ret i1 [[C]]
70
64
;
71
65
%i = ptrtoint ptr %src to i64
@@ -77,10 +71,8 @@ define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset(ptr %src, i
77
71
78
72
define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_constant_offset_operands_swapped (ptr %src , i64 %off , ptr %p2 ) {
79
73
; 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]]
74
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[SRC:%.*]], i64 [[OFF:%.*]]
75
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2]], [[P:%.*]]
84
76
; CHECK-NEXT: ret i1 [[C]]
85
77
;
86
78
%i = ptrtoint ptr %src to i64
@@ -137,6 +129,23 @@ define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_int_type_does_not_match_ptr
137
129
ret i1 %c
138
130
}
139
131
132
+ define i1 @inttoptr_add_multiple_users_ptrtoint_used_by_single_icmp (ptr %src , ptr %p2 ) {
133
+ ; CHECK-LABEL: @inttoptr_add_multiple_users_ptrtoint_used_by_single_icmp(
134
+ ; CHECK-NEXT: [[I:%.*]] = ptrtoint ptr [[SRC:%.*]] to i64
135
+ ; CHECK-NEXT: [[A:%.*]] = add i64 [[I]], 10
136
+ ; CHECK-NEXT: [[P:%.*]] = inttoptr i64 [[A]] to ptr
137
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2:%.*]], [[P]]
138
+ ; CHECK-NEXT: call void @bar(i64 [[A]])
139
+ ; CHECK-NEXT: ret i1 [[C]]
140
+ ;
141
+ %i = ptrtoint ptr %src to i64
142
+ %a = add i64 %i , 10
143
+ %p = inttoptr i64 %a to ptr
144
+ %c = icmp eq ptr %p , %p2
145
+ call void @bar (i64 %a )
146
+ ret i1 %c
147
+ }
148
+
140
149
define i1 @multiple_inttoptr_add_ptrtoint_used_by_single_icmp (ptr %src ) {
141
150
; CHECK-LABEL: @multiple_inttoptr_add_ptrtoint_used_by_single_icmp(
142
151
; CHECK-NEXT: ret i1 false
@@ -181,10 +190,8 @@ define i1 @inttoptr_add_ptrtoint_used_by_single_icmp_in_different_bb(i1 %bc, ptr
181
190
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_single_icmp_in_different_bb(
182
191
; CHECK-NEXT: br i1 [[BC:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
183
192
; 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]]
193
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[SRC:%.*]], i64 10
194
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[P2]], [[P:%.*]]
188
195
; CHECK-NEXT: ret i1 [[C]]
189
196
; CHECK: else:
190
197
; CHECK-NEXT: ret i1 false
@@ -204,11 +211,9 @@ else:
204
211
205
212
define i1 @inttoptr_add_ptrtoint_used_by_multiple_icmps (ptr %src , ptr %p2 , ptr %p3 ) {
206
213
; 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]]
214
+ ; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[SRC:%.*]], i64 10
215
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp eq ptr [[P2]], [[P:%.*]]
216
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[P2]], [[P3:%.*]]
212
217
; CHECK-NEXT: [[XOR:%.*]] = xor i1 [[C_1]], [[C_2]]
213
218
; CHECK-NEXT: ret i1 [[XOR]]
214
219
;
@@ -222,6 +227,7 @@ define i1 @inttoptr_add_ptrtoint_used_by_multiple_icmps(ptr %src, ptr %p2, ptr %
222
227
}
223
228
224
229
declare void @foo (ptr )
230
+ declare void @bar (i64 )
225
231
226
232
define i1 @inttoptr_add_ptrtoint_used_by_multiple_icmps_and_other_user (ptr %src , ptr %p2 , ptr %p3 ) {
227
233
; CHECK-LABEL: @inttoptr_add_ptrtoint_used_by_multiple_icmps_and_other_user(
0 commit comments