<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/64998>64998</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Attributes likely and unlikely (C++ 20) not used by hot cold splitting.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            bug,
            enhancement
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            hiraditya
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          hiraditya
      </td>
    </tr>
</table>

<pre>
    In the example below, the hot cold splitting doesnot outline the cold block unless attribute cold is specified on a function in the basic block.

https://godbolt.org/z/T5z96ssv1

```cpp
#include <cstddef>
#include <utility>
#include <cstdio>

#ifdef COLD
#define COLD __attribute__((cold))
#else
#define COLD
#endif

struct IntPairVector {
    void push_back(int a, int b);

    COLD void ExpandCapacity();

    std::pair<int, int>* data_;
    size_t size_;
    size_t capacity_;
};

void IntPairVector::push_back(int a, int b) {
  if (size_ == capacity_) [[unlikely]] {
    printf("asdflasjfd");
 printf("asdflasjfd");
    printf("asdflasjfd");
 printf("asdflasjfd");
    printf("asdflasjfd");
 ExpandCapacity();
  }
  data_[size_++] = std::make_pair(a, b);
}
```

$ clang++ -O3 -std=c++2b -mllvm -hot-cold-split

```asm
IntPairVector::push_back(int, int):        # @IntPairVector::push_back(int, int)
        pushq   %rbp
        pushq %r15
        pushq   %r14
        pushq   %rbx
        pushq %rax
        movl    %edx, %ebx
        movl    %esi, %ebp
 movq    %rdi, %r14
        movq    8(%rdi), %rax
        cmpq 16(%rdi), %rax
        je      .LBB0_1
.LBB0_2:
        movq (%r14), %rcx
        leaq    1(%rax), %rdx
        movq    %rdx, 8(%r14)
        movl    %ebp, (%rcx,%rax,8)
        movl    %ebx, 4(%rcx,%rax,8)
        addq    $8, %rsp
        popq    %rbx
 popq    %r14
        popq    %r15
        popq    %rbp
 retq
.LBB0_1:
        leaq    .L.str(%rip), %r15
        movq %r15, %rdi
        xorl    %eax, %eax
        callq   printf@PLT
 movq    %r15, %rdi
        xorl    %eax, %eax
        callq printf@PLT
        movq    %r15, %rdi
        xorl    %eax, %eax
 callq   printf@PLT
        movq    %r15, %rdi
        xorl    %eax, %eax
        callq   printf@PLT
        movq    %r15, %rdi
 xorl    %eax, %eax
        callq   printf@PLT
        movq    %r14, %rdi
        callq   IntPairVector::ExpandCapacity()@PLT
        movq 8(%r14), %rax
        jmp     .LBB0_2
.L.str:
        .asciz "asdflasjfd"
```

$ clang++ -O3 -std=c++2b -mllvm -hot-cold-split -DCOLD
```asm
IntPairVector::push_back(int, int):        # @IntPairVector::push_back(int, int)
        pushq   %rbp
        pushq %r14
        pushq   %rbx
        subq    $16, %rsp
        movl %edx, %ebx
        movl    %esi, %ebp
        movq    %rdi, %r14
 movq    8(%rdi), %rax
        cmpq    16(%rdi), %rax
        je .LBB0_1
.LBB0_2:
        movq    (%r14), %rcx
        leaq 1(%rax), %rdx
        movq    %rdx, 8(%r14)
        movl    %ebp, (%rcx,%rax,8)
        movl    %ebx, 4(%rcx,%rax,8)
        addq    $16, %rsp
        popq    %rbx
        popq    %r14
        popq %rbp
        retq
.LBB0_1:
        leaq    8(%r14), %rsi
 leaq    8(%rsp), %rdx
        movq    %r14, %rdi
        callq IntPairVector::push_back(int, int) [clone .cold.1]
        movq 8(%rsp), %rax
        jmp     .LBB0_2
IntPairVector::push_back(int, int) [clone .cold.1]: # @IntPairVector::push_back(int, int) [clone .cold.1]
        pushq   %r15
        pushq   %r14
        pushq %r12
        pushq   %rbx
        pushq   %rax
        movq    %rdx, %rbx
        movq    %rsi, %r14
        movq    %rdi, %r15
 leaq    .L.str(%rip), %r12
        movq    %r12, %rdi
        xorl %eax, %eax
        callq   printf@PLT
        movq    %r12, %rdi
 xorl    %eax, %eax
        callq   printf@PLT
        movq    %r12, %rdi
        xorl    %eax, %eax
        callq   printf@PLT
 movq    %r12, %rdi
        xorl    %eax, %eax
        callq printf@PLT
        movq    %r12, %rdi
        xorl    %eax, %eax
 callq   printf@PLT
        movq    %r15, %rdi
        callq IntPairVector::ExpandCapacity()@PLT
        movq    (%r14), %rax
 movq    %rax, (%rbx)
        addq    $8, %rsp
        popq    %rbx
 popq    %r12
        popq    %r14
        popq    %r15
 retq
.L.str:
        .asciz  "asdflasjfd"
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcGE1v4jj015jLE1HiEBoOHAoM0kiVZg6jvSLHNuDWidPY6bb99Ss7H4QQKMy0Wu1WURP8vj_83rOJ1mKXcT5H0QJhvBcFYcK8EYQxilYjUpq9Kubt8ihR7G3-PQOz58BfSZpLDgmX6m-El25xrwxQJRnoXApjRLYDprjOlAFVGiky7tAcSiIVfYIyk1xrIMYUIilNDRMadM6p2ArOQGVAYFtm1AiVgajEJ0QLWvHwkL9C_n31f29MrlF4j_Aa4fVOsURJ46lih_D6HeH1r-h9NtX6JegSoalfPTTP6xUciozKknFA4ZJqwxjfovDbELQ0QgrzdgZqaYU6AFuULeNbWP54WLVLjG-th-wabDatSzYbhGOEY-sZhGf2aSi41HyI_ICQMbHtStamKKmB75n5SUTxF6dGFYDuFhUUAOBFCQZ5qfebhNAnhGORGSA2wvYjseLDRZelJXI6O8pvrznJ2JLkhFqnWM2HCLRhNkrhfU5EgcKlyEwtwroK3wMjhmxaQkci3vnGVK8hAK1lHoDobtUT7VQ8Mr7W4pK9Xf-ILSAcO4mAwhUKVx25FjVaoGhRZlI8cfmGohWKVsf-zQuRma1zDCaabSXRj1tmt1zHUVdi_VvsLgYZwPq9_qzCGC2qqOGFfaxHwtUhBVLyxDcuD3DsHH-cZA2zdpce76QJUEmyXcUbxj9CGDvOK1ot4QTGqZQvKYz3yoztLhq78jRYAYhOq5WPk6TJV6ur8539QzgENPFvom6d7wJQ6v2zYxQVST4Es5AgOk8VTC5wfD3HkfQgqXqRlUERZ69WW_vVp-9iadFiNXqn6uW5BhesAZ8o2GDFLpEqzFmD3NeLpvkzBNNrUB959fYeFgt_U1f86ge2MTlVouYaTDpcaY-r5MRpG9TI5LWDzE79c3CA82J8JOOsM5O8YhnXKuBlI2sZXyZ0UiZXUhLGav0mcWOD7medylsb2vh3F08SrgvrJ2qXWSOo4Oa5G53gJDqN070HT5uiNk7kHc_3BdXxdIAmOOIY5VUVrdtIm-InCUekfD5Uxon_8-HXQHp_jpgBIQOZ9NuyLtjymWI-9tx10r5EzOScUQ2fgdo92O_OCYqHqshJbUpzgLY24Sb7XXb3k98jmop3OOnIX9IVYbzqTJD_tbZ4Q-vTZdKUPttOhmufq6x_1AIHUnCgE97eAm0HurYLXt8AnYZX9sD_WwM8nwWDHXAANtgIhzL2-oY3WEx0U7n6WDq_MhQfVcFbNqo981CpMg6eLSNeYE8958vikY5XlcU_Via8_50C9LFdR1P3zRO5g-BbZ3U4N633ttkQhy6W_nAc75WqqJdzF0YxfCHx8MWZ4lM7_amoLxkoLlv0afPlp4j5YpM-a748W4RuGsTONLNW264ujTFxvW--5qDU3-23HqK6fePSqPjRrDhi85DNwhkZ8XkwnYW-P4uDeLSfE0piP6E8ZhM2pZTO_AST6TQmAWeBz2YjMcc-Dv0YT30_9IPYo2E0u7ubxiwKcDj1bTR4SoT07HDpqWI3ElqXfD6dzGbxSJKES13fNyflzl0sLRHGPNuTjPKU29Lrbp-LueUwTsqdRhNfCm30gacRRvL5fXNFqqG6bwOSMWgu32w0l_UAjH1b0DNloNScQfI2cFXtjcpCznsXyMLsy8SjKkV4baXXr3FeqEdODcJrZ55GeO0s_CcAAP__GsAiKA">