aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-05-17 10:31:32 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2013-05-17 10:31:32 +0200
commit52d8441318ecc69f8b63e6d2b595034f8245662f (patch)
treefa001879de1e1721e6e595c1a4a3c784b7c0e612
parent17b962bd33aa88fbe170ffd67a5273d56350066e (diff)
downloadgcc-52d8441318ecc69f8b63e6d2b595034f8245662f.zip
gcc-52d8441318ecc69f8b63e6d2b595034f8245662f.tar.gz
gcc-52d8441318ecc69f8b63e6d2b595034f8245662f.tar.bz2
re PR tree-optimization/57051 (Optimization regression in 4.8.0 from 4.7.2)
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c6
2 files changed, 11 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e47c760..e537c4b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 97b5216..a2b7ac1 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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++)