public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
@ 2023-05-25 0:40 pinskia at gcc dot gnu.org
2023-05-25 0:41 ` [Bug tree-optimization/109960] " pinskia at gcc dot gnu.org
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-05-25 0:40 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Bug ID: 109960
Summary: [10/11/12/13/14 Regression] missing combining of
`(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Take the following C++ code (reduced from stmt_can_terminate_bb_p):
```
static inline bool f1(unsigned *a)
{
return (*a&1);
}
static inline bool f2(unsigned *a)
{
return (*a&2);
}
bool f(int c, unsigned *a)
{
if (c)
return 0;
return f2(a) || f1(a) ;
}
```
At -O1 we can produce:
```
movl $0, %eax
testl %edi, %edi
jne .L1
testb $3, (%rsi)
setne %al
.L1:
ret
```
But at -O2 we get:
xorl %eax, %eax
testl %edi, %edi
jne .L1
movl (%rsi), %edx
movl %edx, %eax
andl $1, %eax
andl $2, %edx
movl $1, %edx
cmovne %edx, %eax
.L1:
ret
Which is just so much worse.
This started in GCC 9.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
@ 2023-05-25 0:41 ` pinskia at gcc dot gnu.org
2023-05-25 0:45 ` pinskia at gcc dot gnu.org
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-05-25 0:41 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Known to work| |8.5.0
Known to fail| |9.1.0
Target Milestone|--- |10.5
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
2023-05-25 0:41 ` [Bug tree-optimization/109960] " pinskia at gcc dot gnu.org
@ 2023-05-25 0:45 ` pinskia at gcc dot gnu.org
2023-05-25 0:58 ` pinskia at gcc dot gnu.org
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-05-25 0:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
We could have a pattern that does:
`(a & CST) != 0 ? 1: (bool)a` -> `a & (CST|1) != 0` to fix this I think.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
2023-05-25 0:41 ` [Bug tree-optimization/109960] " pinskia at gcc dot gnu.org
2023-05-25 0:45 ` pinskia at gcc dot gnu.org
@ 2023-05-25 0:58 ` pinskia at gcc dot gnu.org
2023-05-25 2:29 ` pinskia at gcc dot gnu.org
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-05-25 0:58 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2023-05-25
Status|UNCONFIRMED |ASSIGNED
Ever confirmed|0 |1
Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Or maybe extend recognize_single_bit_test to recognize (bool)a != 0 is the same
as a & 1 != 0.
Let me try that.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (2 preceding siblings ...)
2023-05-25 0:58 ` pinskia at gcc dot gnu.org
@ 2023-05-25 2:29 ` pinskia at gcc dot gnu.org
2023-05-25 2:51 ` pinskia at gcc dot gnu.org
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-05-25 2:29 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|1 |0
Status|ASSIGNED |UNCONFIRMED
Assignee|pinskia at gcc dot gnu.org |unassigned at gcc dot gnu.org
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Nope not working, even tried to figure out how to modify tree-ssa-reassoc.cc to
teach it about `(bool)a` being the same as `(a & 1) != 0` But I could not
figure out how.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (3 preceding siblings ...)
2023-05-25 2:29 ` pinskia at gcc dot gnu.org
@ 2023-05-25 2:51 ` pinskia at gcc dot gnu.org
2023-05-25 7:59 ` rguenth at gcc dot gnu.org
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-05-25 2:51 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I happened to notice this because I am working on a match patch that transform
`a ? 1 : b` into `a | b`.
In the case of stmt_can_terminate_bb_p, I noticed we had:
<bb 31> [local count: 330920071]:
_48 = MEM[(const struct gasm *)t_22(D)].D.129035.D.128905.D.128890.subcode;
_49 = _48 & 2;
if (_49 != 0)
goto <bb 33>; [34.00%]
else
goto <bb 32>; [66.00%]
<bb 32> [local count: 218407246]:
_50 = (bool) _48;
<bb 33> [local count: 940291388]:
# _13 = PHI <0(14), _50(32), _12(29), 0(11), 0(30), 1(2), 1(31), 0(25)>
And the patch to match would do:
<bb 31> [local count: 330920071]:
_48 = MEM[(const struct gasm *)t_22(D)].D.129035.D.128905.D.128890.subcode;
_49 = _48 & 2;
_50 = (bool) _48;
_127 = _49 != 0;
_44 = _50 | _127;
<bb 32> [local count: 940291388]:
# _13 = PHI <0(14), 0(25), _12(29), 0(11), 0(30), 1(2), _44(31)>
Which is definitely better than before but I was like isn't that the same as:
_49 = _48 & 3;
_44 = _49 != 0;
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (4 preceding siblings ...)
2023-05-25 2:51 ` pinskia at gcc dot gnu.org
@ 2023-05-25 7:59 ` rguenth at gcc dot gnu.org
2023-07-07 10:45 ` [Bug tree-optimization/109960] [11/12/13/14 " rguenth at gcc dot gnu.org
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: rguenth at gcc dot gnu.org @ 2023-05-25 7:59 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
ifcombine was supposed to handle this but I guess we mess up before it
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (5 preceding siblings ...)
2023-05-25 7:59 ` rguenth at gcc dot gnu.org
@ 2023-07-07 10:45 ` rguenth at gcc dot gnu.org
2023-09-16 22:55 ` pinskia at gcc dot gnu.org
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: rguenth at gcc dot gnu.org @ 2023-07-07 10:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target Milestone|10.5 |11.5
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
GCC 10 branch is being closed.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (6 preceding siblings ...)
2023-07-07 10:45 ` [Bug tree-optimization/109960] [11/12/13/14 " rguenth at gcc dot gnu.org
@ 2023-09-16 22:55 ` pinskia at gcc dot gnu.org
2023-09-16 23:04 ` pinskia at gcc dot gnu.org
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-09-16 22:55 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Mine.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (7 preceding siblings ...)
2023-09-16 22:55 ` pinskia at gcc dot gnu.org
@ 2023-09-16 23:04 ` pinskia at gcc dot gnu.org
2023-09-17 1:27 ` pinskia at gcc dot gnu.org
2024-01-12 13:53 ` rguenth at gcc dot gnu.org
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-09-16 23:04 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Created attachment 55913
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=55913&action=edit
part of the ifcombine fixes
It does not catch:
_10 = _5 >> 1;
_11 = (_Bool) _10;
if (_11 != 0)
Though. I will add that in a bit. That is used for PR 108370.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (8 preceding siblings ...)
2023-09-16 23:04 ` pinskia at gcc dot gnu.org
@ 2023-09-17 1:27 ` pinskia at gcc dot gnu.org
2024-01-12 13:53 ` rguenth at gcc dot gnu.org
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-09-17 1:27 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Created attachment 55915
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=55915&action=edit
match pattern for the non-ifcombine case
sometimes we need to handle this outside of ifcombine due to phiopt or other
passes. So this adds that pattern.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/109960] [11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0`
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
` (9 preceding siblings ...)
2023-09-17 1:27 ` pinskia at gcc dot gnu.org
@ 2024-01-12 13:53 ` rguenth at gcc dot gnu.org
10 siblings, 0 replies; 12+ messages in thread
From: rguenth at gcc dot gnu.org @ 2024-01-12 13:53 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109960
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Priority|P3 |P2
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-01-12 13:53 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-25 0:40 [Bug tree-optimization/109960] New: [10/11/12/13/14 Regression] missing combining of `(a&1) != 0 || (a&2)!=0` into `(a&3)!=0` pinskia at gcc dot gnu.org
2023-05-25 0:41 ` [Bug tree-optimization/109960] " pinskia at gcc dot gnu.org
2023-05-25 0:45 ` pinskia at gcc dot gnu.org
2023-05-25 0:58 ` pinskia at gcc dot gnu.org
2023-05-25 2:29 ` pinskia at gcc dot gnu.org
2023-05-25 2:51 ` pinskia at gcc dot gnu.org
2023-05-25 7:59 ` rguenth at gcc dot gnu.org
2023-07-07 10:45 ` [Bug tree-optimization/109960] [11/12/13/14 " rguenth at gcc dot gnu.org
2023-09-16 22:55 ` pinskia at gcc dot gnu.org
2023-09-16 23:04 ` pinskia at gcc dot gnu.org
2023-09-17 1:27 ` pinskia at gcc dot gnu.org
2024-01-12 13:53 ` 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).