re PR middle-end/87623 (bytes swapped in register when comparing cause fail when...
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 17 Oct 2018 17:49:28 +0000 (17:49 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 17 Oct 2018 17:49:28 +0000 (17:49 +0000)
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
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr87623.c [new file with mode: 0644]

index 4cfd8210ffbe0edecc86612881baef1a09d7b1a1..d26780eb171c767347a392bd66b60d60c8327b32 100644 (file)
@@ -1,4 +1,10 @@
-2018-10-09  Aldy Hernandez  <aldyh@redhat.com>
+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-17  Aldy Hernandez  <aldyh@redhat.com>
 
        * bitmap.c (bitmap_head::dump): New.
        * bitmap.h (bitmap_head): Add dump().
index 4977eef981021c423b913bc1c8bc1b47df5939f1..5399288dfc5fcdca07d67b2c6ff644119f200afd 100644 (file)
@@ -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)
index 0f75b6d97dcc974e7b4e7c5e3f28cf174c9725a2..1e622066da5c6982ebb4eae81737b7a2ff07d708 100644 (file)
@@ -1,3 +1,7 @@
+2018-10-17  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.c-torture/execute/pr87623.c: New test.
+
 2018-10-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        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 (file)
index 0000000..54d8b5e
--- /dev/null
@@ -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;
+}