This patch fixes a pic code generation issue on tilegx. We use crtl->uses_pic_offset_table to decide whether the pic registers are used in the function. This value is updated in tile-specific code generation routines. However, these routines may be called by the loop optimizer to get the cost of computing an address. So we reset this value immediately before we begin actual code generation.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index baf3bd6..9306621 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-01-25 Walter Lee <w...@tilera.com> + + * config/tilegx/tilegx.c (tilegx_expand_to_rtl_hook): New. + (TARGET_EXPAND_TO_RTL_HOOK): Define. + 2014-01-24 James Greenhalgh <james.greenha...@arm.com> * common/config/aarch64/aarch64-common.c diff --git a/gcc/config/tilegx/tilegx.c b/gcc/config/tilegx/tilegx.c index 654f836..85a46f7 100644 --- a/gcc/config/tilegx/tilegx.c +++ b/gcc/config/tilegx/tilegx.c @@ -719,6 +719,16 @@ tilegx_init_expanders (void) } +/* Implement TARGET_EXPAND_TO_RTL_HOOK. */ +static void +tilegx_expand_to_rtl_hook (void) +{ + /* Exclude earlier sets of crtl->uses_pic_offset_table, because we + only care about uses actually emitted. */ + crtl->uses_pic_offset_table = 0; +} + + /* Implement TARGET_SHIFT_TRUNCATION_MASK. DImode shifts use the mode matching insns and therefore guarantee that the shift count is modulo 64. SImode shifts sometimes use the 64 bit version so do @@ -5515,6 +5525,9 @@ tilegx_file_end (void) #undef TARGET_RTX_COSTS #define TARGET_RTX_COSTS tilegx_rtx_costs +#undef TARGET_EXPAND_TO_RTL_HOOK +#define TARGET_EXPAND_TO_RTL_HOOK tilegx_expand_to_rtl_hook + #undef TARGET_SHIFT_TRUNCATION_MASK #define TARGET_SHIFT_TRUNCATION_MASK tilegx_shift_truncation_mask