On 16 June 2016 at 14:56, Jan Hubicka <[email protected]> wrote:
> Hi,
> tree_estimate_loop_size contains one extra else that prevents it from
> determining
> that the induction variable comparsion is going to be eliminated in both the
> peeled
> copies as well as the last copy. This patch fixes it
> (it really removes one else, but need to reformat the conditional)
>
> Bootstrapped/regtested x86_64-linux, comitted.
>
> Honza
>
> * g++.dg/vect/pr36648.cc: Disable cunrolli
> * tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Fix estimation
> of comparsions in the last iteration.
Hi,
This patch makes
FAIL: gcc.target/arm/unsigned-extend-2.c scan-assembler ands
on arm-none-linux-gnueabi --with-cpu=cortex-a9
Christophe
> Index: testsuite/g++.dg/vect/pr36648.cc
> ===================================================================
> --- testsuite/g++.dg/vect/pr36648.cc (revision 237477)
> +++ testsuite/g++.dg/vect/pr36648.cc (working copy)
> @@ -1,4 +1,5 @@
> /* { dg-require-effective-target vect_float } */
> +// { dg-additional-options "-fdisable-tree-cunrolli" }
>
> struct vector
> {
> Index: tree-ssa-loop-ivcanon.c
> ===================================================================
> --- tree-ssa-loop-ivcanon.c (revision 237477)
> +++ tree-ssa-loop-ivcanon.c (working copy)
> @@ -255,69 +255,73 @@ tree_estimate_loop_size (struct loop *lo
>
> /* Look for reasons why we might optimize this stmt away. */
>
> - if (gimple_has_side_effects (stmt))
> - ;
> - /* Exit conditional. */
> - else if (exit && body[i] == exit->src
> - && stmt == last_stmt (exit->src))
> + if (!gimple_has_side_effects (stmt))
> {
> - if (dump_file && (dump_flags & TDF_DETAILS))
> - fprintf (dump_file, " Exit condition will be eliminated "
> - "in peeled copies.\n");
> - likely_eliminated_peeled = true;
> - }
> - else if (edge_to_cancel && body[i] == edge_to_cancel->src
> - && stmt == last_stmt (edge_to_cancel->src))
> - {
> - if (dump_file && (dump_flags & TDF_DETAILS))
> - fprintf (dump_file, " Exit condition will be eliminated "
> - "in last copy.\n");
> - likely_eliminated_last = true;
> - }
> - /* Sets of IV variables */
> - else if (gimple_code (stmt) == GIMPLE_ASSIGN
> - && constant_after_peeling (gimple_assign_lhs (stmt), stmt,
> loop))
> - {
> - if (dump_file && (dump_flags & TDF_DETAILS))
> - fprintf (dump_file, " Induction variable computation will"
> - " be folded away.\n");
> - likely_eliminated = true;
> - }
> - /* Assignments of IV variables. */
> - else if (gimple_code (stmt) == GIMPLE_ASSIGN
> - && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
> - && constant_after_peeling (gimple_assign_rhs1 (stmt), stmt,
> - loop)
> - && (gimple_assign_rhs_class (stmt) != GIMPLE_BINARY_RHS
> - || constant_after_peeling (gimple_assign_rhs2 (stmt),
> - stmt, loop)))
> - {
> - size->constant_iv = true;
> - if (dump_file && (dump_flags & TDF_DETAILS))
> - fprintf (dump_file,
> - " Constant expression will be folded away.\n");
> - likely_eliminated = true;
> - }
> - /* Conditionals. */
> - else if ((gimple_code (stmt) == GIMPLE_COND
> - && constant_after_peeling (gimple_cond_lhs (stmt), stmt,
> - loop)
> - && constant_after_peeling (gimple_cond_rhs (stmt), stmt,
> - loop)
> - /* We don't simplify all constant compares so make sure
> - they are not both constant already. See PR70288. */
> - && (! is_gimple_min_invariant (gimple_cond_lhs (stmt))
> - || ! is_gimple_min_invariant (gimple_cond_rhs
> (stmt))))
> - || (gimple_code (stmt) == GIMPLE_SWITCH
> - && constant_after_peeling (gimple_switch_index (
> - as_a <gswitch *> (stmt)),
> + /* Exit conditional. */
> + if (exit && body[i] == exit->src
> + && stmt == last_stmt (exit->src))
> + {
> + if (dump_file && (dump_flags & TDF_DETAILS))
> + fprintf (dump_file, " Exit condition will be eliminated
> "
> + "in peeled copies.\n");
> + likely_eliminated_peeled = true;
> + }
> + if (edge_to_cancel && body[i] == edge_to_cancel->src
> + && stmt == last_stmt (edge_to_cancel->src))
> + {
> + if (dump_file && (dump_flags & TDF_DETAILS))
> + fprintf (dump_file, " Exit condition will be eliminated
> "
> + "in last copy.\n");
> + likely_eliminated_last = true;
> + }
> + /* Sets of IV variables */
> + if (gimple_code (stmt) == GIMPLE_ASSIGN
> + && constant_after_peeling (gimple_assign_lhs (stmt), stmt,
> loop))
> + {
> + if (dump_file && (dump_flags & TDF_DETAILS))
> + fprintf (dump_file, " Induction variable computation
> will"
> + " be folded away.\n");
> + likely_eliminated = true;
> + }
> + /* Assignments of IV variables. */
> + else if (gimple_code (stmt) == GIMPLE_ASSIGN
> + && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
> + && constant_after_peeling (gimple_assign_rhs1 (stmt),
> stmt, loop)
> - && ! is_gimple_min_invariant
> - (gimple_switch_index (as_a <gswitch *>
> (stmt)))))
> - {
> - if (dump_file && (dump_flags & TDF_DETAILS))
> - fprintf (dump_file, " Constant conditional.\n");
> - likely_eliminated = true;
> + && (gimple_assign_rhs_class (stmt) != GIMPLE_BINARY_RHS
> + || constant_after_peeling (gimple_assign_rhs2
> (stmt),
> + stmt, loop)))
> + {
> + size->constant_iv = true;
> + if (dump_file && (dump_flags & TDF_DETAILS))
> + fprintf (dump_file,
> + " Constant expression will be folded away.\n");
> + likely_eliminated = true;
> + }
> + /* Conditionals. */
> + else if ((gimple_code (stmt) == GIMPLE_COND
> + && constant_after_peeling (gimple_cond_lhs (stmt),
> stmt,
> + loop)
> + && constant_after_peeling (gimple_cond_rhs (stmt),
> stmt,
> + loop)
> + /* We don't simplify all constant compares so make
> sure
> + they are not both constant already. See PR70288.
> */
> + && (! is_gimple_min_invariant (gimple_cond_lhs (stmt))
> + || ! is_gimple_min_invariant
> + (gimple_cond_rhs (stmt))))
> + || (gimple_code (stmt) == GIMPLE_SWITCH
> + && constant_after_peeling (gimple_switch_index (
> + as_a <gswitch *>
> + (stmt)),
> + stmt, loop)
> + && ! is_gimple_min_invariant
> + (gimple_switch_index
> + (as_a <gswitch *> (stmt)))))
> + {
> + if (dump_file && (dump_flags & TDF_DETAILS))
> + fprintf (dump_file, " Constant conditional.\n");
> + likely_eliminated = true;
> + }
> }
>
> size->overall += num;