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.