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).