diff mbox

RX: Add jump and loop alignment

Message ID m3zkmux0gb.fsf@redhat.com
State New
Headers show

Commit Message

Nick Clifton May 10, 2011, 11:24 a.m. UTC
Hi Guys,

  I am applying the patch below to the mainline and 4.6 branch.  It was
  created by DJ Delorie to fix a performance regression with the RX port
  of GCC, compared to the 4.5 branch.  The problem was that jumps and
  loops were not being aligned to an 8 byte boundary which can result in
  stalls whilst the instruction fetch stage fills the pipeline.

Cheers
  Nick

gcc/ChangeLog
2011-05-10  DJ Delorie  <dj@redhat.com>

	* config/rx/rx.h (JUMP_ALIGN, LABEL_ALIGN, LOOP_ALIGN): Define.
	(LABEL_ALIGN_AFTER_BARRIER): Pass label to rx_align_for_label
	* config/rx/rx.c (rx_align_for_label): Add label and
	uses_threshold parameters.  Do not align when the label is not
	used enough.
	* config/rx/rx-protos.h (rx_align_for_label): Update prototype.
diff mbox

Patch

Index: gcc/config/rx/rx.h
===================================================================
--- gcc/config/rx/rx.h	(revision 173608)
+++ gcc/config/rx/rx.h	(working copy)
@@ -617,7 +617,13 @@ 
 
 #define SELECT_CC_MODE(OP,X,Y)  rx_select_cc_mode((OP), (X), (Y))
 
-#define LABEL_ALIGN_AFTER_BARRIER(x)		rx_align_for_label ()
+/* Compute the alignment needed for label X in various situations.
+   If the user has specified an alignment then honour that, otherwise
+   use rx_align_for_label.  */
+#define JUMP_ALIGN(x)				(align_jumps ? align_jumps : rx_align_for_label (x, 0))
+#define LABEL_ALIGN(x)				(align_labels ? align_labels : rx_align_for_label (x, 3))
+#define LOOP_ALIGN(x)				(align_loops ? align_loops : rx_align_for_label (x, 2))
+#define LABEL_ALIGN_AFTER_BARRIER(x)		rx_align_for_label (x, 0)
 
 #define ASM_OUTPUT_MAX_SKIP_ALIGN(STREAM, LOG, MAX_SKIP)	\
   do						\
Index: gcc/config/rx/rx-protos.h
===================================================================
--- gcc/config/rx/rx-protos.h	(revision 173608)
+++ gcc/config/rx/rx-protos.h	(working copy)
@@ -30,7 +30,7 @@ 
 extern int		rx_initial_elimination_offset (int, int);
 
 #ifdef RTX_CODE
-extern int 		rx_align_for_label (void);
+extern int 		rx_align_for_label (rtx, int);
 extern void             rx_emit_stack_popm (rtx *, bool);
 extern void             rx_emit_stack_pushm (rtx *);
 extern void		rx_expand_epilogue (bool);
Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c	(revision 173608)
+++ gcc/config/rx/rx.c	(working copy)
@@ -2752,8 +2752,15 @@ 
 
 
 int
-rx_align_for_label (void)
+rx_align_for_label (rtx lab, int uses_threshold)
 {
+  /* This is a simple heuristic to guess when an alignment would not be useful
+     because the delay due to the inserted NOPs would be greater than the delay
+     due to the misaligned branch.  If uses_threshold is zero then the alignment
+     is always useful.  */
+  if (LABEL_NUSES (lab) < uses_threshold)
+    return 0;
+
   return optimize_size ? 1 : 3;
 }