@@ -181,9 +181,9 @@ attributes #8 = { builtin nounwind }
181
181
; CHECK-NEXT: %[[nodevar:.+]] = phi %class.node* [ %"'ipc.i", %for.body.i ], [ null, %entry ]
182
182
; CHECK-NEXT: %list.09.i = phi %class.node* [ %[[bcnode:.+]], %for.body.i ], [ null, %entry ]
183
183
; CHECK-NEXT: %[[ivnext]] = add nuw nsw i64 %[[iv]], 1
184
- ; CHECK-NEXT: %call.i = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @_Znwm(i64 16) #10
185
- ; CHECK-NEXT: %"call'mi.i" = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @_Znwm(i64 16) #10
186
- ; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* nonnull {{(align 1 )?}}dereferenceable(16) dereferenceable_or_null(16) %"call'mi.i", i8 0, i64 16, {{(i32 1, )?}}i1 false) #5
184
+ ; CHECK-NEXT: %call.i = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @_Znwm(i64 16)
185
+ ; CHECK-NEXT: %"call'mi.i" = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @_Znwm(i64 16)
186
+ ; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* nonnull {{(align 1 )?}}dereferenceable(16) dereferenceable_or_null(16) %"call'mi.i", i8 0, i64 16, {{(i32 1, )?}}i1 false)
187
187
; CHECK-NEXT: %"'ipc.i" = bitcast i8* %"call'mi.i" to %class.node*
188
188
; CHECK-NEXT: %[[bcnode]] = bitcast i8* %call.i to %class.node*
189
189
; CHECK-NEXT: %value.i.i = bitcast i8* %call.i to double*
@@ -241,13 +241,30 @@ attributes #8 = { builtin nounwind }
241
241
; CHECK-NEXT: br i1 %[[cmp]], label %invertentry, label %for.body
242
242
243
243
; CHECK: for.body:
244
- ; CHECK-NEXT: %[[rawcache:.+]] = phi i8* [ %[[realloccache:.+]], %for.body ], [ null, %entry ]
245
- ; CHECK-NEXT: %[[preidx:.+]] = phi i64 [ %[[postidx:.+]], %for.body ], [ 0, %entry ]
246
- ; CHECK-NEXT: %[[cur:.+]] = phi %class.node* [ %"'ipl", %for.body ], [ %"node'", %entry ]
247
- ; CHECK-NEXT: %val.08 = phi %class.node* [ %[[loadst:.+]], %for.body ], [ %node, %entry ]
244
+ ; CHECK-NEXT: %[[rawcache:.+]] = phi i8* [ %[[realloccache:.+]], %[[mergeblk:.+]] ], [ null, %entry ]
245
+ ; CHECK-NEXT: %[[preidx:.+]] = phi i64 [ %[[postidx:.+]], %[[mergeblk:.+]] ], [ 0, %entry ]
246
+ ; CHECK-NEXT: %[[cur:.+]] = phi %class.node* [ %"'ipl", %[[mergeblk:.+]] ], [ %"node'", %entry ]
247
+ ; CHECK-NEXT: %val.08 = phi %class.node* [ %[[loadst:.+]], %[[mergeblk:.+]] ], [ %node, %entry ]
248
248
; CHECK-NEXT: %[[postidx]] = add nuw nsw i64 %[[preidx]], 1
249
- ; CHECK-NEXT: %[[nextrealloc:.+]] = shl nuw nsw i64 %[[postidx]], 3
250
- ; CHECK-NEXT: %[[realloccache]] = call i8* @realloc(i8* %[[rawcache]], i64 %[[nextrealloc]])
249
+
250
+ ; CHECK-NEXT: %[[nexttrunc0:.+]] = and i64 %[[postidx]], 1
251
+ ; CHECK-NEXT: %[[nexttrunc:.+]] = icmp ne i64 %[[nexttrunc0]], 0
252
+ ; CHECK-NEXT: %[[popcnt:.+]] = call i64 @llvm.ctpop.i64(i64 %iv.next)
253
+ ; CHECK-NEXT: %[[le2:.+]] = icmp ult i64 %[[popcnt:.+]], 3
254
+ ; CHECK-NEXT: %[[shouldgrow:.+]] = and i1 %[[le2]], %[[nexttrunc]]
255
+ ; CHECK-NEXT: br i1 %[[shouldgrow]], label %grow.i, label %[[mergeblk]]
256
+
257
+ ; CHECK: grow.i:
258
+ ; CHECK-NEXT: %[[ctlz:.+]] = call i64 @llvm.ctlz.i64(i64 %[[postidx]], i1 true)
259
+ ; CHECK-NEXT: %[[maxbit:.+]] = sub nuw nsw i64 64, %[[ctlz]]
260
+ ; CHECK-NEXT: %[[numbytes:.+]] = shl i64 8, %[[maxbit]]
261
+ ; CHECK-NEXT: %[[growalloc:.+]] = call i8* @realloc(i8* %[[rawcache]], i64 %[[numbytes]])
262
+ ; CHECK-NEXT: br label %[[mergeblk]]
263
+
264
+ ; CHECK: [[mergeblk]]:
265
+ ; CHECK-NEXT: %[[realloccache]] = phi i8* [ %[[growalloc]], %grow.i ], [ %[[rawcache]], %for.body ]
266
+
267
+
251
268
; CHECK-NEXT: %[[reallocbc:.+]] = bitcast i8* %[[realloccache]] to %class.node**
252
269
; CHECK-NEXT: %[[geptostore:.+]] = getelementptr inbounds %class.node*, %class.node** %[[reallocbc]], i64 %[[preidx]]
253
270
; CHECK-NEXT: store %class.node* %[[cur]], %class.node** %[[geptostore]]
@@ -266,7 +283,7 @@ attributes #8 = { builtin nounwind }
266
283
; CHECK-NEXT: br label %invertentry
267
284
268
285
; CHECK: [[antiloop]]:
269
- ; CHECK-NEXT: %[[antivar:.+]] = phi i64 [ %[[subidx:.+]], %incinvertfor.body ], [ %[[preidx]], %for.body ]
286
+ ; CHECK-NEXT: %[[antivar:.+]] = phi i64 [ %[[subidx:.+]], %incinvertfor.body ], [ %[[preidx]], %[[mergeblk]] ]
270
287
; CHECK-NEXT: %[[structptr:.+]] = getelementptr inbounds %class.node*, %class.node** %[[reallocbc]], i64 %[[antivar]]
271
288
; CHECK-NEXT: %[[struct:.+]] = load %class.node*, %class.node** %[[structptr]]
272
289
; CHECK-NEXT: %[[valueipg:.+]] = getelementptr inbounds %class.node, %class.node* %[[struct]], i64 0, i32 0
0 commit comments