]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/57051 (Optimization regression in 4.8.0 from 4.7.2)
authorJakub Jelinek <jakub@redhat.com>
Fri, 17 May 2013 08:31:32 +0000 (10:31 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 17 May 2013 08:31:32 +0000 (10:31 +0200)
PR tree-optimization/57051
* fold-const.c (const_binop) <case VEC_LSHIFT_EXPR,
case VEC_RSHIFT_EXPR>: Fix BYTES_BIG_ENDIAN handling.

From-SVN: r199002

gcc/ChangeLog
gcc/fold-const.c

index e47c76046c906675bff33e6de7ff58b9c2ca2e47..e537c4bd00991d208bca117d5ff4f51f5fa211f3 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/57051
+       * fold-const.c (const_binop) <case VEC_LSHIFT_EXPR,
+       case VEC_RSHIFT_EXPR>: Fix BYTES_BIG_ENDIAN handling.
+
 2013-05-16  Nick Clifton  <nickc@redhat.com>
 
        * config/rl78/rl78.c (rl78_attribute_table): Add naked.
index 97b5216eb7115b032d8a2c6f3983b55aca96b346..a2b7ac183126ec6d28afcef4ecea6ca5068809a0 100644 (file)
@@ -1393,7 +1393,11 @@ const_binop (enum tree_code code, tree arg1, tree arg2)
          if (shiftc >= outerc || (shiftc % innerc) != 0)
            return NULL_TREE;
          int offset = shiftc / innerc;
-         if (code == VEC_LSHIFT_EXPR)
+         /* The direction of VEC_[LR]SHIFT_EXPR is endian dependent.
+            For reductions, compiler emits VEC_RSHIFT_EXPR always,
+            for !BYTES_BIG_ENDIAN picks first vector element, but
+            for BYTES_BIG_ENDIAN last element from the vector.  */
+         if ((code == VEC_RSHIFT_EXPR) ^ (!BYTES_BIG_ENDIAN))
            offset = -offset;
          tree zero = build_zero_cst (TREE_TYPE (type));
          for (i = 0; i < count; i++)