--- gcc/fold-const.c
+++ gcc/fold-const.c
@@ -12461,6 +12461,7 @@ fold_binary_loc (location_t loc,
/* Turn (a OP c1) OP c2 into a OP (c1+c2). */
if (TREE_CODE (op0) == code && host_integerp (arg1, false)
+ && TREE_CODE (type) != VECTOR_TYPE
&& TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
&& host_integerp (TREE_OPERAND (arg0, 1), false)
&& TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
@@ -12491,6 +12492,7 @@ fold_binary_loc (location_t loc,
|| (TYPE_UNSIGNED (type)
&& code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
&& host_integerp (arg1, false)
+ && TREE_CODE (type) != VECTOR_TYPE
&& TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
&& host_integerp (TREE_OPERAND (arg0, 1), false)
&& TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
@@ -12513,7 +12515,8 @@ fold_binary_loc (location_t loc,
/* Rewrite an LROTATE_EXPR by a constant into an
RROTATE_EXPR by a new constant. */
- if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
+ if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
+ && TREE_CODE (type) != VECTOR_TYPE)
{
tree tem = build_int_cst (TREE_TYPE (arg1),
TYPE_PRECISION (type));
@@ -12538,6 +12541,7 @@ fold_binary_loc (location_t loc,
/* Two consecutive rotates adding up to the precision of the
type can be ignored. */
if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
+ && TREE_CODE (type) != VECTOR_TYPE
&& TREE_CODE (arg0) == RROTATE_EXPR
&& TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
&& TREE_INT_CST_HIGH (arg1) == 0