public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/114429] New: [x86] (neg a) ashifrt>> 31 can be optimized to a > 0.
@ 2024-03-22 5:39 liuhongt at gcc dot gnu.org
2024-03-22 5:44 ` [Bug target/114429] " liuhongt at gcc dot gnu.org
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: liuhongt at gcc dot gnu.org @ 2024-03-22 5:39 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114429
Bug ID: 114429
Summary: [x86] (neg a) ashifrt>> 31 can be optimized to a > 0.
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: liuhongt at gcc dot gnu.org
Target Milestone: ---
typedef unsigned char uint8_t;
uint8_t x264_clip_uint8( int x )
{
return x&(~255) ? (-x)>>31 : x;
}
void
foo (int* a, int* __restrict b, int n)
{
for (int i = 0; i != 8; i++)
b[i] = x264_clip_uint8 (a[i]);
}
gcc -O2 -march=x86-64-v3 -S
foo(int*, int*, int):
..
mov eax, 255
vpxor xmm0, xmm0, xmm0
vmovd xmm1, eax
vpbroadcastd ymm1, xmm1
vmovdqu ymm2, YMMWORD PTR [rdi]
vpminud ymm3, ymm2, ymm1
vpsubd ymm0, ymm0, ymm2
vmovdqa YMMWORD PTR [rsp-32], ymm3
vpsrad ymm0, ymm0, 31
vpcmpeqd ymm3, ymm2, YMMWORD PTR [rsp-32]
vpblendvb ymm0, ymm0, ymm2, ymm3
vpand ymm1, ymm1, ymm0
vmovdqu YMMWORD PTR [rsi], ymm1
It can be better with
mov eax, 255
vmovd xmm1, eax
vpxor xmm0, xmm0, xmm0.
vpbroadcastd ymm1, xmm1
vmovdqu ymm2, YMMWORD PTR [rdi]
vpminud ymm3, ymm2, ymm1
vmovdqa YMMWORD PTR [rsp-32], ymm3
vcmpgtps ymm0, ymm2, ymm0
vpcmpeqd ymm3, ymm2, YMMWORD PTR [rsp-32]
vpblendvb ymm0, ymm0, ymm2, ymm3
vpand ymm1, ymm1, ymm0
vmovdqu YMMWORD PTR [rsi], ymm1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug target/114429] [x86] (neg a) ashifrt>> 31 can be optimized to a > 0.
2024-03-22 5:39 [Bug target/114429] New: [x86] (neg a) ashifrt>> 31 can be optimized to a > 0 liuhongt at gcc dot gnu.org
@ 2024-03-22 5:44 ` liuhongt at gcc dot gnu.org
2024-03-22 6:09 ` liuhongt at gcc dot gnu.org
2024-03-22 6:47 ` liuhongt at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: liuhongt at gcc dot gnu.org @ 2024-03-22 5:44 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114429
Hongtao Liu <liuhongt at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target| |x86_64-*-* i?86-*-*
--- Comment #1 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---
when x is INT_MIN, I assume -x is UD, so compiler can do anything.
otherwise, (-x) >> 31 is just x > 0.
From rtl view. neg of INT_MIN is assumed to 0 after it's truncated.
(neg:m x)
(ss_neg:m x)
(us_neg:m x)
These two expressions represent the negation (subtraction from zero) of the
value represented by x, carried out in mode m. They differ in the behavior on
overflow of integer modes. In the case of neg, the negation of the operand may
be a number not representable in mode m, in which case it is truncated to m.
ss_neg and us_neg ensure that an out-of-bounds result saturates to the maximum
or minimum signed or unsigned value.
so we can optimize (neg a)>>31 to a>0.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug target/114429] [x86] (neg a) ashifrt>> 31 can be optimized to a > 0.
2024-03-22 5:39 [Bug target/114429] New: [x86] (neg a) ashifrt>> 31 can be optimized to a > 0 liuhongt at gcc dot gnu.org
2024-03-22 5:44 ` [Bug target/114429] " liuhongt at gcc dot gnu.org
@ 2024-03-22 6:09 ` liuhongt at gcc dot gnu.org
2024-03-22 6:47 ` liuhongt at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: liuhongt at gcc dot gnu.org @ 2024-03-22 6:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114429
--- Comment #2 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---
(In reply to Hongtao Liu from comment #1)
> when x is INT_MIN, I assume -x is UD, so compiler can do anything.
> otherwise, (-x) >> 31 is just x > 0.
> From rtl view. neg of INT_MIN is assumed to 0 after it's truncated.
Wait, is -INT_MIN truncated to INT_MIN? if that's case, we can't do the
optimization at rtl.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug target/114429] [x86] (neg a) ashifrt>> 31 can be optimized to a > 0.
2024-03-22 5:39 [Bug target/114429] New: [x86] (neg a) ashifrt>> 31 can be optimized to a > 0 liuhongt at gcc dot gnu.org
2024-03-22 5:44 ` [Bug target/114429] " liuhongt at gcc dot gnu.org
2024-03-22 6:09 ` liuhongt at gcc dot gnu.org
@ 2024-03-22 6:47 ` liuhongt at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: liuhongt at gcc dot gnu.org @ 2024-03-22 6:47 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114429
Hongtao Liu <liuhongt at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #3 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---
Then invalid.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-03-22 6:47 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-22 5:39 [Bug target/114429] New: [x86] (neg a) ashifrt>> 31 can be optimized to a > 0 liuhongt at gcc dot gnu.org
2024-03-22 5:44 ` [Bug target/114429] " liuhongt at gcc dot gnu.org
2024-03-22 6:09 ` liuhongt at gcc dot gnu.org
2024-03-22 6:47 ` liuhongt 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).