From 6e74642b2c37305436269a8c036f1519b4c8c111 Mon Sep 17 00:00:00 2001 From: Steven Bosscher Date: Sun, 14 Oct 2012 19:29:18 +0000 Subject: [PATCH] re PR rtl-optimization/54919 (gcc.dg/torture/pr54877.c FAILs with -fvariable-expansion-in-unroller) gcc/ PR rtl-optimization/54919 * loop-unroll.c (struct var_to_expand): Remove accum_pos field. (analyze_insn_to_expand_var): Do not record accum_pos. (expand_var_during_unrolling): Use validate_replace_rtx_group to perform replacement of all references to SET_DEST (set) with the new register, including references in REG_EQUAL notes. (insert_var_expansion_initialization): Insert initializatio insns at the bottom of the pre-header of the loop. testsuite/ PR rtl-optimization/54919 * gcc.dg/pr54919.c: New testcase. From-SVN: r192439 --- gcc/ChangeLog | 13 ++++++++++++- gcc/loop-unroll.c | 17 +++-------------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr54919.c | 27 +++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr54919.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a50d9d305c0..d043064bdc6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2012-10-14 Steven Bosscher + + PR rtl-optimization/54919 + * loop-unroll.c (struct var_to_expand): Remove accum_pos field. + (analyze_insn_to_expand_var): Do not record accum_pos. + (expand_var_during_unrolling): Use validate_replace_rtx_group to + perform replacement of all references to SET_DEST (set) with the + new register, including references in REG_EQUAL notes. + (insert_var_expansion_initialization): Insert initializatio insns + at the bottom of the pre-header of the loop. + 2012-10-14 Jan Hubicka * tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop): Do not @@ -19034,7 +19045,7 @@ 2012-04-26 Bernd Schmidt - * PR middle-end/52997 + PR middle-end/52997 * ira.c (find_moveable_pseudos): Call resize_reg_info. PR middle-end/52940 diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index 5350ee08815..0dd8b0a9d5c 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -100,10 +100,6 @@ struct var_to_expand the accumulator. If REUSE_EXPANSION is 0 reuse the original accumulator. Else use var_expansions[REUSE_EXPANSION - 1]. */ - unsigned accum_pos; /* The position in which the accumulator is placed in - the insn src. For example in x = x + something - accum_pos is 0 while in x = something + x accum_pos - is 1. */ }; /* Information about optimization applied in @@ -1763,7 +1759,6 @@ analyze_insn_to_expand_var (struct loop *loop, rtx insn) ves->op = GET_CODE (src); ves->expansion_count = 0; ves->reuse_expansion = 0; - ves->accum_pos = accum_pos; return ves; } @@ -2123,9 +2118,7 @@ expand_var_during_unrolling (struct var_to_expand *ve, rtx insn) else new_reg = get_expansion (ve); - validate_change (insn, &SET_DEST (set), new_reg, 1); - validate_change (insn, &XEXP (SET_SRC (set), ve->accum_pos), new_reg, 1); - + validate_replace_rtx_group (SET_DEST (set), new_reg, insn); if (apply_change_group ()) if (really_new_expansion) { @@ -2165,7 +2158,7 @@ static void insert_var_expansion_initialization (struct var_to_expand *ve, basic_block place) { - rtx seq, var, zero_init, insn; + rtx seq, var, zero_init; unsigned i; enum machine_mode mode = GET_MODE (ve->reg); bool honor_signed_zero_p = HONOR_SIGNED_ZEROS (mode); @@ -2205,11 +2198,7 @@ insert_var_expansion_initialization (struct var_to_expand *ve, seq = get_insns (); end_sequence (); - insn = BB_HEAD (place); - while (!NOTE_INSN_BASIC_BLOCK_P (insn)) - insn = NEXT_INSN (insn); - - emit_insn_after (seq, insn); + emit_insn_after (seq, BB_END (place)); } /* Combine the variable expansions at the loop exit. PLACE is the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f8b04d2d5dc..6a61bb96957 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-10-14 Steven Bosscher + + PR rtl-optimization/54919 + * gcc.dg/pr54919.c: New testcase. + 2012-10-14 Paolo Carlini PR c++/53581 diff --git a/gcc/testsuite/gcc.dg/pr54919.c b/gcc/testsuite/gcc.dg/pr54919.c new file mode 100644 index 00000000000..9f1affce234 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr54919.c @@ -0,0 +1,27 @@ +/* PR tree-optimization/54919 */ +/* Testcase by Zdenek Sojka */ + +/* { dg-do run } */ +/* { dg-options "-O3 -ffast-math -funroll-loops -fvariable-expansion-in-unroller" } */ + +int a[10]; +extern void abort(void) __attribute__((noreturn)); + +int __attribute__((__noinline__, __noclone__)) +foo (void) +{ + double d; + int i; + for (i = 0, d = 0; i < 64; i++) + d--; + return (int) d; +} + +int +main (void) +{ + if (foo () != -64) + abort (); + return 0; +} +