summaryrefslogtreecommitdiff
path: root/gcc/config/rs6000
diff options
context:
space:
mode:
authorpthaugen <pthaugen@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-04 20:25:27 +0000
committerpthaugen <pthaugen@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-04 20:25:27 +0000
commit0683140aeb9e99ad40a7d902b83297f187a64430 (patch)
tree748c90db605a751d3b25783b502e36deeaa2f00c /gcc/config/rs6000
parentf93ff21aec18a880cb4797d18720bdf13cdbcffc (diff)
downloadgcc-0683140aeb9e99ad40a7d902b83297f187a64430.tar.gz
* final.c (compute_alignments): Compute/free loop info all the time.
* config/rs6000/rs6000.h (LOOP_ALIGN): Define. * config/rs6000/rs6000-protos.h (rs6000_loop_align): Declare. * config/rs6000/t-rs6000 (rs6000.o): Add cfgloop.h. * config/rs6000/rs6000.c (cfgloop.h): Include. (can_override_loop_align): New. (rs6000_option_override_internal): Set it. (TARGET_ASM_LOOP_ALIGN_MAX_SKIP): Define target hook. (rs6000_loop_align): New function. (rs6000_loop_align_max_skip): Likewise. * gcc.target/powerpc/loop_align.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166329 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/rs6000')
-rw-r--r--gcc/config/rs6000/rs6000-protos.h1
-rw-r--r--gcc/config/rs6000/rs6000.c45
-rw-r--r--gcc/config/rs6000/rs6000.h3
-rw-r--r--gcc/config/rs6000/t-rs60002
4 files changed, 49 insertions, 2 deletions
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 0678fc0d189..937f95bfa5f 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -131,6 +131,7 @@ extern rtx rs6000_machopic_legitimize_pic_address (rtx, enum machine_mode,
extern rtx rs6000_address_for_fpconvert (rtx);
extern rtx rs6000_allocate_stack_temp (enum machine_mode, bool, bool);
extern void rs6000_expand_convert_si_to_sfdf (rtx, rtx, bool);
+extern int rs6000_loop_align (rtx);
#endif /* RTX_CODE */
#ifdef TREE_CODE
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 30146645973..854f6d00f88 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -51,6 +51,7 @@
#include "langhooks.h"
#include "reload.h"
#include "cfglayout.h"
+#include "cfgloop.h"
#include "sched-int.h"
#include "gimple.h"
#include "tree-flow.h"
@@ -156,6 +157,9 @@ static GTY(()) bool rs6000_sched_groups;
/* Align branch targets. */
static GTY(()) bool rs6000_align_branch_targets;
+/* Non-zero to allow overriding loop alignment. */
+static int can_override_loop_align = 0;
+
/* Support for -msched-costly-dep option. */
const char *rs6000_sched_costly_dep_str;
enum rs6000_dependence_cost rs6000_sched_costly_dep;
@@ -1140,6 +1144,7 @@ static void rs6000_option_override (void);
static void rs6000_option_init_struct (struct gcc_options *);
static void rs6000_option_default_params (void);
static bool rs6000_handle_option (size_t, const char *, int);
+static int rs6000_loop_align_max_skip (rtx);
static void rs6000_parse_tls_size_option (void);
static void rs6000_parse_yes_no_option (const char *, const char *, int *);
static int first_altivec_reg_to_save (void);
@@ -1607,6 +1612,9 @@ static const struct default_options rs6000_option_optimization_table[] =
#undef TARGET_HANDLE_OPTION
#define TARGET_HANDLE_OPTION rs6000_handle_option
+#undef TARGET_ASM_LOOP_ALIGN_MAX_SKIP
+#define TARGET_ASM_LOOP_ALIGN_MAX_SKIP rs6000_loop_align_max_skip
+
#undef TARGET_OPTION_OVERRIDE
#define TARGET_OPTION_OVERRIDE rs6000_option_override
@@ -3026,7 +3034,10 @@ rs6000_option_override_internal (const char *default_cpu)
if (align_jumps <= 0)
align_jumps = 16;
if (align_loops <= 0)
- align_loops = 16;
+ {
+ can_override_loop_align = 1;
+ align_loops = 16;
+ }
}
if (align_jumps_max_skip <= 0)
align_jumps_max_skip = 15;
@@ -3271,6 +3282,38 @@ rs6000_builtin_mask_for_load (void)
return 0;
}
+/* Implement LOOP_ALIGN. */
+int
+rs6000_loop_align (rtx label)
+{
+ basic_block bb;
+ int ninsns;
+
+ /* Don't override loop alignment if -falign-loops was specified. */
+ if (!can_override_loop_align)
+ return align_loops_log;
+
+ bb = BLOCK_FOR_INSN (label);
+ ninsns = num_loop_insns(bb->loop_father);
+
+ /* Align small loops to 32 bytes to fit in an icache sector, otherwise return default. */
+ if (ninsns > 4 && ninsns <= 8
+ && (rs6000_cpu == PROCESSOR_POWER4
+ || rs6000_cpu == PROCESSOR_POWER5
+ || rs6000_cpu == PROCESSOR_POWER6
+ || rs6000_cpu == PROCESSOR_POWER7))
+ return 5;
+ else
+ return align_loops_log;
+}
+
+/* Implement TARGET_LOOP_ALIGN_MAX_SKIP. */
+static int
+rs6000_loop_align_max_skip (rtx label)
+{
+ return (1 << rs6000_loop_align (label)) - 1;
+}
+
/* Implement targetm.vectorize.builtin_conversion.
Returns a decl of a function that implements conversion of an integer vector
into a floating-point vector, or vice-versa. DEST_TYPE is the
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index c3170257439..e68936c16c4 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -2385,6 +2385,9 @@ extern char rs6000_reg_names[][8]; /* register names (0 vs. %r0). */
if ((LOG) != 0) \
fprintf (FILE, "\t.align %d\n", (LOG))
+/* How to align the given loop. */
+#define LOOP_ALIGN(LABEL) rs6000_loop_align(LABEL)
+
/* Pick up the return address upon entry to a procedure. Used for
dwarf2 unwind information. This also enables the table driven
mechanism. */
diff --git a/gcc/config/rs6000/t-rs6000 b/gcc/config/rs6000/t-rs6000
index 8066c890eb1..79ab4f51796 100644
--- a/gcc/config/rs6000/t-rs6000
+++ b/gcc/config/rs6000/t-rs6000
@@ -27,7 +27,7 @@ rs6000.o: $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(OBSTACK_H) $(TREE_H) $(EXPR_H) $(OPTABS_H) except.h function.h \
output.h $(BASIC_BLOCK_H) $(INTEGRATE_H) toplev.h $(GGC_H) $(HASHTAB_H) \
$(TM_P_H) $(TARGET_H) $(TARGET_DEF_H) langhooks.h reload.h gt-rs6000.h \
- cfglayout.h
+ cfglayout.h cfgloop.h
rs6000-c.o: $(srcdir)/config/rs6000/rs6000-c.c \
$(srcdir)/config/rs6000/rs6000-protos.h \