From 4cb0fdbca0dbe3841b2e82a712895324c058554c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 11 Feb 2012 09:00:42 +0000 Subject: [PATCH] re PR rtl-optimization/52175 (ICE in maybe_record_trace_start after invalid dbr_schedule transformation) gcc/ PR rtl-optimization/52175 * reorg.c (fill_slots_from_thread): Don't apply add/sub optimization to frame-related instructions. gcc/testsuite/ PR rtl-optimization/52175 * gcc.c-torture/compile/pr52175.c: New test. From-SVN: r184128 --- gcc/ChangeLog | 6 +++++ gcc/reorg.c | 1 + gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/compile/pr52175.c | 25 +++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr52175.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9dce4240230..b9af7109b40 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-02-11 Richard Sandiford + + PR rtl-optimization/52175 + * reorg.c (fill_slots_from_thread): Don't apply add/sub optimization + to frame-related instructions. + 2012-02-10 Jason Merrill PR c++/51910 diff --git a/gcc/reorg.c b/gcc/reorg.c index 3fa53939d5e..dfc9747c5f7 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -2937,6 +2937,7 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread, if (delay_list == 0 && likely && new_thread && !ANY_RETURN_P (new_thread) && NONJUMP_INSN_P (new_thread) + && !RTX_FRAME_RELATED_P (new_thread) && GET_CODE (PATTERN (new_thread)) != ASM_INPUT && asm_noperands (PATTERN (new_thread)) < 0) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 812cee10c3b..03fba5450dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-02-11 Richard Sandiford + + PR rtl-optimization/52175 + * gcc.c-torture/compile/pr52175.c: New test. + 2012-02-10 Jason Merrill PR c++/51910 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr52175.c b/gcc/testsuite/gcc.c-torture/compile/pr52175.c new file mode 100644 index 00000000000..e0aed77044d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr52175.c @@ -0,0 +1,25 @@ +void bad (void); +char *foo (char *src, char **last) +{ + char *dst; + int ch; + dst = src = (src ? src : *last); + + if (*src == 0) + return 0; + + while (src[0]) + { + if (!src[1]) + { + bad (); + break; + } + *dst = *src; + dst += 1; + src += 2; + } + *last = src; + *dst = 0; + return *last; +}