Patchwork [MIPS] Fix thinko in insn length calculation

login
register
mail settings
Submitter Eric Botcazou
Date Nov. 20, 2010, 6:19 p.m.
Message ID <201011201919.27718.ebotcazou@adacore.com>
Download mbox | patch
Permalink /patch/72357/
State New
Headers show

Comments

Eric Botcazou - Nov. 20, 2010, 6:19 p.m.
Hi,

we're having "Branch out of range" messages from GAS on IRIX with our GCC 4.5 
based compiler.  It turns out that there is a thinko (aka Ariane V syndrome) 
in the new insn length calculation code: some lengths are measured in insns 
while others are measured in bytes.

Bootstrapped C/Ada and tested against our internal testsuite.  OK for mainline 
and 4.5 branch?


2010-11-20  Eric Botcazou  <ebotcazou@adacore.com>

	* config/mips/mips.c (machine_function): Rename load_label_length to
	load_label_num_insns.
	(mips_load_label_length): Rename to...
	(mips_load_label_num_insns): ...this.  Adjust to first renaming.
	(mips_adjust_insn_length): Adjust to second renaming.  Fix thinko.
Richard Sandiford - Nov. 21, 2010, 10:18 a.m.
Eric Botcazou <ebotcazou@adacore.com> writes:
> 2010-11-20  Eric Botcazou  <ebotcazou@adacore.com>
>
> 	* config/mips/mips.c (machine_function): Rename load_label_length to
> 	load_label_num_insns.
> 	(mips_load_label_length): Rename to...
> 	(mips_load_label_num_insns): ...this.  Adjust to first renaming.
> 	(mips_adjust_insn_length): Adjust to second renaming.  Fix thinko.

OK, thanks.

Richard

Patch

Index: config/mips/mips.c
===================================================================
--- config/mips/mips.c	(revision 166973)
+++ config/mips/mips.c	(working copy)
@@ -346,7 +346,7 @@  struct GTY(())  machine_function {
 
   /* How many instructions it takes to load a label into $AT, or 0 if
      this property hasn't yet been calculated.  */
-  unsigned int load_label_length;
+  unsigned int load_label_num_insns;
 
   /* True if mips_adjust_insn_length should ignore an instruction's
      hazard attribute.  */
@@ -11275,14 +11275,14 @@  mips_process_load_label (rtx target)
 /* Return the number of instructions needed to load a label into $AT.  */
 
 static unsigned int
-mips_load_label_length (void)
+mips_load_label_num_insns (void)
 {
-  if (cfun->machine->load_label_length == 0)
+  if (cfun->machine->load_label_num_insns == 0)
     {
       mips_process_load_label (pc_rtx);
-      cfun->machine->load_label_length = mips_multi_num_insns;
+      cfun->machine->load_label_num_insns = mips_multi_num_insns;
     }
-  return cfun->machine->load_label_length;
+  return cfun->machine->load_label_num_insns;
 }
 
 /* Emit an asm sequence to start a noat block and load the address
@@ -11324,7 +11324,7 @@  mips_adjust_insn_length (rtx insn, int l
 
       /* Load the label into $AT and jump to it.  Ignore the delay
 	 slot of the jump.  */
-      length += mips_load_label_length () + 4;
+      length += 4 * mips_load_label_num_insns() + 4;
     }
 
   /* A unconditional jump has an unfilled delay slot if it is not part