@@ -117,3 +117,110 @@ if.end:
117
117
%size = call i64 @llvm.objectsize.i64.p0 (ptr %p , i1 true , i1 true , i1 false )
118
118
ret i64 %size
119
119
}
120
+
121
+ define i64 @pick_negative_offset (i32 %n ) {
122
+ ; CHECK-LABEL: @pick_negative_offset(
123
+ ; CHECK-NEXT: entry:
124
+ ; CHECK-NEXT: [[BUFFER0:%.*]] = alloca i8, i64 20, align 1
125
+ ; CHECK-NEXT: [[OFFSETED0:%.*]] = getelementptr i8, ptr [[BUFFER0]], i64 20
126
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
127
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
128
+ ; CHECK: if.else:
129
+ ; CHECK-NEXT: [[BUFFER1:%.*]] = alloca i8, i64 20, align 1
130
+ ; CHECK-NEXT: [[OFFSETED1:%.*]] = getelementptr i8, ptr [[BUFFER1]], i64 20
131
+ ; CHECK-NEXT: br label [[IF_END]]
132
+ ; CHECK: if.end:
133
+ ; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[OFFSETED1]], [[IF_ELSE]] ], [ [[OFFSETED0]], [[ENTRY:%.*]] ]
134
+ ; CHECK-NEXT: [[POFFSETED:%.*]] = getelementptr i8, ptr [[P]], i64 -4
135
+ ; CHECK-NEXT: ret i64 4
136
+ ;
137
+ entry:
138
+ %buffer0 = alloca i8 , i64 20
139
+ %offseted0 = getelementptr i8 , ptr %buffer0 , i64 20
140
+ %cond = icmp eq i32 %n , 0
141
+ br i1 %cond , label %if.else , label %if.end
142
+
143
+ if.else:
144
+ %buffer1 = alloca i8 , i64 20
145
+ %offseted1 = getelementptr i8 , ptr %buffer1 , i64 20
146
+ br label %if.end
147
+
148
+ if.end:
149
+ %p = phi ptr [ %offseted1 , %if.else ], [ %offseted0 , %entry ]
150
+ %poffseted = getelementptr i8 , ptr %p , i64 -4
151
+ %size = call i64 @llvm.objectsize.i64.p0 (ptr %poffseted , i1 false , i1 false , i1 false )
152
+ ret i64 %size
153
+ }
154
+
155
+ define i64 @pick_negative_offset_with_nullptr (i32 %n ) {
156
+ ; CHECK-LABEL: @pick_negative_offset_with_nullptr(
157
+ ; CHECK-NEXT: entry:
158
+ ; CHECK-NEXT: [[BUFFER0:%.*]] = alloca i8, i64 20, align 1
159
+ ; CHECK-NEXT: [[OFFSETED0:%.*]] = getelementptr i8, ptr [[BUFFER0]], i64 20
160
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
161
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
162
+ ; CHECK: if.else:
163
+ ; CHECK-NEXT: br label [[IF_END]]
164
+ ; CHECK: if.end:
165
+ ; CHECK-NEXT: [[P0:%.*]] = phi ptr [ [[OFFSETED0]], [[ENTRY:%.*]] ], [ null, [[IF_ELSE]] ]
166
+ ; CHECK-NEXT: [[P1:%.*]] = phi ptr [ null, [[IF_ELSE]] ], [ [[OFFSETED0]], [[ENTRY]] ]
167
+ ; CHECK-NEXT: [[P0OFFSETED:%.*]] = getelementptr i8, ptr [[P0]], i64 -4
168
+ ; CHECK-NEXT: [[P1OFFSETED:%.*]] = getelementptr i8, ptr [[P1]], i64 -4
169
+ ; CHECK-NEXT: [[SIZE:%.*]] = select i1 [[COND]], i64 0, i64 4
170
+ ; CHECK-NEXT: ret i64 [[SIZE]]
171
+ ;
172
+ entry:
173
+ %buffer0 = alloca i8 , i64 20
174
+ %offseted0 = getelementptr i8 , ptr %buffer0 , i64 20
175
+ %cond = icmp eq i32 %n , 0
176
+ br i1 %cond , label %if.else , label %if.end
177
+
178
+ if.else:
179
+ br label %if.end
180
+
181
+ if.end:
182
+ %p0 = phi ptr [ %offseted0 , %entry ], [ null , %if.else ]
183
+ %p1 = phi ptr [ null , %if.else ], [ %offseted0 , %entry ]
184
+ %p0offseted = getelementptr i8 , ptr %p0 , i64 -4
185
+ %p1offseted = getelementptr i8 , ptr %p1 , i64 -4
186
+ %size0 = call i64 @llvm.objectsize.i64.p0 (ptr %p0offseted , i1 false , i1 false , i1 false )
187
+ %size1 = call i64 @llvm.objectsize.i64.p0 (ptr %p1offseted , i1 false , i1 false , i1 false )
188
+ %size = select i1 %cond , i64 %size0 , i64 %size1
189
+ ret i64 %size
190
+ }
191
+
192
+ define i64 @pick_negative_offset_with_unsized_nullptr (i32 %n ) {
193
+ ; CHECK-LABEL: @pick_negative_offset_with_unsized_nullptr(
194
+ ; CHECK-NEXT: entry:
195
+ ; CHECK-NEXT: [[BUFFER0:%.*]] = alloca i8, i64 20, align 1
196
+ ; CHECK-NEXT: [[OFFSETED0:%.*]] = getelementptr i8, ptr [[BUFFER0]], i64 20
197
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[N:%.*]], 0
198
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_ELSE:%.*]], label [[IF_END:%.*]]
199
+ ; CHECK: if.else:
200
+ ; CHECK-NEXT: br label [[IF_END]]
201
+ ; CHECK: if.end:
202
+ ; CHECK-NEXT: [[P0:%.*]] = phi ptr [ [[OFFSETED0]], [[ENTRY:%.*]] ], [ null, [[IF_ELSE]] ]
203
+ ; CHECK-NEXT: [[P1:%.*]] = phi ptr [ null, [[IF_ELSE]] ], [ [[OFFSETED0]], [[ENTRY]] ]
204
+ ; CHECK-NEXT: [[P0OFFSETED:%.*]] = getelementptr i8, ptr [[P0]], i64 -4
205
+ ; CHECK-NEXT: [[P1OFFSETED:%.*]] = getelementptr i8, ptr [[P1]], i64 -4
206
+ ; CHECK-NEXT: ret i64 -1
207
+ ;
208
+ entry:
209
+ %buffer0 = alloca i8 , i64 20
210
+ %offseted0 = getelementptr i8 , ptr %buffer0 , i64 20
211
+ %cond = icmp eq i32 %n , 0
212
+ br i1 %cond , label %if.else , label %if.end
213
+
214
+ if.else:
215
+ br label %if.end
216
+
217
+ if.end:
218
+ %p0 = phi ptr [ %offseted0 , %entry ], [ null , %if.else ]
219
+ %p1 = phi ptr [ null , %if.else ], [ %offseted0 , %entry ]
220
+ %p0offseted = getelementptr i8 , ptr %p0 , i64 -4
221
+ %p1offseted = getelementptr i8 , ptr %p1 , i64 -4
222
+ %size0 = call i64 @llvm.objectsize.i64.p0 (ptr %p0offseted , i1 false , i1 true , i1 false )
223
+ %size1 = call i64 @llvm.objectsize.i64.p0 (ptr %p1offseted , i1 false , i1 true , i1 false )
224
+ %size = select i1 %cond , i64 %size0 , i64 %size1
225
+ ret i64 %size
226
+ }
0 commit comments