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.

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)

Reply via email to