diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-11-01 08:58:46 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-11-01 08:58:46 +0100 |
commit | cfd8c4b165b06ca1b118cc6c18e5ec4ed32f7c8f (patch) | |
tree | 1fee1723aa1cd9c97d6a269d4dadbd8acaf8eaa4 | |
parent | 942c9c076a9770797b164f0dd955bd98be44ff41 (diff) | |
download | gcc-cfd8c4b165b06ca1b118cc6c18e5ec4ed32f7c8f.zip gcc-cfd8c4b165b06ca1b118cc6c18e5ec4ed32f7c8f.tar.gz gcc-cfd8c4b165b06ca1b118cc6c18e5ec4ed32f7c8f.tar.bz2 |
re PR target/45250 (FAIL: tr1/5_numerical_facilities/special_functions/01_assoc_laguerre/check_nan.cc)
PR target/45250
* var-tracking.c (cfa_base_rtx): Move definition earlier in the file.
(cfa_base_offset): New variable.
(compute_cfa_pointer): Use cfa_base_rtx and cfa_base_offset.
(adjust_mems): Don't do any sp or hfp replacements if cfa_base_rtx
is NULL.
(vt_init_cfa_base): Initialize cfa_base_offset.
From-SVN: r166126
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/var-tracking.c | 32 |
2 files changed, 23 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6fd8147..328ee75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-11-01 Jakub Jelinek <jakub@redhat.com> + + PR target/45250 + * var-tracking.c (cfa_base_rtx): Move definition earlier in the file. + (cfa_base_offset): New variable. + (compute_cfa_pointer): Use cfa_base_rtx and cfa_base_offset. + (adjust_mems): Don't do any sp or hfp replacements if cfa_base_rtx + is NULL. + (vt_init_cfa_base): Initialize cfa_base_offset. + 2010-11-01 Alan Modra <amodra@gmail.com> PR target/46030 diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index c3d5077..0dc8b15 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -408,7 +408,6 @@ static void stack_adjust_offset_pre_post (rtx, HOST_WIDE_INT *, static void insn_stack_adjust_offset_pre_post (rtx, HOST_WIDE_INT *, HOST_WIDE_INT *); static bool vt_stack_adjustments (void); -static rtx compute_cfa_pointer (HOST_WIDE_INT); static hashval_t variable_htab_hash (const void *); static int variable_htab_eq (const void *, const void *); static void variable_htab_free (void *); @@ -695,22 +694,17 @@ vt_stack_adjustments (void) return true; } +/* arg_pointer_rtx resp. frame_pointer_rtx if stack_pointer_rtx or + hard_frame_pointer_rtx is being mapped to it and offset for it. */ +static rtx cfa_base_rtx; +static HOST_WIDE_INT cfa_base_offset; + /* Compute a CFA-based value for the stack pointer. */ -static rtx +static inline rtx compute_cfa_pointer (HOST_WIDE_INT adjustment) { - rtx cfa; - -#ifdef FRAME_POINTER_CFA_OFFSET - adjustment -= FRAME_POINTER_CFA_OFFSET (current_function_decl); - cfa = plus_constant (frame_pointer_rtx, adjustment); -#else - adjustment -= ARG_POINTER_CFA_OFFSET (current_function_decl); - cfa = plus_constant (arg_pointer_rtx, adjustment); -#endif - - return cfa; + return plus_constant (cfa_base_rtx, adjustment + cfa_base_offset); } /* Adjustment for hard_frame_pointer_rtx to cfa base reg, @@ -803,11 +797,13 @@ adjust_mems (rtx loc, const_rtx old_rtx, void *data) if (amd->mem_mode == VOIDmode && amd->store) return loc; if (loc == stack_pointer_rtx - && !frame_pointer_needed) + && !frame_pointer_needed + && cfa_base_rtx) return compute_cfa_pointer (amd->stack_adjust); else if (loc == hard_frame_pointer_rtx && frame_pointer_needed - && hard_frame_pointer_adjustment != -1) + && hard_frame_pointer_adjustment != -1 + && cfa_base_rtx) return compute_cfa_pointer (hard_frame_pointer_adjustment); return loc; case MEM: @@ -4757,10 +4753,6 @@ var_lowpart (enum machine_mode mode, rtx loc) return gen_rtx_REG_offset (loc, mode, regno, offset); } -/* arg_pointer_rtx resp. frame_pointer_rtx if stack_pointer_rtx or - hard_frame_pointer_rtx is being mapped to it. */ -static rtx cfa_base_rtx; - /* Carry information about uses and stores while walking rtx. */ struct count_use_info @@ -8213,8 +8205,10 @@ vt_init_cfa_base (void) #ifdef FRAME_POINTER_CFA_OFFSET cfa_base_rtx = frame_pointer_rtx; + cfa_base_offset = -FRAME_POINTER_CFA_OFFSET (current_function_decl); #else cfa_base_rtx = arg_pointer_rtx; + cfa_base_offset = -ARG_POINTER_CFA_OFFSET (current_function_decl); #endif if (cfa_base_rtx == hard_frame_pointer_rtx || !fixed_regs[REGNO (cfa_base_rtx)]) |