public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/104484] New: -freorder-block-and-partition not splitting into sections with __builin_expect()
@ 2022-02-10 11:22 avi at scylladb dot com
2022-02-10 12:01 ` [Bug rtl-optimization/104484] " pinskia at gcc dot gnu.org
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: avi at scylladb dot com @ 2022-02-10 11:22 UTC (permalink / raw)
To: gcc-bugs
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.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug rtl-optimization/104484] -freorder-block-and-partition not splitting into sections with __builin_expect()
2022-02-10 11:22 [Bug tree-optimization/104484] New: -freorder-block-and-partition not splitting into sections with __builin_expect() avi at scylladb dot com
@ 2022-02-10 12:01 ` pinskia at gcc dot gnu.org
2022-02-10 13:02 ` avi at scylladb dot com
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-02-10 12:01 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104484
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
There are heuristics used here. It might be also the data got lost when moving
to rtl from gimple.
But the assembly output does not make sense to the code you gave either.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug rtl-optimization/104484] -freorder-block-and-partition not splitting into sections with __builin_expect()
2022-02-10 11:22 [Bug tree-optimization/104484] New: -freorder-block-and-partition not splitting into sections with __builin_expect() avi at scylladb dot com
2022-02-10 12:01 ` [Bug rtl-optimization/104484] " pinskia at gcc dot gnu.org
@ 2022-02-10 13:02 ` avi at scylladb dot com
2022-02-10 22:19 ` pinskia at gcc dot gnu.org
2022-02-12 13:22 ` avi at scylladb dot com
3 siblings, 0 replies; 5+ messages in thread
From: avi at scylladb dot com @ 2022-02-10 13:02 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104484
--- Comment #2 from Avi Kivity <avi at scylladb dot com> ---
(In reply to Andrew Pinski from comment #1)
> But the assembly output does not make sense to the code you gave either.
Apart from the missing .section directives, I didn't notice anything odd. Maybe
movl/testl could be optimized into cmpl.
Ah, I moved this code from C++ so the function signatures are bad, should be
fun(void). With the signatures adjusted, I get
light:
.LFB2:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
call fun
movl f1(%rip), %edx
testl %edx, %edx
jne .L8
.L6:
addq $8, %rsp
.cfi_remember_state
.cfi_def_cfa_offset 8
jmp fun
.p2align 4,,10
.p2align 3
.L8:
.cfi_restore_state
movl f2(%rip), %eax
testl %eax, %eax
je .L6
call very_heavy
jmp .L6
.cfi_endproc
Which still misses the .section directives and the peephole optimization to
merge movl/testl.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug rtl-optimization/104484] -freorder-block-and-partition not splitting into sections with __builin_expect()
2022-02-10 11:22 [Bug tree-optimization/104484] New: -freorder-block-and-partition not splitting into sections with __builin_expect() avi at scylladb dot com
2022-02-10 12:01 ` [Bug rtl-optimization/104484] " pinskia at gcc dot gnu.org
2022-02-10 13:02 ` avi at scylladb dot com
@ 2022-02-10 22:19 ` pinskia at gcc dot gnu.org
2022-02-12 13:22 ` avi at scylladb dot com
3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-02-10 22:19 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104484
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
There is some heuristics going on here. If we mark the function very_heavy as
cold, then GCC does almost the right thing.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug rtl-optimization/104484] -freorder-block-and-partition not splitting into sections with __builin_expect()
2022-02-10 11:22 [Bug tree-optimization/104484] New: -freorder-block-and-partition not splitting into sections with __builin_expect() avi at scylladb dot com
` (2 preceding siblings ...)
2022-02-10 22:19 ` pinskia at gcc dot gnu.org
@ 2022-02-12 13:22 ` avi at scylladb dot com
3 siblings, 0 replies; 5+ messages in thread
From: avi at scylladb dot com @ 2022-02-12 13:22 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104484
--- Comment #4 from Avi Kivity <avi at scylladb dot com> ---
gcc could infer that the check for f2 and the call to very_heavy are cold, and
move that little block to a .cold section, whether or not very_heavy is cold.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-02-12 13:22 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-10 11:22 [Bug tree-optimization/104484] New: -freorder-block-and-partition not splitting into sections with __builin_expect() avi at scylladb dot com
2022-02-10 12:01 ` [Bug rtl-optimization/104484] " pinskia at gcc dot gnu.org
2022-02-10 13:02 ` avi at scylladb dot com
2022-02-10 22:19 ` pinskia at gcc dot gnu.org
2022-02-12 13:22 ` avi at scylladb dot com
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).