@@ -340,6 +340,94 @@ define void @array_new_align_nothrow_hot_cold() {
340
340
ret void
341
341
}
342
342
343
+ ;; Check that operator __size_returning_new(unsigned long) converted to
344
+ ;; __size_returning_new(unsigned long, __hot_cold_t) with a hot or cold attribute.
345
+ ; HOTCOLD-LABEL: @size_returning_test()
346
+ define void @size_returning_test () {
347
+ ;; Attribute cold converted to __hot_cold_t cold value.
348
+ ; HOTCOLD: @__size_returning_new_hot_cold(i64 10, i8 [[COLD]])
349
+ %call = call {ptr , i64 } @__size_returning_new (i64 10 ) #3
350
+ %p = extractvalue {ptr , i64 } %call , 0
351
+ call void @dummy (ptr %p )
352
+ ;; Attribute notcold has no effect.
353
+ ; HOTCOLD: @__size_returning_new(i64 10)
354
+ %call1 = call {ptr , i64 } @__size_returning_new (i64 10 ) #4
355
+ %p1 = extractvalue {ptr , i64 } %call1 , 0
356
+ call void @dummy (ptr %p1 )
357
+ ;; Attribute hot converted to __hot_cold_t hot value.
358
+ ; HOTCOLD: @__size_returning_new_hot_cold(i64 10, i8 [[HOT]])
359
+ %call2 = call {ptr , i64 } @__size_returning_new (i64 10 ) #5
360
+ %p2 = extractvalue {ptr , i64 } %call2 , 0
361
+ call void @dummy (ptr %p2 )
362
+ ret void
363
+ }
364
+
365
+ ;; Check that operator __size_returning_new_aligned(unsigned long, std::align_val_t) converted to
366
+ ;; __size_returning_new_aligned(unsigned long, std::align_val_t, __hot_cold_t) with a hot or cold attribute.
367
+ ; HOTCOLD-LABEL: @size_returning_aligned_test()
368
+ define void @size_returning_aligned_test () {
369
+ ;; Attribute cold converted to __hot_cold_t cold value.
370
+ ; HOTCOLD: @__size_returning_new_aligned_hot_cold(i64 10, i64 8, i8 [[COLD]])
371
+ %call = call {ptr , i64 } @__size_returning_new_aligned (i64 10 , i64 8 ) #3
372
+ %p = extractvalue {ptr , i64 } %call , 0
373
+ call void @dummy (ptr %p )
374
+ ;; Attribute notcold has no effect.
375
+ ; HOTCOLD: @__size_returning_new_aligned(i64 10, i64 8)
376
+ %call1 = call {ptr , i64 } @__size_returning_new_aligned (i64 10 , i64 8 ) #4
377
+ %p1 = extractvalue {ptr , i64 } %call1 , 0
378
+ call void @dummy (ptr %p1 )
379
+ ;; Attribute hot converted to __hot_cold_t hot value.
380
+ ; HOTCOLD: @__size_returning_new_aligned_hot_cold(i64 10, i64 8, i8 [[HOT]])
381
+ %call2 = call {ptr , i64 } @__size_returning_new_aligned (i64 10 , i64 8 ) #5
382
+ %p2 = extractvalue {ptr , i64 } %call2 , 0
383
+ call void @dummy (ptr %p2 )
384
+ ret void
385
+ }
386
+
387
+ ;; Check that __size_returning_new_hot_cold(unsigned long, __hot_cold_t)
388
+ ;; optionally has its hint updated.
389
+ ; HOTCOLD-LABEL: @size_returning_update_test()
390
+ define void @size_returning_update_test () {
391
+ ;; Attribute cold converted to __hot_cold_t cold value.
392
+ ; HOTCOLD: @__size_returning_new_hot_cold(i64 10, i8 [[PREVHINTCOLD]])
393
+ %call = call {ptr , i64 } @__size_returning_new_hot_cold (i64 10 , i8 7 ) #3
394
+ %p = extractvalue {ptr , i64 } %call , 0
395
+ call void @dummy (ptr %p )
396
+ ;; Attribute notcold converted to __hot_cold_t notcold value.
397
+ ; HOTCOLD: @__size_returning_new_hot_cold(i64 10, i8 [[PREVHINTNOTCOLD]])
398
+ %call1 = call {ptr , i64 } @__size_returning_new_hot_cold (i64 10 , i8 7 ) #4
399
+ %p1 = extractvalue {ptr , i64 } %call1 , 0
400
+ call void @dummy (ptr %p1 )
401
+ ;; Attribute hot converted to __hot_cold_t hot value.
402
+ ; HOTCOLD: @__size_returning_new_hot_cold(i64 10, i8 [[PREVHINTHOT]])
403
+ %call2 = call {ptr , i64 } @__size_returning_new_hot_cold (i64 10 , i8 7 ) #5
404
+ %p2 = extractvalue {ptr , i64 } %call2 , 0
405
+ call void @dummy (ptr %p2 )
406
+ ret void
407
+ }
408
+
409
+ ;; Check that __size_returning_new_aligned_hot_cold(unsigned long, __hot_cold_t)
410
+ ;; optionally has its hint updated.
411
+ ; HOTCOLD-LABEL: @size_returning_aligned_update_test()
412
+ define void @size_returning_aligned_update_test () {
413
+ ;; Attribute cold converted to __hot_cold_t cold value.
414
+ ; HOTCOLD: @__size_returning_new_aligned_hot_cold(i64 10, i64 8, i8 [[PREVHINTCOLD]])
415
+ %call = call {ptr , i64 } @__size_returning_new_aligned_hot_cold (i64 10 , i64 8 , i8 7 ) #3
416
+ %p = extractvalue {ptr , i64 } %call , 0
417
+ call void @dummy (ptr %p )
418
+ ;; Attribute notcold converted to __hot_cold_t notcold value.
419
+ ; HOTCOLD: @__size_returning_new_aligned_hot_cold(i64 10, i64 8, i8 [[PREVHINTNOTCOLD]])
420
+ %call1 = call {ptr , i64 } @__size_returning_new_aligned_hot_cold (i64 10 , i64 8 , i8 7 ) #4
421
+ %p1 = extractvalue {ptr , i64 } %call1 , 0
422
+ call void @dummy (ptr %p1 )
423
+ ;; Attribute hot converted to __hot_cold_t hot value.
424
+ ; HOTCOLD: @__size_returning_new_aligned_hot_cold(i64 10, i64 8, i8 [[PREVHINTHOT]])
425
+ %call2 = call {ptr , i64 } @__size_returning_new_aligned_hot_cold (i64 10 , i64 8 , i8 7 ) #5
426
+ %p2 = extractvalue {ptr , i64 } %call2 , 0
427
+ call void @dummy (ptr %p2 )
428
+ ret void
429
+ }
430
+
343
431
;; So that instcombine doesn't optimize out the call.
344
432
declare void @dummy (ptr )
345
433
@@ -360,6 +448,18 @@ declare ptr @_ZnamSt11align_val_t12__hot_cold_t(i64, i64, i8)
360
448
declare ptr @_ZnamRKSt9nothrow_t12__hot_cold_t (i64 , ptr , i8 )
361
449
declare ptr @_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t (i64 , i64 , ptr , i8 )
362
450
451
+
452
+ declare {ptr , i64 } @__size_returning_new (i64 )
453
+ declare {ptr , i64 } @__size_returning_new_hot_cold (i64 , i8 )
454
+ declare {ptr , i64 } @__size_returning_new_aligned (i64 , i64 )
455
+ declare {ptr , i64 } @__size_returning_new_aligned_hot_cold (i64 , i64 , i8 )
456
+
363
457
attributes #0 = { builtin allocsize(0 ) "memprof" ="cold" }
364
458
attributes #1 = { builtin allocsize(0 ) "memprof" ="notcold" }
365
459
attributes #2 = { builtin allocsize(0 ) "memprof" ="hot" }
460
+
461
+ ;; Use separate attributes for __size_returning_new variants since they are not
462
+ ;; treated as builtins.
463
+ attributes #3 = { "memprof" = "cold" }
464
+ attributes #4 = { "memprof" = "notcold" }
465
+ attributes #5 = { "memprof" = "hot" }
0 commit comments