@@ -340,6 +340,94 @@ define void @array_new_align_nothrow_hot_cold() {
340340 ret void
341341}
342342
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+
343431;; So that instcombine doesn't optimize out the call.
344432declare void @dummy (ptr )
345433
@@ -360,6 +448,18 @@ declare ptr @_ZnamSt11align_val_t12__hot_cold_t(i64, i64, i8)
360448declare ptr @_ZnamRKSt9nothrow_t12__hot_cold_t (i64 , ptr , i8 )
361449declare ptr @_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t (i64 , i64 , ptr , i8 )
362450
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+
363457attributes #0 = { builtin allocsize(0 ) "memprof" ="cold" }
364458attributes #1 = { builtin allocsize(0 ) "memprof" ="notcold" }
365459attributes #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