From: Eric Botcazou Date: Thu, 11 Oct 2007 05:33:04 +0000 (+0200) Subject: re PR rtl-optimization/33638 (wrong code with -O2 -fforce-addr) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=50f0f3665baa3d351d1c15d62a5a93e56d3d3d7e;p=gcc.git re PR rtl-optimization/33638 (wrong code with -O2 -fforce-addr) PR rtl-optimization/33638 * dse.c (struct insn_info): Remove 'stack_read' field, add 'stack_pointer_based' field. (record_store): For a store with non-constant base, record whether it is stack pointer based. (scan_insn): For the call to a const function, remove stack pointer based stores from the list of local active stores. (scan_reads_nospill): Delete code dealing with const functions. From-SVN: r129226 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e659b1ebf75..f2568d6c5bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2007-10-11 Eric Botcazou + + PR rtl-optimization/33638 + * dse.c (struct insn_info): Remove 'stack_read' field, + add 'stack_pointer_based' field. + (record_store): For a store with non-constant base, record + whether it is stack pointer based. + (scan_insn): For the call to a const function, remove stack + pointer based stores from the list of local active stores. + (scan_reads_nospill): Delete code dealing with const functions. + 2007-10-10 Peter Bergner * ra-conflict.c (partial_bitnum, max_bitnum): Change type of variables diff --git a/gcc/dse.c b/gcc/dse.c index d031c49a4f0..c5e8e26dc62 100644 --- a/gcc/dse.c +++ b/gcc/dse.c @@ -284,12 +284,11 @@ struct insn_info contains a wild read, the use_rec will be null. */ bool wild_read; - /* This field is set for const function calls. Const functions - cannot read memory, but they can read the stack because that is - where they may get their parms. So having this set is less - severe than a wild read, it just means that all of the stores to - the stack are killed rather than all stores. */ - bool stack_read; + /* This field is only used for the processing of const functions. + These functions cannot read memory, but they can read the stack + because that is where they may get their parms. It is set to + true if the insn may contain a stack pointer based store. */ + bool stack_pointer_based; /* This is true if any of the sets within the store contains a cselib base. Such stores can only be deleted by the local @@ -941,8 +940,9 @@ add_wild_read (bb_info_t bb_info) } -/* Return true if X is a constant or one of the registers that behaves - as a constant over the life of a function. */ +/* Return true if X is a constant or one of the registers that behave + as a constant over the life of a function. This is equivalent to + !rtx_varies_p for memory addresses. */ static bool const_or_frame_p (rtx x) @@ -1245,8 +1245,15 @@ record_store (rtx body, bb_info_t bb_info) } else { - store_info = pool_alloc (cse_store_info_pool); + rtx base_term = find_base_term (XEXP (mem, 0)); + if (!base_term + || (GET_CODE (base_term) == ADDRESS + && GET_MODE (base_term) == Pmode + && XEXP (base_term, 0) == stack_pointer_rtx)) + insn_info->stack_pointer_based = true; insn_info->contains_cselib_groups = true; + + store_info = pool_alloc (cse_store_info_pool); group_id = -1; if (dump_file) @@ -1948,9 +1955,10 @@ scan_insn (bb_info_t bb_info, rtx insn) if (CALL_P (insn)) { insn_info->cannot_delete = true; + /* Const functions cannot do anything bad i.e. read memory, - however, they can read their parameters which may have been - pushed onto the stack. */ + however, they can read their parameters which may have + been pushed onto the stack. */ if (CONST_OR_PURE_CALL_P (insn) && !pure_call_p (insn)) { insn_info_t i_ptr = active_local_stores; @@ -1961,15 +1969,8 @@ scan_insn (bb_info_t bb_info, rtx insn) while (i_ptr) { - store_info_t store_info = i_ptr->store_rec; - - /* Skip the clobbers. */ - while (!store_info->is_set) - store_info = store_info->next; - - /* Remove the frame related stores. */ - if (store_info->group_id >= 0 - && VEC_index (group_info_t, rtx_group_vec, store_info->group_id)->frame_related) + /* Remove the stack pointer based stores. */ + if (i_ptr->stack_pointer_based) { if (dump_file) dump_insn_info ("removing from active", i_ptr); @@ -1983,14 +1984,12 @@ scan_insn (bb_info_t bb_info, rtx insn) last = i_ptr; i_ptr = i_ptr->next_local_store; } - - insn_info->stack_read = true; - - return; } - /* Every other call, including pure functions may read memory. */ - add_wild_read (bb_info); + else + /* Every other call, including pure functions, may read memory. */ + add_wild_read (bb_info); + return; } @@ -2492,18 +2491,6 @@ scan_reads_nospill (insn_info_t insn_info, bitmap gen, bitmap kill) int i; group_info_t group; - /* For const function calls kill the stack related stores. */ - if (insn_info->stack_read) - { - for (i = 0; VEC_iterate (group_info_t, rtx_group_vec, i, group); i++) - if (group->process_globally && group->frame_related) - { - if (kill) - bitmap_ior_into (kill, group->group_kill); - bitmap_and_compl_into (gen, group->group_kill); - } - } - while (read_info) { for (i = 0; VEC_iterate (group_info_t, rtx_group_vec, i, group); i++)