From 1906e1a6072d3ef64553707125d8132b24df3dcb Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 17 Oct 2018 17:49:28 +0000 Subject: [PATCH] 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: r265242 --- gcc/ChangeLog | 8 ++++- gcc/fold-const.c | 5 +-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.c-torture/execute/pr87623.c | 34 +++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr87623.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4cfd8210ffb..d26780eb171 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,10 @@ -2018-10-09 Aldy Hernandez +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-17 Aldy Hernandez * bitmap.c (bitmap_head::dump): New. * bitmap.h (bitmap_head): Add dump(). diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 4977eef9810..5399288dfc5 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6009,12 +6009,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 0f75b6d97dc..1e622066da5 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-17 Paolo Carlini PR c++/84705 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 00000000000..54d8b5e4571 --- /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; +}