[PATCH][SH] Fix ICE in find_dead_or_set_registers

2012-07-19 Thread Christian Bruel
This is a SH regression on the 4.7 and trunk while building Webkit
(pre-processed file size is about 2.2Mb :-)

A far branch to a return rtx produces an ICE in
find_dead_or_set_registers at line resource.c:497:

next = JUMP_LABEL (this_jump_insn);
if (ANY_RETURN_P (next)) - next is null
 next = NULL_RTX;

Turns out that JUMP_LABEL was not set after gen_return in
sh.c:gen_far_branch.

This patch fixes this. Tested for sh4-linux

OK for 4.7 and trunk ?

thanks

Christian
2012-07-19  Christian Bruel  christian.br...@st.com

	* config/sh/sh.c (gen_far_branch): Set JUMP_LABEL for return jumps.

Index: gcc/config/sh/sh.c
===
--- gcc/config/sh/sh.c	(revision 189613)
+++ gcc/config/sh/sh.c	(working copy)
@@ -5304,6 +5304,7 @@
 }
   else
 jump = emit_jump_insn_after (gen_return (), insn);
+
   /* Emit a barrier so that reorg knows that any following instructions
  are not reachable via a fall-through path.
  But don't do this when not optimizing, since we wouldn't suppress the
@@ -5312,7 +5313,16 @@
   if (optimize)
 emit_barrier_after (jump);
   emit_label_after (bp-near_label, insn);
+
+  if (bp-far_label)
   JUMP_LABEL (jump) = bp-far_label;
+  else
+{
+  rtx pat = PATTERN (jump);
+  gcc_assert (ANY_RETURN_P (pat));
+  JUMP_LABEL (jump) = pat;
+}
+
   ok = invert_jump (insn, label, 1);
   gcc_assert (ok);
   


Re: [PATCH][SH] Fix ICE in find_dead_or_set_registers

2012-07-19 Thread Steven Bosscher
On Thu, Jul 19, 2012 at 10:38 AM, Christian Bruel
christian.br...@st.com wrote:
 This is a SH regression on the 4.7 and trunk while building Webkit
 (pre-processed file size is about 2.2Mb :-)

http://gcc.gnu.org/wiki/A_guide_to_testcase_reduction

Ciao!
Steven


Re: [PATCH][SH] Fix ICE in find_dead_or_set_registers

2012-07-19 Thread Kaz Kojima
Christian Bruel christian.br...@st.com wrote:
 This is a SH regression on the 4.7 and trunk while building Webkit
 (pre-processed file size is about 2.2Mb :-)
 
 A far branch to a return rtx produces an ICE in
 find_dead_or_set_registers at line resource.c:497:
 
 next = JUMP_LABEL (this_jump_insn);
 if (ANY_RETURN_P (next)) - next is null
  next = NULL_RTX;
 
 Turns out that JUMP_LABEL was not set after gen_return in
 sh.c:gen_far_branch.
 
 This patch fixes this. Tested for sh4-linux
 
 OK for 4.7 and trunk ?

 +  if (bp-far_label)
JUMP_LABEL (jump) = bp-far_label;

The 2nd line should be indented.  OK with that change.
Thanks for fixing this!

Regards,
kaz


Re: [PATCH][SH] Fix ICE in find_dead_or_set_registers

2012-07-19 Thread Christian Bruel
On 07/19/2012 11:14 AM, Steven Bosscher wrote:
 On Thu, Jul 19, 2012 at 10:38 AM, Christian Bruel
 christian.br...@st.com wrote:
 This is a SH regression on the 4.7 and trunk while building Webkit
 (pre-processed file size is about 2.2Mb :-)
 
 http://gcc.gnu.org/wiki/A_guide_to_testcase_reduction

The 2.2Mb file is already preprocessed and cleaned-up. It's c++ and the
many inlined functions are necessary to contribute to the final IR in
which the far jump exposes. Moving around code, by dichotomy or other
core removal techniques is not enough to reduce the problem in a small
enough test.

no problem to attach it to a new bugzilla before committing the fix.

Thanks

Christian


 
 Ciao!
 Steven
 



Re: [PATCH][SH] Fix ICE in find_dead_or_set_registers

2012-07-19 Thread Christian Bruel


On 07/19/2012 12:35 PM, Kaz Kojima wrote:
 Christian Bruel christian.br...@st.com wrote:
 This is a SH regression on the 4.7 and trunk while building Webkit
 (pre-processed file size is about 2.2Mb :-)

 A far branch to a return rtx produces an ICE in
 find_dead_or_set_registers at line resource.c:497:

 next = JUMP_LABEL (this_jump_insn);
 if (ANY_RETURN_P (next)) - next is null
  next = NULL_RTX;

 Turns out that JUMP_LABEL was not set after gen_return in
 sh.c:gen_far_branch.

 This patch fixes this. Tested for sh4-linux

 OK for 4.7 and trunk ?
 
 +  if (bp-far_label)
JUMP_LABEL (jump) = bp-far_label;
 
 The 2nd line should be indented.  OK with that change.
 Thanks for fixing this!

thanks. the missing indentation was a diff artifact. I'll also add the
PR reference to the changelog entry

 
 Regards,
   kaz