public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd
@ 2023-05-23 13:30 theodort at inf dot ethz.ch
  2023-05-23 15:56 ` [Bug tree-optimization/109943] " rguenth at gcc dot gnu.org
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: theodort at inf dot ethz.ch @ 2023-05-23 13:30 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 109943
           Summary: [13/14 Regression] Missed Dead Code Elimination when
                    using __builtin_unreachable since
                    r13-6834-g41ade3399bd
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: theodort at inf dot ethz.ch
  Target Milestone: ---

void foo(void);
static int b = 5;
static int *c = &b;
static char(a)(char d, char g) {
    ;
    return d % g;
}
static void e(unsigned char d, unsigned g) {
    char h = a(g, d);
    if (h)
        if ((d) >= 0) {
            foo();
        };
}
static void f(int d) { e(b, d); }
int main() {
    f(*c);
    *c = 0;
}

gcc-trunk -O3 generates:

main:
        movl    $0, b(%rip)
        xorl    %eax, %eax
        ret

However, including additional info via __builtin_unreachable results to worse
code:

void foo(void);
static int b = 5;
static int *c = &b;
static char(a)(char d, char g) {
    if ((g) <= 0) {
        __builtin_unreachable();
    }
    return d % g;
}
static void e(unsigned char d, unsigned g) {
    char h = a(g, d);
    if (h)
        if ((d) >= 0) {
            foo();
        };
}
static void f(int d) { e(b, d); }
int main() {
    f(*c);
    *c = 0;
}

gcc-trunk (and 13) -O3 generates:

main:
        movl    b(%rip), %ecx
        movsbl  %cl, %eax
        movzbl  %cl, %ecx
        cltd
        idivl   %ecx
        testl   %edx, %edx
        jne     .L11
        movl    $0, b(%rip)
        xorl    %eax, %eax
        ret
.L11:
        pushq   %rax
        call    foo
        xorl    %edx, %edx
        xorl    %eax, %eax
        movl    %edx, b(%rip)
        popq    %rcx
        ret

https://godbolt.org/z/n34Tsr3vq

gcc-12 can generate optimized code for both cases

Started with r13-6834-g41ade3399bd

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug tree-optimization/109943] [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd
  2023-05-23 13:30 [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd theodort at inf dot ethz.ch
@ 2023-05-23 15:56 ` rguenth at gcc dot gnu.org
  2023-06-20 16:34 ` theodort at inf dot ethz.ch
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2023-05-23 15:56 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
   Target Milestone|---                         |13.2
                 CC|                            |aldyh at gcc dot gnu.org

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Without looking in detail if it now fails to undo a propagation that might now
confuse ranger.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug tree-optimization/109943] [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd
  2023-05-23 13:30 [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd theodort at inf dot ethz.ch
  2023-05-23 15:56 ` [Bug tree-optimization/109943] " rguenth at gcc dot gnu.org
@ 2023-06-20 16:34 ` theodort at inf dot ethz.ch
  2023-07-27  9:26 ` rguenth at gcc dot gnu.org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: theodort at inf dot ethz.ch @ 2023-06-20 16:34 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Theodoros Theodoridis <theodort at inf dot ethz.ch> ---
Not sure if it's useful but the following also started with the same commit: 


https://godbolt.org/z/Tqha4K976

Given the following code:

void foo(void);
static int d, e, h;
static int *f = &e, *q;
static int **g = &f;
static long j, p;
static short k;
void __assert_fail() __attribute__((__noreturn__));
static short(a)(short b, short c) {
    if (!(((b) >= -90) && ((b) <= 0))) {
        __builtin_unreachable();
    }
    return c == 0 || b == 1 && c == 1 ?: b % c;
}
static int **i();
static int l(int *m, long n) {
    j = 0 >= d;
    k = j - 34834;
    if (a(-n, k)) *g = m;
    if (f == 0 || f == &e)
        ;
    else
        __assert_fail();
    for (; h; ++h)
        ;
    return *m;
}
static int *o() {
    l(f, 90);
    g = i();
    if (f == 0 || f == &e)
        ;
    else
        foo();
    return &d;
}
static int **i() {
    a(p, h);
    return &q;
}
int main() { o(); }

gcc-trunk -O2 generates:

main:
        subq    $8, %rsp
        movq    f(%rip), %rax
        movq    g(%rip), %rdx
        movq    %rax, (%rdx)
        cmpq    $e, %rax
        je      .L7
        testq   %rax, %rax
        jne     .L2
.L7:
        movl    h(%rip), %edx
        testl   %edx, %edx
        je      .L5
        movl    $0, h(%rip)
.L5:
        movq    $q, g(%rip)
        cmpq    $e, %rax
        je      .L6
        call    foo
.L6:
        xorl    %eax, %eax
        addq    $8, %rsp
        ret
.L2:
        xorl    %eax, %eax
        call    __assert_fail

gcc-12.3.0 -O2 generates:

main:
        movq    f(%rip), %rax
        movq    g(%rip), %rdx
        movq    %rax, (%rdx)
        cmpq    $e, %rax
        je      .L6
        testq   %rax, %rax
        jne     .L2
.L6:
        movl    h(%rip), %edx
        testl   %edx, %edx
        je      .L5
        movl    $0, h(%rip)
.L5:
        movq    $q, g(%rip)
        xorl    %eax, %eax
        ret
.L2:
        pushq   %rax
        xorl    %eax, %eax
        call    __assert_fail

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug tree-optimization/109943] [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd
  2023-05-23 13:30 [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd theodort at inf dot ethz.ch
  2023-05-23 15:56 ` [Bug tree-optimization/109943] " rguenth at gcc dot gnu.org
  2023-06-20 16:34 ` theodort at inf dot ethz.ch
@ 2023-07-27  9:26 ` rguenth at gcc dot gnu.org
  2023-08-21 23:09 ` pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2023-07-27  9:26 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|13.2                        |13.3

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
GCC 13.2 is being released, retargeting bugs to GCC 13.3.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug tree-optimization/109943] [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd
  2023-05-23 13:30 [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd theodort at inf dot ethz.ch
                   ` (2 preceding siblings ...)
  2023-07-27  9:26 ` rguenth at gcc dot gnu.org
@ 2023-08-21 23:09 ` pinskia at gcc dot gnu.org
  2024-01-12 13:50 ` rguenth at gcc dot gnu.org
  2024-01-12 13:52 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-08-21 23:09 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2023-08-21
             Status|UNCONFIRMED                 |NEW

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
For the testcase in comment #0, fre3 is able to optmize it away (in GCC
12.3.0):
Applying pattern match.pd:636, gimple-match.cc:47124
Match-and-simplified _10 % _8 to 0

That is because we figure out that _10 is the same as _8 somehow.

Confirmed.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug tree-optimization/109943] [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd
  2023-05-23 13:30 [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd theodort at inf dot ethz.ch
                   ` (3 preceding siblings ...)
  2023-08-21 23:09 ` pinskia at gcc dot gnu.org
@ 2024-01-12 13:50 ` rguenth at gcc dot gnu.org
  2024-01-12 13:52 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2024-01-12 13:50 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
With the __builtin_unreachable present (thus g >= 0) we simplify
(int)(char)d to d & 255 which causes the VN difference:

 Value numbering stmt = _9 = (int) _8;
+d.4_7 is available for d.4_7
+_2 is available for _2
 Setting value number of _9 to _9 (changed)
-Making available beyond BB2 _9 for value _9
-Value numbering stmt = _10 = (int) d.4_7;
-Setting value number of _10 to _9 (changed)
+Making available beyond BB4 _9 for value _9
+Value numbering stmt = _10 = b.3_6 & 255;
+_2 is available for _2
+Setting value number of _10 to _10 (changed)
+Making available beyond BB4 _10 for value _10
 Value numbering stmt = _11 = _9 % _10;

in particular we have

  _2 = b;
  b.3_6 = b;
  d.4_7 = (char) b.3_6;
  _8 = (char) _2;
  _9 = (int) _8;
  _10 = (int) d.4_7;
  _11 = _9 % _10;

vs.

  _2 = b;
  b.3_6 = b;
  d.4_7 = (char) b.3_6;
  _8 = (char) _2;
  if (d.4_7 <= 0)
    goto <bb 3>; [0.00%]
  else
    goto <bb 4>; [100.00%]

  <bb 3> [count: 0]:
  __builtin_unreachable ();

  <bb 4> [local count: 1073741824]:
  _9 = (int) _8;
  _10 = b.3_6 & 255;
  _11 = _9 % _10;

where the trivial equivalence is no longer visible.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug tree-optimization/109943] [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd
  2023-05-23 13:30 [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd theodort at inf dot ethz.ch
                   ` (4 preceding siblings ...)
  2024-01-12 13:50 ` rguenth at gcc dot gnu.org
@ 2024-01-12 13:52 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2024-01-12 13:52 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P2

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
The rev. in question must be an odd coincidence - I suppose we're undoing the
forwprop somehow before it.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-01-12 13:52 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-23 13:30 [Bug tree-optimization/109943] New: [13/14 Regression] Missed Dead Code Elimination when using __builtin_unreachable since r13-6834-g41ade3399bd theodort at inf dot ethz.ch
2023-05-23 15:56 ` [Bug tree-optimization/109943] " rguenth at gcc dot gnu.org
2023-06-20 16:34 ` theodort at inf dot ethz.ch
2023-07-27  9:26 ` rguenth at gcc dot gnu.org
2023-08-21 23:09 ` pinskia at gcc dot gnu.org
2024-01-12 13:50 ` rguenth at gcc dot gnu.org
2024-01-12 13:52 ` rguenth at gcc dot gnu.org

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