public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit
@ 2021-08-30 8:07 changyp6 at gmail dot com
2021-08-30 8:11 ` [Bug c/102124] " changyp6 at gmail dot com
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: changyp6 at gmail dot com @ 2021-08-30 8:07 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
Bug ID: 102124
Summary: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose
Sign Bit
Product: gcc
Version: 11.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: changyp6 at gmail dot com
Target Milestone: ---
Created attachment 51374
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51374&action=edit
Test program for gcc 11.2.1 on AARCH64
Description of problem:
When I'm building libgcrypt 1.9.4 with GCC 11.2.1 on my AARCH64 box(armv8.2
cortex-a76), I'm using -O3 compile options. however, -O3 generated code failed
to pass "basic" test of libgcrypt, it fails on "gcry_cipher_checktag" function.
After investigation, I found that, the problem occurs in buf_eq_const()
function in file cipher/bufhelp.h of libgcrypt-1.9.4
362 /* Constant-time compare of two buffers. Returns 1 if buffers are equal,
363 and 0 if buffers differ. */
364 static inline int
365 buf_eq_const(const void *_a, const void *_b, size_t len)
366 {
367 const byte *a = _a;
368 const byte *b = _b;
369 int ab, ba;
370 size_t i;
371
372 /* Constant-time compare. */
373 for (i = 0, ab = 0, ba = 0; i < len; i++)
374 {
375 /* If a[i] != b[i], either ab or ba will be negative. */
376 ab |= a[i] - b[i];
377 ba |= b[i] - a[i];
378 }
379
380 /* 'ab | ba' is negative when buffers are not equal. */
382 return (ab | ba) >= 0;
383 }
The calculation of 2 different array becomes >= 0 on the return value, however,
it should be negative value.
After I change -O3 to -O2, this function works again.
Then I compile libgcrypt 1.9.4 with -O2 plus additional GCC options which are
added by -O3 to locate the actual option that causing this issue, finally I
found that, if "-ftree-loop-vectorize" is used to compile this code, the
calculated result is a positive value, if removing "-ftree-loop-vectorize", the
calculated result is negative.
Then I downgraded GCC to 10.x, -ftree-loop-vectorize won't cause such issue.
So I'm sure this is a GCC bug.
It seems that "-ftree-loop-vectorize" causing "|=" operation ignore the "sign
bit" of "a[i] - b[i]" or "b[i] - a[i]".
I have summarized a test-case, which is attached
I have also compiled a cross-toolchain, using gcc git version
(98e482761b083dbc35ae59704ee1eeb0b8eeb5d1), which is also gcc 11.2.1, this git
version also has such issue.
Version-Release number of selected component (if applicable):
GCC 11.2.1
Additional Info:
GCC 11 for x86 / x86_64 doesn't have such issue.
GCC 10.x for aarch64 doesn't have such issue.
I have also submitted this bug to Fedora bugzilla
https://bugzilla.redhat.com/show_bug.cgi?id=1998964
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug c/102124] GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
@ 2021-08-30 8:11 ` changyp6 at gmail dot com
2021-08-30 8:32 ` [Bug target/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform jakub at gcc dot gnu.org
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: changyp6 at gmail dot com @ 2021-08-30 8:11 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #1 from Tomas Chang <changyp6 at gmail dot com> ---
Test Program is as below:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t byte;
int buf_eq_const(const void *_a, const void *_b, size_t len)
{
const byte *a = _a;
const byte *b = _b;
int ab, ba;
size_t i;
/* Constant-time compare. */
for (i = 0, ab = 0, ba = 0; i < len; i++)
{
/* If a[i] != b[i], either ab or ba will be negative. */
ab |= a[i] - b[i];
ba |= b[i] - a[i];
}
/* 'ab | ba' is negative when buffers are not equal. */
printf("(ab | ba) = %d(%08x), ab = %d(%08x), ba = %d(%08x)\n", (ab | ba),
(ab | ba), ab, ab, ba, ba);
return (ab | ba) >= 0;
}
void print_array(const char *name, uint8_t *a, size_t len)
{
printf("%s[%lu] = {", name, len);
for (size_t i = 0; i < len; ++ i) {
printf("\'%c\', ", a[i]);
}
printf("}\n");
}
int main(int argc, char *argv[])
{
uint8_t a[32] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', 'a', 'a', 'a'};
uint8_t b[32] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', 'a', 'a', 'a'};
uint8_t c[32] = {'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b',
'b', 'b', 'b', 'b', 'b'};
printf("Comparing array a and array b:\n");
print_array("a", a, 16);
print_array("b", b, 16);
if (buf_eq_const(a, b, 16)) {
printf("a == b\n");
} else {
printf("a != b\n");
}
printf("Comparing array a and array c:\n");
print_array("a", a, 16);
print_array("c", c, 16);
if (buf_eq_const(a, c, 16)) {
printf("a == c\n");
} else {
printf("a != c\n");
}
return 0;
}
Compile this file with the following command:
gcc -Wall -O2 -march=armv8.2-a+crypto+fp16+rcpc+dotprod -mtune=cortex-a76 -o $@
$<
Running Results:
./test-gcc-O2
Comparing array a and array b:
a[16] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', }
b[16] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', }
(ab | ba) = 0(00000000), ab = 0(00000000), ba = 0(00000000)
a == b
Comparing array a and array c:
a[16] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', }
c[16] = {'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b',
'b', 'b', }
(ab | ba) = -1(ffffffff), ab = -1(ffffffff), ba = 1(00000001)
a != c
Compile this file with the following command:
test-gcc-O2-tree-loop-vectorize: test-gcc.c
gcc -Wall -O2 -march=armv8.2-a+crypto+fp16+rcpc+dotprod
-mtune=cortex-a76 -ftree-loop-vectorize -o $@ $<
Running Results:
./test-gcc-O2-tree-loop-vectorize
Comparing array a and array b:
a[16] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', }
b[16] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', }
(ab | ba) = 0(00000000), ab = 0(00000000), ba = 0(00000000)
a == b
Comparing array a and array c:
a[16] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', }
c[16] = {'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b',
'b', 'b', }
(ab | ba) = 65535(0000ffff), ab = 65535(0000ffff), ba = 1(00000001)
a == c
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug target/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
2021-08-30 8:11 ` [Bug c/102124] " changyp6 at gmail dot com
@ 2021-08-30 8:32 ` jakub at gcc dot gnu.org
2021-08-30 8:44 ` jakub at gcc dot gnu.org
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-08-30 8:32 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org,
| |joelh at gcc dot gnu.org,
| |rsandifo at gcc dot gnu.org
Priority|P3 |P2
Target Milestone|--- |11.3
Summary|GCC 11.2.1 |[11/12 Regression]
|-ftree-loop-vectorize |-ftree-loop-vectorize
|Causing Data To Lose Sign |Causing Data To Lose Sign
|Bit on AARCH64 Platform |Bit on AARCH64 Platform
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
Last reconfirmed| |2021-08-30
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Started with r11-5160-g9fc9573f9a5e9432e53c7de93985cfbd267f0309 .
Slightly reduced testcase:
int
foo (const unsigned char *a, const unsigned char *b, unsigned long len)
{
int ab, ba;
unsigned long i;
for (i = 0, ab = 0, ba = 0; i < len; i++)
{
ab |= a[i] - b[i];
ba |= b[i] - a[i];
}
return (ab | ba) >= 0;
}
int main ()
{
unsigned char a[32] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', 'a', 'a', 'a'};
unsigned char b[32] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
'a', 'a', 'a', 'a', 'a'};
unsigned char c[32] = {'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b',
'b', 'b', 'b', 'b', 'b'};
if (!foo (a, b, 16))
__builtin_abort ();
if (foo (a, c, 16))
__builtin_abort ();
return 0;
}
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug target/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
2021-08-30 8:11 ` [Bug c/102124] " changyp6 at gmail dot com
2021-08-30 8:32 ` [Bug target/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform jakub at gcc dot gnu.org
@ 2021-08-30 8:44 ` jakub at gcc dot gnu.org
2021-08-30 9:28 ` changyp6 at gmail dot com
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-08-30 8:44 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Before vectorization the loop body is:
_1 = a_19(D) + i_29;
_2 = *_1;
_3 = (int) _2;
_4 = b_20(D) + i_29;
_5 = *_4;
_6 = (int) _5;
_7 = _3 - _6;
ab_21 = _7 | ab_25;
_10 = _6 - _3;
ba_22 = _10 | ba_27;
where _2 and _5 are unsigned char and _3, _6, _7, _10 are int.
It is vectorized as
vect_patt_54.17_61 = WIDEN_MINUS_LO_EXPR <vect__2.13_56, vect__5.16_17>;
vect_patt_54.17_62 = WIDEN_MINUS_HI_EXPR <vect__2.13_56, vect__5.16_17>;
vect_patt_53.18_63 = [vec_unpack_lo_expr] vect_patt_54.17_61;
vect_patt_53.18_64 = [vec_unpack_hi_expr] vect_patt_54.17_61;
vect_patt_53.18_65 = [vec_unpack_lo_expr] vect_patt_54.17_62;
vect_patt_53.18_66 = [vec_unpack_hi_expr] vect_patt_54.17_62;
_7 = _3 - _6;
vect_ab_21.19_67 = vect_patt_53.18_63 | vect_ab_25.9_13;
vect_ab_21.19_68 = vect_patt_53.18_64 | vect_ab_21.19_67;
vect_ab_21.19_69 = vect_patt_53.18_65 | vect_ab_21.19_68;
vect_ab_21.19_70 = vect_patt_53.18_66 | vect_ab_21.19_69;
ab_21 = _7 | ab_25;
which means it is vectorized as if it was instead of (int) _2 - (int) _6
(int) (unsigned short) ((unsigned short) _2 - (unsigned short) _6).
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug target/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (2 preceding siblings ...)
2021-08-30 8:44 ` jakub at gcc dot gnu.org
@ 2021-08-30 9:28 ` changyp6 at gmail dot com
2021-08-30 10:05 ` jakub at gcc dot gnu.org
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: changyp6 at gmail dot com @ 2021-08-30 9:28 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #4 from Tomas Chang <changyp6 at gmail dot com> ---
(In reply to Jakub Jelinek from comment #3)
> Before vectorization the loop body is:
> _1 = a_19(D) + i_29;
> _2 = *_1;
> _3 = (int) _2;
> _4 = b_20(D) + i_29;
> _5 = *_4;
> _6 = (int) _5;
> _7 = _3 - _6;
> ab_21 = _7 | ab_25;
> _10 = _6 - _3;
> ba_22 = _10 | ba_27;
> where _2 and _5 are unsigned char and _3, _6, _7, _10 are int.
> It is vectorized as
> vect_patt_54.17_61 = WIDEN_MINUS_LO_EXPR <vect__2.13_56, vect__5.16_17>;
> vect_patt_54.17_62 = WIDEN_MINUS_HI_EXPR <vect__2.13_56, vect__5.16_17>;
> vect_patt_53.18_63 = [vec_unpack_lo_expr] vect_patt_54.17_61;
> vect_patt_53.18_64 = [vec_unpack_hi_expr] vect_patt_54.17_61;
> vect_patt_53.18_65 = [vec_unpack_lo_expr] vect_patt_54.17_62;
> vect_patt_53.18_66 = [vec_unpack_hi_expr] vect_patt_54.17_62;
> _7 = _3 - _6;
> vect_ab_21.19_67 = vect_patt_53.18_63 | vect_ab_25.9_13;
> vect_ab_21.19_68 = vect_patt_53.18_64 | vect_ab_21.19_67;
> vect_ab_21.19_69 = vect_patt_53.18_65 | vect_ab_21.19_68;
> vect_ab_21.19_70 = vect_patt_53.18_66 | vect_ab_21.19_69;
> ab_21 = _7 | ab_25;
> which means it is vectorized as if it was instead of (int) _2 - (int) _6
> (int) (unsigned short) ((unsigned short) _2 - (unsigned short) _6).
Thank you very much for confirming this issue so quicky!
Hope this issue can be fixed soon!
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug target/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (3 preceding siblings ...)
2021-08-30 9:28 ` changyp6 at gmail dot com
@ 2021-08-30 10:05 ` jakub at gcc dot gnu.org
2021-08-30 10:07 ` [Bug tree-optimization/102124] " jakub at gcc dot gnu.org
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-08-30 10:05 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think the bug is in vect_recog_widen_op_pattern.
When we have half_type unsigned, for PLUS_EXPR, MULT_EXPR (and supposedly
LSHIFT_EXPR) it is ok that itype is twice the precision and same sign as
half_type, say
unsigned char uc1 = 0xfe, uc2 = 0xff;
int t1 = uc1, t2 = uc2;
t1 + t2 (or t1 * t2) wants to perform the widening operation and then
zero-extend to the result type.
But MINUS_EXPR seems to be special,
t1 - t2
is negative despite half_type being unsigned (and, even if type is unsigned,
such as for
unsigned u1 = uc1, u2 = uc2;
u1 - u2
wants sign-extension from unsigned short (aka itype) to unsigned int (aka type)
rather than zero-extension.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (4 preceding siblings ...)
2021-08-30 10:05 ` jakub at gcc dot gnu.org
@ 2021-08-30 10:07 ` jakub at gcc dot gnu.org
2021-08-30 10:15 ` jakub at gcc dot gnu.org
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-08-30 10:07 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |jakub at gcc dot gnu.org
Component|target |tree-optimization
Status|NEW |ASSIGNED
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (5 preceding siblings ...)
2021-08-30 10:07 ` [Bug tree-optimization/102124] " jakub at gcc dot gnu.org
@ 2021-08-30 10:15 ` jakub at gcc dot gnu.org
2021-09-01 4:19 ` changyp6 at gmail dot com
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-08-30 10:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 51377
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51377&action=edit
gcc12-pr102124.patch
Untested fix.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (6 preceding siblings ...)
2021-08-30 10:15 ` jakub at gcc dot gnu.org
@ 2021-09-01 4:19 ` changyp6 at gmail dot com
2021-09-01 11:40 ` cvs-commit at gcc dot gnu.org
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: changyp6 at gmail dot com @ 2021-09-01 4:19 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #7 from Tomas Chang <changyp6 at gmail dot com> ---
(In reply to Jakub Jelinek from comment #6)
> Created attachment 51377 [details]
> gcc12-pr102124.patch
>
> Untested fix.
After applying this patch on GCC 11.2.1 code base, I re-built GCC on my AARCH64
box (spending 36 hours) and tested. This issue is gone.
Thanks for fixing this bug so quickly!
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (7 preceding siblings ...)
2021-09-01 4:19 ` changyp6 at gmail dot com
@ 2021-09-01 11:40 ` cvs-commit at gcc dot gnu.org
2021-09-01 11:41 ` cvs-commit at gcc dot gnu.org
2021-09-01 11:48 ` jakub at gcc dot gnu.org
10 siblings, 0 replies; 12+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-09-01 11:40 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>:
https://gcc.gnu.org/g:bea07159d1d4c9a61c8f7097e9f88c2b206b1b2f
commit r12-3286-gbea07159d1d4c9a61c8f7097e9f88c2b206b1b2f
Author: Jakub Jelinek <jakub@redhat.com>
Date: Wed Sep 1 13:30:51 2021 +0200
vectorizer: Fix up vectorization using WIDEN_MINUS_EXPR [PR102124]
The following testcase is miscompiled on aarch64-linux at -O3 since the
introduction of WIDEN_MINUS_EXPR.
The problem is if the inner type (half_type) is unsigned and the result
type in which the subtraction is performed (type) has precision more than
twice as larger as the inner type's precision.
For other widening operations like WIDEN_{PLUS,MULT}_EXPR, if half_type
is unsigned, the addition/multiplication result in itype is also unsigned
and needs to be zero-extended to type.
But subtraction is special, even when half_type is unsigned, the
subtraction
behaves as signed (also regardless of whether the result type is signed or
unsigned), 0xfeU - 0xffU is -1 or 0xffffffffU, not 0x0000ffff.
I think it is better not to use mixed signedness of types in
WIDEN_MINUS_EXPR (have unsigned vector of operands and signed result
vector), so this patch instead adds another cast to make sure we always
sign-extend the result from itype to type if type is wider than itype.
2021-09-01 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/102124
* tree-vect-patterns.c (vect_recog_widen_op_pattern): For ORIG_CODE
MINUS_EXPR, if itype is unsigned with smaller precision than type,
add an extra cast to signed variant of itype to ensure
sign-extension.
* gcc.dg/torture/pr102124.c: New test.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (8 preceding siblings ...)
2021-09-01 11:40 ` cvs-commit at gcc dot gnu.org
@ 2021-09-01 11:41 ` cvs-commit at gcc dot gnu.org
2021-09-01 11:48 ` jakub at gcc dot gnu.org
10 siblings, 0 replies; 12+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-09-01 11:41 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
--- Comment #9 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Jakub Jelinek
<jakub@gcc.gnu.org>:
https://gcc.gnu.org/g:051040f0642cfd002d31f655a70aef50e6f44d25
commit r11-8948-g051040f0642cfd002d31f655a70aef50e6f44d25
Author: Jakub Jelinek <jakub@redhat.com>
Date: Wed Sep 1 13:30:51 2021 +0200
vectorizer: Fix up vectorization using WIDEN_MINUS_EXPR [PR102124]
The following testcase is miscompiled on aarch64-linux at -O3 since the
introduction of WIDEN_MINUS_EXPR.
The problem is if the inner type (half_type) is unsigned and the result
type in which the subtraction is performed (type) has precision more than
twice as larger as the inner type's precision.
For other widening operations like WIDEN_{PLUS,MULT}_EXPR, if half_type
is unsigned, the addition/multiplication result in itype is also unsigned
and needs to be zero-extended to type.
But subtraction is special, even when half_type is unsigned, the
subtraction
behaves as signed (also regardless of whether the result type is signed or
unsigned), 0xfeU - 0xffU is -1 or 0xffffffffU, not 0x0000ffff.
I think it is better not to use mixed signedness of types in
WIDEN_MINUS_EXPR (have unsigned vector of operands and signed result
vector), so this patch instead adds another cast to make sure we always
sign-extend the result from itype to type if type is wider than itype.
2021-09-01 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/102124
* tree-vect-patterns.c (vect_recog_widen_op_pattern): For ORIG_CODE
MINUS_EXPR, if itype is unsigned with smaller precision than type,
add an extra cast to signed variant of itype to ensure
sign-extension.
* gcc.dg/torture/pr102124.c: New test.
(cherry picked from commit bea07159d1d4c9a61c8f7097e9f88c2b206b1b2f)
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug tree-optimization/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
` (9 preceding siblings ...)
2021-09-01 11:41 ` cvs-commit at gcc dot gnu.org
@ 2021-09-01 11:48 ` jakub at gcc dot gnu.org
10 siblings, 0 replies; 12+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-09-01 11:48 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102124
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|--- |FIXED
Status|ASSIGNED |RESOLVED
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Fixed for 11.3+ and 12.1+.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2021-09-01 11:48 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-30 8:07 [Bug c/102124] New: GCC 11.2.1 -ftree-loop-vectorize Causing Data To Lose Sign Bit changyp6 at gmail dot com
2021-08-30 8:11 ` [Bug c/102124] " changyp6 at gmail dot com
2021-08-30 8:32 ` [Bug target/102124] [11/12 Regression] -ftree-loop-vectorize Causing Data To Lose Sign Bit on AARCH64 Platform jakub at gcc dot gnu.org
2021-08-30 8:44 ` jakub at gcc dot gnu.org
2021-08-30 9:28 ` changyp6 at gmail dot com
2021-08-30 10:05 ` jakub at gcc dot gnu.org
2021-08-30 10:07 ` [Bug tree-optimization/102124] " jakub at gcc dot gnu.org
2021-08-30 10:15 ` jakub at gcc dot gnu.org
2021-09-01 4:19 ` changyp6 at gmail dot com
2021-09-01 11:40 ` cvs-commit at gcc dot gnu.org
2021-09-01 11:41 ` cvs-commit at gcc dot gnu.org
2021-09-01 11:48 ` jakub 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).