public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/115086] New: bic is not used when the non-not part is a constant
@ 2024-05-14 9:45 pinskia at gcc dot gnu.org
2024-05-14 9:49 ` [Bug target/115086] " pinskia at gcc dot gnu.org
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-05-14 9:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115086
Bug ID: 115086
Summary: bic is not used when the non-not part is a constant
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Target: aarch64
Take:
```
int g2(int a,int c)
{
int b = 4 & ~c;
return b;
}
```
Currently GCC produces:
```
g2:
mvn w0, w1
and w0, w0, 4
ret
```
But producing bic is better for most (if not all) modern cores due to the
instruction that generates the constant would be "free". That is GCC should
produce:
```
g2:
mov w8, 4
bic w0, w8, w1
ret
```
Which is what clang/LLVM produces.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/115086] bic is not used when the non-not part is a constant
2024-05-14 9:45 [Bug target/115086] New: bic is not used when the non-not part is a constant pinskia at gcc dot gnu.org
@ 2024-05-14 9:49 ` pinskia at gcc dot gnu.org
2024-05-14 9:50 ` rearnsha at gcc dot gnu.org
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-05-14 9:49 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115086
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Last reconfirmed| |2024-05-14
See Also| |https://gcc.gnu.org/bugzill
| |a/show_bug.cgi?id=112304
Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org
Status|UNCONFIRMED |ASSIGNED
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Trying 7 -> 13:
7: r105:SI=~r106:SI
REG_DEAD r106:SI
13: x0:SI=r105:SI&0x4
REG_DEAD r105:SI
Failed to match this instruction:
(set (reg/i:SI 0 x0)
(and:SI (not:SI (reg:SI 106))
(const_int 4 [0x4])))
So similar to what I did for csinc, PR 112304 so I will handle this.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/115086] bic is not used when the non-not part is a constant
2024-05-14 9:45 [Bug target/115086] New: bic is not used when the non-not part is a constant pinskia at gcc dot gnu.org
2024-05-14 9:49 ` [Bug target/115086] " pinskia at gcc dot gnu.org
@ 2024-05-14 9:50 ` rearnsha at gcc dot gnu.org
2024-05-15 5:11 ` pinskia at gcc dot gnu.org
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: rearnsha at gcc dot gnu.org @ 2024-05-14 9:50 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115086
--- Comment #2 from Richard Earnshaw <rearnsha at gcc dot gnu.org> ---
And perhaps more importantly the mov can even be hoisted outside of a loop.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/115086] bic is not used when the non-not part is a constant
2024-05-14 9:45 [Bug target/115086] New: bic is not used when the non-not part is a constant pinskia at gcc dot gnu.org
2024-05-14 9:49 ` [Bug target/115086] " pinskia at gcc dot gnu.org
2024-05-14 9:50 ` rearnsha at gcc dot gnu.org
@ 2024-05-15 5:11 ` pinskia at gcc dot gnu.org
2024-05-15 7:38 ` pinskia at gcc dot gnu.org
2024-05-15 10:37 ` pinskia at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-05-15 5:11 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115086
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Richard Earnshaw from comment #2)
> And perhaps more importantly the mov can even be hoisted outside of a loop.
That won't be happening right away, see
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112304#c4 where cinc has the same
issue. In this case it is very similar in that we don't pull the constant from
the and (rather than add) inside LIM. Basically we don't have an early
"combine" to even generate the and/not pattern, forwprop could but I Have not
looked into why it does not and then we could do a split afterwards and LIM
might be able to pull it out. I will definitely look into that but that will
step 2 of this and the other issue.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/115086] bic is not used when the non-not part is a constant
2024-05-14 9:45 [Bug target/115086] New: bic is not used when the non-not part is a constant pinskia at gcc dot gnu.org
` (2 preceding siblings ...)
2024-05-15 5:11 ` pinskia at gcc dot gnu.org
@ 2024-05-15 7:38 ` pinskia at gcc dot gnu.org
2024-05-15 10:37 ` pinskia at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-05-15 7:38 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115086
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
So looking into this a little bit. There are many different patterns which
might need to be fixed. Maybe there is a better way of implementing this into
forwprop. Let see if that is doable. But that won't be until next week.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug target/115086] bic is not used when the non-not part is a constant
2024-05-14 9:45 [Bug target/115086] New: bic is not used when the non-not part is a constant pinskia at gcc dot gnu.org
` (3 preceding siblings ...)
2024-05-15 7:38 ` pinskia at gcc dot gnu.org
@ 2024-05-15 10:37 ` pinskia at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-05-15 10:37 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115086
--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #4)
> So looking into this a little bit. There are many different patterns which
> might need to be fixed. Maybe there is a better way of implementing this
> into forwprop. Let see if that is doable. But that won't be until next week.
I have a better idea than forwprop which I mentioned in a different bug report.
Basically add an andnot optab and expand using that if we can match it. the
open question is should we add an internal function and match it in
isel/math-opt pass and expand the internal function that way or add the code to
expand to match it. Either way the optab will be the same.
Note that will fix even the pull the constant out of the loop issue too.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-05-15 10:37 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-14 9:45 [Bug target/115086] New: bic is not used when the non-not part is a constant pinskia at gcc dot gnu.org
2024-05-14 9:49 ` [Bug target/115086] " pinskia at gcc dot gnu.org
2024-05-14 9:50 ` rearnsha at gcc dot gnu.org
2024-05-15 5:11 ` pinskia at gcc dot gnu.org
2024-05-15 7:38 ` pinskia at gcc dot gnu.org
2024-05-15 10:37 ` pinskia 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).