https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104484

            Bug ID: 104484
           Summary: -freorder-block-and-partition not splitting into
                    sections with __builin_expect()
           Product: gcc
           Version: 11.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: avi at scylladb dot com
  Target Milestone: ---

I expected code guarded by __builtin_expect() to be pushed into .text.cold, but
that's not happening:

int f1, f2;

inline int is() {
    return __builtin_expect(f1, 0) && f2;
}

void heavy() {
    extern void very_heavy();
    if (is()) {
        very_heavy();
    }
}


void fun();

void light() {
    fun();
    heavy();
    fun();
}


with -O3 -freorder-blocks-and-partition:


light:
.LFB2:
        .cfi_startproc
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
        xorl    %eax, %eax
        call    fun
        movl    f1(%rip), %edx
        testl   %edx, %edx
        jne     .L8        .p2align 4,,10
        .p2align 3
.L8:
        .cfi_restore_state
        movl    f2(%rip), %eax
        testl   %eax, %eax
        je      .L6
        xorl    %eax, %eax
        call    very_heavy
        jmp     .L6
        .cfi_endproc

.L6:
        xorl    %eax, %eax
        addq    $8, %rsp
        .cfi_remember_state
        .cfi_def_cfa_offset 8
        jmp     fun


I expected .L8 to be in another section, but it isn't.

Reply via email to