]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/87623 (bytes swapped in register when comparing cause fail when...
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 17 Oct 2018 17:54:26 +0000 (17:54 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 17 Oct 2018 17:54:26 +0000 (17:54 +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: r265245

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr87623.c [new file with mode: 0644]

index 08148ea61e05adb9dafb6acdf9a6dd0382feabeb..39212a72bf97e9d7d89ba3d489d2d8239a9dbb7a 100644 (file)
@@ -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
index 13d27d7fb94549683b700de614e209693dd5edee..94b9a21bd3023a845f4ce477729d8ff3abd3263e 100644 (file)
@@ -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)
index 07ad379a64a14c31b67d49577b5e55ee4fed6a3f..51daecf179f820471ea7f8f049e0ce0c1c6a2b5d 100644 (file)
@@ -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 (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;
+}