From: Eric Botcazou Date: Wed, 17 Oct 2018 17:54:26 +0000 (+0000) Subject: re PR middle-end/87623 (bytes swapped in register when comparing cause fail when... X-Git-Tag: releases/gcc-6.5.0~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0419fc6c3188eecd71a9b93cf2542e60df86067;p=thirdparty%2Fgcc.git re PR middle-end/87623 (bytes swapped in register when comparing cause fail when compiled with -O1 or higher) PR middle-end/87623 * fold-const.c (fold_truth_andor_1): If the right side is not constant, bail out if both sides do not have the same storage order. From-SVN: r265245 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 08148ea61e05..39212a72bf97 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-10-17 Eric Botcazou + + PR middle-end/87623 + * fold-const.c (fold_truth_andor_1): If the right side is not constant, + bail out if both sides do not have the same storage order. + 2018-10-15 Richard Biener Backport from mainline diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 13d27d7fb945..94b9a21bd302 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -5855,12 +5855,13 @@ fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type, } /* If the right sides are not constant, do the same for it. Also, - disallow this optimization if a size or signedness mismatch occurs - between the left and right sides. */ + disallow this optimization if a size, signedness or storage order + mismatch occurs between the left and right sides. */ if (l_const == 0) { if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp + || ll_reversep != lr_reversep /* Make sure the two fields on the right correspond to the left without being swapped. */ || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07ad379a64a1..51daecf179f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-10-17 Eric Botcazou + + * gcc.c-torture/execute/pr87623.c: New test. + 2018-10-15 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gcc.c-torture/execute/pr87623.c b/gcc/testsuite/gcc.c-torture/execute/pr87623.c new file mode 100644 index 000000000000..54d8b5e45711 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr87623.c @@ -0,0 +1,34 @@ +/* PR middle-end/87623 */ +/* Testcase by George Thopas */ + +struct be { + unsigned short pad[1]; + unsigned char a; + unsigned char b; +} __attribute__((scalar_storage_order("big-endian"))); + +typedef struct be t_be; + +struct le { + unsigned short pad[3]; + unsigned char a; + unsigned char b; +}; + +typedef struct le t_le; + +int a_or_b_different(t_be *x,t_le *y) +{ + return (x->a != y->a) || (x->b != y->b); +} + +int main (void) +{ + t_be x = { .a=1, .b=2 }; + t_le y = { .a=1, .b=2 }; + + if (a_or_b_different(&x,&y)) + __builtin_abort (); + + return 0; +}