diff options
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ba9b013..8166070 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -1415,8 +1415,7 @@ const_binop (enum tree_code code, tree arg1, tree arg2) int count = TYPE_VECTOR_SUBPARTS (type), i; tree *elts = XALLOCAVEC (tree, count); - if (code == VEC_LSHIFT_EXPR - || code == VEC_RSHIFT_EXPR) + if (code == VEC_RSHIFT_EXPR) { if (!tree_fits_uhwi_p (arg2)) return NULL_TREE; @@ -1428,11 +1427,10 @@ const_binop (enum tree_code code, tree arg1, tree arg2) if (shiftc >= outerc || (shiftc % innerc) != 0) return NULL_TREE; int offset = shiftc / innerc; - /* 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)) + /* The direction of VEC_RSHIFT_EXPR is endian dependent. + For reductions, if !BYTES_BIG_ENDIAN then compiler picks first + vector element, but last element if BYTES_BIG_ENDIAN. */ + if (BYTES_BIG_ENDIAN) offset = -offset; tree zero = build_zero_cst (TREE_TYPE (type)); for (i = 0; i < count; i++) |