David Coppa wrote:
> On Wed, May 25, 2016 at 1:18 PM, David Coppa <[email protected]> wrote:
> > On Tue, 24 May 2016, Stefan Kempf wrote:
> >
> >> Hmm, looking closer at your bugzilla link, this somewhat larger diff
> >> should also fix the same problem, but it was committed against GPLv2
> >> sources.
> >> Still need to try it though.
> >>
> >> https://gcc.gnu.org/ml/gcc-patches/2006-11/msg00206.html
> >
> > The larger diff works as well, just tested.
> >
> > Here's an adaptation for our tree:
>
> Just did a 'make build' using the patched gcc: no problems encountered.
Given no other objections, this is ok stefan@
> Cheers!
> David
>
> > Index: gnu/gcc/gcc/builtins.c
> > ===================================================================
> > RCS file: /cvs/src/gnu/gcc/gcc/builtins.c,v
> > retrieving revision 1.7
> > diff -u -p -u -p -r1.7 builtins.c
> > --- gnu/gcc/gcc/builtins.c 28 Dec 2013 02:27:08 -0000 1.7
> > +++ gnu/gcc/gcc/builtins.c 25 May 2016 10:45:39 -0000
> > @@ -8614,13 +8614,8 @@ fold_builtin_isascii (tree arglist)
> > arg = build2 (BIT_AND_EXPR, integer_type_node, arg,
> > build_int_cst (NULL_TREE,
> > ~ (unsigned HOST_WIDE_INT) 0x7f));
> > - arg = fold_build2 (EQ_EXPR, integer_type_node,
> > - arg, integer_zero_node);
> > -
> > - if (in_gimple_form && !TREE_CONSTANT (arg))
> > - return NULL_TREE;
> > - else
> > - return arg;
> > + return fold_build2 (EQ_EXPR, integer_type_node,
> > + arg, integer_zero_node);
> > }
> > }
> >
> > @@ -8663,12 +8658,8 @@ fold_builtin_isdigit (tree arglist)
> > arg = fold_convert (unsigned_type_node, TREE_VALUE (arglist));
> > arg = build2 (MINUS_EXPR, unsigned_type_node, arg,
> > build_int_cst (unsigned_type_node, target_digit0));
> > - arg = fold_build2 (LE_EXPR, integer_type_node, arg,
> > - build_int_cst (unsigned_type_node, 9));
> > - if (in_gimple_form && !TREE_CONSTANT (arg))
> > - return NULL_TREE;
> > - else
> > - return arg;
> > + return fold_build2 (LE_EXPR, integer_type_node, arg,
> > + build_int_cst (unsigned_type_node, 9));
> > }
> > }
> >
> > Index: gnu/gcc/gcc/fold-const.c
> > ===================================================================
> > RCS file: /cvs/src/gnu/gcc/gcc/fold-const.c,v
> > retrieving revision 1.1.1.1
> > diff -u -p -u -p -r1.1.1.1 fold-const.c
> > --- gnu/gcc/gcc/fold-const.c 15 Oct 2009 17:11:28 -0000 1.1.1.1
> > +++ gnu/gcc/gcc/fold-const.c 25 May 2016 10:45:40 -0000
> > @@ -6263,11 +6263,6 @@ fold_inf_compare (enum tree_code code, t
> > return fold_build2 (neg ? GE_EXPR : LE_EXPR, type,
> > arg0, build_real (TREE_TYPE (arg0), max));
> >
> > - /* The transformation below creates non-gimple code and thus is
> > - not appropriate if we are in gimple form. */
> > - if (in_gimple_form)
> > - return NULL_TREE;
> > -
> > temp = fold_build2 (neg ? LT_EXPR : GT_EXPR, type,
> > arg0, build_real (TREE_TYPE (arg0), max));
> > return fold_build1 (TRUTH_NOT_EXPR, type, temp);
> > @@ -11215,8 +11210,7 @@ fold_binary (enum tree_code code, tree t
> > break;
> > }
> >
> > - else if (!in_gimple_form
> > - && TREE_INT_CST_HIGH (arg1) == signed_max_hi
> > + else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
> > && TREE_INT_CST_LOW (arg1) == signed_max_lo
> > && TYPE_UNSIGNED (TREE_TYPE (arg1))
> > /* signed_type does not work on pointer types. */
> > Index: gnu/gcc/gcc/tree-ssa-ccp.c
> > ===================================================================
> > RCS file: /cvs/src/gnu/gcc/gcc/tree-ssa-ccp.c,v
> > retrieving revision 1.2
> > diff -u -p -u -p -r1.2 tree-ssa-ccp.c
> > --- gnu/gcc/gcc/tree-ssa-ccp.c 28 Dec 2013 02:27:08 -0000 1.2
> > +++ gnu/gcc/gcc/tree-ssa-ccp.c 25 May 2016 10:45:40 -0000
> > @@ -2063,13 +2063,15 @@ fold_stmt_r (tree *expr_p, int *walk_sub
> > tem = fold_binary (TREE_CODE (op0), TREE_TYPE (op0),
> > TREE_OPERAND (op0, 0),
> > TREE_OPERAND (op0, 1));
> > - set = tem && is_gimple_condexpr (tem);
> > + set = tem && set_rhs (expr_p, tem);
> > fold_undefer_overflow_warnings (set, fold_stmt_r_data->stmt, 0);
> > if (set)
> > - TREE_OPERAND (expr, 0) = tem;
> > - t = expr;
> > - break;
> > + {
> > + t = *expr_p;
> > + break;
> > + }
> > }
> > + return NULL_TREE;
> >
> > default:
> > return NULL_TREE;
> > Index: gnu/gcc/gcc/tree-ssa-propagate.c
> > ===================================================================
> > RCS file: /cvs/src/gnu/gcc/gcc/tree-ssa-propagate.c,v
> > retrieving revision 1.1.1.1
> > diff -u -p -u -p -r1.1.1.1 tree-ssa-propagate.c
> > --- gnu/gcc/gcc/tree-ssa-propagate.c 15 Oct 2009 17:11:28 -0000
> > 1.1.1.1
> > +++ gnu/gcc/gcc/tree-ssa-propagate.c 25 May 2016 10:45:40 -0000
> > @@ -571,26 +571,73 @@ set_rhs (tree *stmt_p, tree expr)
> > ssa_op_iter iter;
> >
> > /* Verify the constant folded result is valid gimple. */
> > - if (TREE_CODE_CLASS (code) == tcc_binary)
> > + switch (TREE_CODE_CLASS (code))
> > {
> > + case tcc_declaration:
> > + if (!is_gimple_variable(expr))
> > + return false;
> > + break;
> > +
> > + case tcc_constant:
> > + break;
> > +
> > + case tcc_binary:
> > + case tcc_comparison:
> > if (!is_gimple_val (TREE_OPERAND (expr, 0))
> > || !is_gimple_val (TREE_OPERAND (expr, 1)))
> > return false;
> > - }
> > - else if (TREE_CODE_CLASS (code) == tcc_unary)
> > - {
> > + break;
> > +
> > + case tcc_unary:
> > if (!is_gimple_val (TREE_OPERAND (expr, 0)))
> > return false;
> > + break;
> > + case tcc_expression:
> > + switch (code)
> > + {
> > + case ADDR_EXPR:
> > + if (TREE_CODE (TREE_OPERAND (expr, 0)) == ARRAY_REF
> > + && !is_gimple_val (TREE_OPERAND (TREE_OPERAND (expr, 0), 1)))
> > + return false;
> > + break;
> > +
> > + case TRUTH_NOT_EXPR:
> > + if (!is_gimple_val (TREE_OPERAND (expr, 0)))
> > + return false;
> > + break;
> > +
> > + case TRUTH_AND_EXPR:
> > + case TRUTH_XOR_EXPR:
> > + case TRUTH_OR_EXPR:
> > + if (!is_gimple_val (TREE_OPERAND (expr, 0))
> > + || !is_gimple_val (TREE_OPERAND (expr, 1)))
> > + return false;
> > + break;
> > +
> > + case CALL_EXPR:
> > + case EXC_PTR_EXPR:
> > + case FILTER_EXPR:
> > + break;
> > +
> > + default:
> > + return false;
> > + }
> > + break;
> > +
> > + case tcc_exceptional:
> > + switch (code)
> > + {
> > + case SSA_NAME:
> > + break;
> > +
> > + default:
> > + return false;
> > + }
> > + break;
> > +
> > + default:
> > + return false;
> > }
> > - else if (code == ADDR_EXPR)
> > - {
> > - if (TREE_CODE (TREE_OPERAND (expr, 0)) == ARRAY_REF
> > - && !is_gimple_val (TREE_OPERAND (TREE_OPERAND (expr, 0), 1)))
> > - return false;
> > - }
> > - else if (code == COMPOUND_EXPR
> > - || code == MODIFY_EXPR)
> > - return false;
> >
> > if (EXPR_HAS_LOCATION (stmt)
> > && EXPR_P (expr)