From 52d8441318ecc69f8b63e6d2b595034f8245662f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 17 May 2013 10:31:32 +0200 Subject: [PATCH] re PR tree-optimization/57051 (Optimization regression in 4.8.0 from 4.7.2) PR tree-optimization/57051 * fold-const.c (const_binop) : Fix BYTES_BIG_ENDIAN handling. From-SVN: r199002 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e47c76046c9..e537c4bd009 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-05-17 Jakub Jelinek + + PR tree-optimization/57051 + * fold-const.c (const_binop) : Fix BYTES_BIG_ENDIAN handling. + 2013-05-16 Nick Clifton * config/rl78/rl78.c (rl78_attribute_table): Add naked. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 97b5216eb71..a2b7ac18312 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++)