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.