diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2018-10-17 17:54:26 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2018-10-17 17:54:26 +0000 |
commit | d0419fc6c3188eecd71a9b93cf2542e60df86067 (patch) | |
tree | a9c080bb476abdfb0e1cd7b28efeb1397bc98d6f | |
parent | 8fb108b76c0d5f69d5a64a3ab5e59025d76b7f6f (diff) | |
download | gcc-d0419fc6c3188eecd71a9b93cf2542e60df86067.zip gcc-d0419fc6c3188eecd71a9b93cf2542e60df86067.tar.gz gcc-d0419fc6c3188eecd71a9b93cf2542e60df86067.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr87623.c | 34 |
4 files changed, 47 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 08148ea..39212a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-10-17 Eric Botcazou <ebotcazou@adacore.com> + + 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 <rguenther@suse.de> Backport from mainline diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 13d27d7..94b9a21 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 07ad379..51daecf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-10-17 Eric Botcazou <ebotcazou@adacore.com> + + * gcc.c-torture/execute/pr87623.c: New test. + 2018-10-15 Richard Biener <rguenther@suse.de> 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 0000000..54d8b5e --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr87623.c @@ -0,0 +1,34 @@ +/* PR middle-end/87623 */ +/* Testcase by George Thopas <george.thopas@gmail.com> */ + +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; +} |