From af4c82ed94434ca16d03b575be97c813c371b3a9 Mon Sep 17 00:00:00 2001 From: Seongbae Park Date: Mon, 18 Jun 2007 20:02:33 +0000 Subject: [PATCH] re PR rtl-optimization/32339 (ICE in insert_save, at caller-save.c:726) gcc/ChangeLog: 2007-06-18 Seongbae Park PR rtl-optimization/32339 * df-scan.c (df_uses_record): Don't modify flags but just add to it for df_ref_record. gcc/testsuite/ChangeLog: 2007-06-18 Martin Michlmayr PR rtl-optimization/32339 * gcc.c-torture/compile/pr32339.c: New test. From-SVN: r125825 --- gcc/ChangeLog | 6 +++++ gcc/gcse.c | 25 +++++++++++-------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/compile/pr32339.c | 17 +++++++++++++ 4 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr32339.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 191d3474eb2..606632d5e2f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-06-18 Seongbae Park + + PR rtl-optimization/32339 + * df-scan.c (df_uses_record): Don't modify flags but just add to + it for df_ref_record. + 2007-06-18 David Daney pattern; insn = gen_move_insn (reg, SET_SRC (single_set (del))); - insn = emit_insn_after (insn, del); - - if (dump_file) - { - fprintf (dump_file, - "STORE_MOTION delete insn in BB %d:\n ", bb->index); - print_inline_rtx (dump_file, del, 6); - fprintf (dump_file, "\nSTORE MOTION replaced with insn:\n "); - print_inline_rtx (dump_file, insn, 6); - fprintf (dump_file, "\n"); - } for (ptr = ANTIC_STORE_LIST (smexpr); ptr; ptr = XEXP (ptr, 1)) if (XEXP (ptr, 0) == del) @@ -6379,6 +6368,20 @@ replace_store_insn (rtx reg, rtx del, basic_block bb, struct ls_expr *smexpr) XEXP (note, 0) = insn; } + /* Emit the insn AFTER all the notes are transferred. + This is cheaper since we avoid df rescanning for the note change. */ + insn = emit_insn_after (insn, del); + + if (dump_file) + { + fprintf (dump_file, + "STORE_MOTION delete insn in BB %d:\n ", bb->index); + print_inline_rtx (dump_file, del, 6); + fprintf (dump_file, "\nSTORE MOTION replaced with insn:\n "); + print_inline_rtx (dump_file, insn, 6); + fprintf (dump_file, "\n"); + } + delete_insn (del); /* Now we must handle REG_EQUAL notes whose contents is equal to the mem; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7550286b7a0..b864722701b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-06-18 Martin Michlmayr + + PR rtl-optimization/32339 + * gcc.c-torture/compile/pr32339.c: New test. + 2007-06-18 Kenneth Zadeck * gcc.c-torture/compile/pr32355.c: New testcase. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr32339.c b/gcc/testsuite/gcc.c-torture/compile/pr32339.c new file mode 100644 index 00000000000..5aca6e41538 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr32339.c @@ -0,0 +1,17 @@ +/* We used to ICE in insert_save at caller-save.c, + due to missing REG_DEAD for register use in post-decrement on ia64. */ +struct city_dialog +{ + struct city *pcity; + char change_list_names[200][200]; + int change_list_ids[200]; +}; +change_callback (void) +{ + struct city_dialog *pdialog; + int n; + int i; + get_city_dialog_production_full (pdialog->change_list_names[n], + pdialog->pcity); + pdialog->change_list_ids[n++] = i; +} -- 2.30.2