[partial backport of gcc-4.9/trunk r198772, adds build_minus_one_cst needed by PR57980 fix ] gcc/ 2013-05-10 Marc Glisse * tree.c (build_minus_one_cst): New function. * tree.h (build_minus_one_cst): Declare new function. --- gcc-4.8.1/gcc/tree.c.~1~ 2013-05-23 15:25:23.000000000 +0200 +++ gcc-4.8.1/gcc/tree.c 2013-08-10 12:36:59.701381382 +0200 @@ -1619,6 +1619,45 @@ build_one_cst (tree type) } } +/* Return a constant of arithmetic type TYPE which is the + opposite of the multiplicative identity of the set TYPE. */ + +tree +build_minus_one_cst (tree type) +{ + switch (TREE_CODE (type)) + { + case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE: + case POINTER_TYPE: case REFERENCE_TYPE: + case OFFSET_TYPE: + return build_int_cst (type, -1); + + case REAL_TYPE: + return build_real (type, dconstm1); + + case FIXED_POINT_TYPE: + /* We can only generate 1 for accum types. */ + gcc_assert (ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type))); + return build_fixed (type, fixed_from_double_int (double_int_minus_one, + TYPE_MODE (type))); + + case VECTOR_TYPE: + { + tree scalar = build_minus_one_cst (TREE_TYPE (type)); + + return build_vector_from_val (type, scalar); + } + + case COMPLEX_TYPE: + return build_complex (type, + build_minus_one_cst (TREE_TYPE (type)), + build_zero_cst (TREE_TYPE (type))); + + default: + gcc_unreachable (); + } +} + /* Build 0 constant of type TYPE. This is used by constructor folding and thus the constant should be represented in memory by zero(es). */ --- gcc-4.8.1/gcc/tree.h.~1~ 2013-05-23 15:25:23.000000000 +0200 +++ gcc-4.8.1/gcc/tree.h 2013-08-10 12:36:58.081384429 +0200 @@ -4760,6 +4760,7 @@ extern tree build_constructor_from_list extern tree build_real_from_int_cst (tree, const_tree); extern tree build_complex (tree, tree, tree); extern tree build_one_cst (tree); +extern tree build_minus_one_cst (tree); extern tree build_zero_cst (tree); extern tree build_string (int, const char *); extern tree build_tree_list_stat (tree, tree MEM_STAT_DECL);