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 <d...@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. 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; }