public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug other/17106] New: Opportunity to eliminate loads from TOC.
@ 2004-08-19 14:59 gcc-bugzilla at gcc dot gnu dot org
  2004-08-19 15:21 ` [Bug tree-optimization/17106] " pinskia at gcc dot gnu dot org
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: gcc-bugzilla at gcc dot gnu dot org @ 2004-08-19 14:59 UTC (permalink / raw)
  To: gcc-bugs

Description:
A non-optimal code sequence is illustraded.    Duplicate using gcc 3.5 and
command line:

gcc -O3 -m64 -c test.c


Testcase:
static int s1, s2, s3;
void no_common_toc1 ()
{

  s1 = 1;
  s2 = 2;
  s3 = 3;
}

Assembly:
The code generated by gcc 3.5 contains loads the address from the TOC for
each
target location:

.no_common_toc1:
      ld 11,.LC0@toc(2)
      li 0,1
      li 9,2
      ld 8,.LC2@toc(2)
      ld 10,.LC1@toc(2)
      stw 0,0(11)
      li 0,3
      stw 9,0(10)
      stw 0,0(8)
      blr

A single load of the base of the TOC is all that is needed:

.no_common_toc1:
      ld 11,.LC0@toc(2)
      li 0,1
      li 9,2
      stw 0,0(11)
      li 0,3
      stw 9,4(11)
      stw 0,8(11)
      blr




-- 
           Summary: Opportunity to eliminate loads from TOC.
           Product: gcc
           Version: 3.5.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P1
         Component: other
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: steinmtz at us dot ibm dot com
                CC: gcc-bugs at gcc dot gnu dot org,steinmtz at us dot ibm
                    dot com
 GCC build triplet: powerpc64-linux
  GCC host triplet: powerpc64-linux
GCC target triplet: powerpc64-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug tree-optimization/17106] Opportunity to eliminate loads from TOC.
  2004-08-19 14:59 [Bug other/17106] New: Opportunity to eliminate loads from TOC gcc-bugzilla at gcc dot gnu dot org
@ 2004-08-19 15:21 ` pinskia at gcc dot gnu dot org
  2004-11-06 20:37 ` pinskia at gcc dot gnu dot org
  2005-09-10 18:02 ` pinskia at gcc dot gnu dot org
  2 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2004-08-19 15:21 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From pinskia at gcc dot gnu dot org  2004-08-19 15:21 -------
Confirmed, what needs to happen here is that GCC needs to put these variables in a struct like so:
static struct {int s1, s2, s3; }t;
void no_common_toc1 ()
{
  t.s1 = 1;
  t.s2 = 2;
  t.s3 = 3;
}

Which will produce the optimial code.  This also helps powerpc-apple-darwin.

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
          Component|other                       |tree-optimization
     Ever Confirmed|                            |1
           Keywords|                            |missed-optimization
   Last reconfirmed|0000-00-00 00:00:00         |2004-08-19 15:21:33
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug tree-optimization/17106] Opportunity to eliminate loads from TOC.
  2004-08-19 14:59 [Bug other/17106] New: Opportunity to eliminate loads from TOC gcc-bugzilla at gcc dot gnu dot org
  2004-08-19 15:21 ` [Bug tree-optimization/17106] " pinskia at gcc dot gnu dot org
@ 2004-11-06 20:37 ` pinskia at gcc dot gnu dot org
  2005-09-10 18:02 ` pinskia at gcc dot gnu dot org
  2 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2004-11-06 20:37 UTC (permalink / raw)
  To: gcc-bugs



-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pinskia at gcc dot gnu dot
                   |                            |org
   Last reconfirmed|2004-08-19 15:21:33         |2004-11-06 20:37:23
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug tree-optimization/17106] Opportunity to eliminate loads from TOC.
  2004-08-19 14:59 [Bug other/17106] New: Opportunity to eliminate loads from TOC gcc-bugzilla at gcc dot gnu dot org
  2004-08-19 15:21 ` [Bug tree-optimization/17106] " pinskia at gcc dot gnu dot org
  2004-11-06 20:37 ` pinskia at gcc dot gnu dot org
@ 2005-09-10 18:02 ` pinskia at gcc dot gnu dot org
  2 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2005-09-10 18:02 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From pinskia at gcc dot gnu dot org  2005-09-10 18:02 -------
This should be helped or fixed by:
http://gcc.gnu.org/wiki/Section%20Anchor%20Optimisations

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|2005-05-08 18:55:21         |2005-09-10 18:02:38
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug tree-optimization/17106] Opportunity to eliminate loads from TOC.
       [not found] <bug-17106-8614@http.gcc.gnu.org/bugzilla/>
                   ` (2 preceding siblings ...)
  2006-02-18 22:07 ` rsandifo at gcc dot gnu dot org
@ 2006-02-18 22:25 ` rsandifo at gcc dot gnu dot org
  3 siblings, 0 replies; 8+ messages in thread
From: rsandifo at gcc dot gnu dot org @ 2006-02-18 22:25 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #6 from rsandifo at gcc dot gnu dot org  2006-02-18 22:25 -------
With the patch that I just committed, you should be able to
get the desired behaviour using -fsection-anchors.


-- 

rsandifo at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug tree-optimization/17106] Opportunity to eliminate loads from TOC.
       [not found] <bug-17106-8614@http.gcc.gnu.org/bugzilla/>
  2005-11-02 17:16 ` pinskia at gcc dot gnu dot org
  2006-02-02 17:09 ` rsandifo at gcc dot gnu dot org
@ 2006-02-18 22:07 ` rsandifo at gcc dot gnu dot org
  2006-02-18 22:25 ` rsandifo at gcc dot gnu dot org
  3 siblings, 0 replies; 8+ messages in thread
From: rsandifo at gcc dot gnu dot org @ 2006-02-18 22:07 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #5 from rsandifo at gcc dot gnu dot org  2006-02-18 22:07 -------
Subject: Bug 17106

Author: rsandifo
Date: Sat Feb 18 22:06:53 2006
New Revision: 111254

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=111254
Log:
        * cselib.c (cselib_init): Change RTX_SIZE to RTX_CODE_SIZE.
        * emit-rtl.c (copy_rtx_if_shared_1): Use shallow_copy_rtx.
        (copy_insn_1): Likewise.  Don't copy each field individually.
        Reindent.
        * read-rtl.c (apply_macro_to_rtx): Use RTX_CODE_SIZE instead
        of RTX_SIZE.
        * reload1.c (eliminate_regs): Use shallow_copy_rtx.
        * rtl.c (rtx_size): Rename variable to...
        (rtx_code_size): ...this.
        (rtx_size): New function.
        (rtx_alloc_stat): Use RTX_CODE_SIZE instead of RTX_SIZE.
        (copy_rtx): Use shallow_copy_rtx.  Don't copy each field individually.
        Reindent.
        (shallow_copy_rtx_stat): Use rtx_size instead of RTX_SIZE.
        * rtl.h (rtx_code_size): New variable.
        (rtx_size): Change from a variable to a function.
        (RTX_SIZE): Rename to...
        (RTX_CODE_SIZE): ...this.

        PR target/9703
        PR tree-optimization/17106
        * doc/tm.texi (TARGET_USE_BLOCKS_FOR_CONSTANT_P): Document.
        (Anchored Addresses): New section.
        * doc/invoke.texi (-fsection-anchors): Document.
        * doc/rtl.texi (SYMBOL_REF_IN_BLOCK_P, SYMBOL_FLAG_IN_BLOCK): Likewise.
        (SYMBOL_REF_ANCHOR_P, SYMBOL_FLAG_ANCHOR): Likewise.
        (SYMBOL_REF_BLOCK, SYMBOL_REF_BLOCK_OFFSET): Likewise.
        * hooks.c (hook_bool_mode_rtx_false): New function.
        * hooks.h (hook_bool_mode_rtx_false): Declare.
        * gengtype.c (create_optional_field): New function.
        (adjust_field_rtx_def): Add the "block_sym" field for SYMBOL_REFs when
        SYMBOL_REF_IN_BLOCK_P is true.
        * target.h (output_anchor, use_blocks_for_constant_p): New hooks.
        (min_anchor_offset, max_anchor_offset): Likewise.
        (use_anchors_for_symbol_p): New hook.
        * toplev.c (compile_file): Call output_object_blocks.
        (target_supports_section_anchors_p): New function.
        (process_options): Check that -fsection-anchors is only used on
        targets that support it and when -funit-at-a-time is in effect.
        * tree-ssa-loop-ivopts.c (prepare_decl_rtl): Only create DECL_RTL
        if the decl doesn't have one.
        * dwarf2out.c: Remove instantiations of VEC(rtx,gc).
        * expr.c (emit_move_multi_word, emit_move_insn): Pass the result
        of force_const_mem through use_anchored_address.
        (expand_expr_constant): New function.
        (expand_expr_addr_expr_1): Call it.  Use the same modifier when
        calling expand_expr for INDIRECT_REF.
        (expand_expr_real_1): Pass DECL_RTL through use_anchored_address
        for all modifiers except EXPAND_INITIALIZER.  Use expand_expr_constant.
        * expr.h (use_anchored_address): Declare.
        * loop-unroll.c: Don't declare rtx vectors here.
        * explow.c: Include output.h.
        (validize_mem): Call use_anchored_address.
        (use_anchored_address): New function.
        * common.opt (-fsection-anchors): New switch.
        * varasm.c (object_block_htab, anchor_labelno): New variables.
        (hash_section, object_block_entry_eq, object_block_entry_hash)
        (use_object_blocks_p, get_block_for_section, create_block_symbol)
        (use_blocks_for_decl_p, change_symbol_section): New functions.
        (get_variable_section): New function, split out from assemble_variable.
        (make_decl_rtl): Create a block symbol if use_object_blocks_p and
        use_blocks_for_decl_p say so.  Use change_symbol_section if the
        symbol has already been created.
        (assemble_variable_contents): New function, split out from...
        (assemble_variable): ...here.  Don't output any code for
        block symbols; just pass them to place_block_symbol.
        Use get_variable_section and assemble_variable_contents.
        (get_constant_alignment, get_constant_section, get_constant_size): New
        functions, split from output_constant_def_contents.
        (build_constant_desc): Create a block symbol if use_object_blocks_p
        says so.  Or into SYMBOL_REF_FLAGS.
        (assemble_constant_contents): New function, split from...
        (output_constant_def_contents): ...here.  Don't output any code
        for block symbols; just pass them to place_section_symbol.
        Use get_constant_section and get_constant_alignment.
        (force_const_mem): Create a block symbol if use_object_blocks_p and
        use_blocks_for_constant_p say so.  Or into SYMBOL_REF_FLAGS.
        (output_constant_pool_1): Add an explicit alignment argument.
        Don't switch sections here.
        (output_constant_pool): Adjust call to output_constant_pool_1.
        Switch sections here instead.  Don't output anything for block symbols;
        just pass them to place_block_symbol.
        (init_varasm_once): Initialize object_block_htab.
        (default_encode_section_info): Keep the old SYMBOL_FLAG_IN_BLOCK.
        (default_asm_output_anchor, default_use_aenchors_for_symbol_p)
        (place_block_symbol, get_section_anchor, output_object_block)
        (output_object_block_htab, output_object_blocks): New functions.
        * target-def.h (TARGET_ASM_OUTPUT_ANCHOR): New macro.
        (TARGET_ASM_OUT): Include it.
        (TARGET_USE_BLOCKS_FOR_CONSTANT_P): New macro.
        (TARGET_MIN_ANCHOR_OFFSET, TARGET_MAX_ANCHOR_OFFSET): New macros.
        (TARGET_USE_ANCHORS_FOR_SYMBOL_P): New macro.
        (TARGET_INITIALIZER): Include them.
        * rtl.c (rtl_check_failed_block_symbol): New function.
        * rtl.h: Include vec.h.  Declare heap and gc rtx vectors.
        (block_symbol, object_block): New structures.
        (rtx_def): Add a block_symbol field to the union.
        (BLOCK_SYMBOL_CHECK): New macro.
        (rtl_check_failed_block_symbol): Declare.
        (SYMBOL_FLAG_IN_BLOCK, SYMBOL_FLAG_ANCHOR): New SYMBOL_REF flags.
        (SYMBOL_REF_IN_BLOCK_P, SYMBOL_REF_ANCHOR_P): New predicates.
        (SYMBOL_FLAG_MACH_DEP_SHIFT): Bump by 2.
        (SYMBOL_REF_BLOCK, SYMBOL_REF_BLOCK_OFFSET): New accessors.
        * output.h (output_section_symbols): Declare.
        (object_block): Name structure.
        (place_section_symbol, get_section_anchor, default_asm_output_anchor)
        (default_use_anchors_for_symbol_p): Declare.
        * Makefile.in (RTL_BASE_H): Add vec.h.
        (explow.o): Depend on output.h.
        * config/rs6000/rs6000.c (TARGET_MIN_ANCHOR_OFFSET): Override default.
        (TARGET_MAX_ANCHOR_OFFSET): Likewise.
        (TARGET_USE_BLOCKS_FOR_CONSTANT_P): Likewise.
        (rs6000_use_blocks_for_constant_p): New function.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/Makefile.in
    trunk/gcc/common.opt
    trunk/gcc/config/rs6000/rs6000.c
    trunk/gcc/cselib.c
    trunk/gcc/doc/invoke.texi
    trunk/gcc/doc/rtl.texi
    trunk/gcc/doc/tm.texi
    trunk/gcc/dwarf2out.c
    trunk/gcc/emit-rtl.c
    trunk/gcc/explow.c
    trunk/gcc/expr.c
    trunk/gcc/expr.h
    trunk/gcc/gengtype.c
    trunk/gcc/hooks.c
    trunk/gcc/hooks.h
    trunk/gcc/loop-unroll.c
    trunk/gcc/output.h
    trunk/gcc/read-rtl.c
    trunk/gcc/reload1.c
    trunk/gcc/rtl.c
    trunk/gcc/rtl.h
    trunk/gcc/target-def.h
    trunk/gcc/target.h
    trunk/gcc/toplev.c
    trunk/gcc/tree-ssa-loop-ivopts.c
    trunk/gcc/varasm.c


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug tree-optimization/17106] Opportunity to eliminate loads from TOC.
       [not found] <bug-17106-8614@http.gcc.gnu.org/bugzilla/>
  2005-11-02 17:16 ` pinskia at gcc dot gnu dot org
@ 2006-02-02 17:09 ` rsandifo at gcc dot gnu dot org
  2006-02-18 22:07 ` rsandifo at gcc dot gnu dot org
  2006-02-18 22:25 ` rsandifo at gcc dot gnu dot org
  3 siblings, 0 replies; 8+ messages in thread
From: rsandifo at gcc dot gnu dot org @ 2006-02-02 17:09 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #4 from rsandifo at gcc dot gnu dot org  2006-02-02 17:09 -------
Patch posted here:

http://gcc.gnu.org/ml/gcc-patches/2006-02/msg00133.html


-- 

rsandifo at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |rsandifo at gcc dot gnu dot
                   |dot org                     |org
             Status|NEW                         |ASSIGNED
           Keywords|                            |patch
   Last reconfirmed|2006-02-01 04:43:47         |2006-02-02 17:09:08
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug tree-optimization/17106] Opportunity to eliminate loads from TOC.
       [not found] <bug-17106-8614@http.gcc.gnu.org/bugzilla/>
@ 2005-11-02 17:16 ` pinskia at gcc dot gnu dot org
  2006-02-02 17:09 ` rsandifo at gcc dot gnu dot org
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2005-11-02 17:16 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #3 from pinskia at gcc dot gnu dot org  2005-11-02 17:16 -------
All P1 enhancements not targeted towards 4.1, moving to P5.


-- 

pinskia at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P1                          |P5


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17106


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2006-02-18 22:25 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-08-19 14:59 [Bug other/17106] New: Opportunity to eliminate loads from TOC gcc-bugzilla at gcc dot gnu dot org
2004-08-19 15:21 ` [Bug tree-optimization/17106] " pinskia at gcc dot gnu dot org
2004-11-06 20:37 ` pinskia at gcc dot gnu dot org
2005-09-10 18:02 ` pinskia at gcc dot gnu dot org
     [not found] <bug-17106-8614@http.gcc.gnu.org/bugzilla/>
2005-11-02 17:16 ` pinskia at gcc dot gnu dot org
2006-02-02 17:09 ` rsandifo at gcc dot gnu dot org
2006-02-18 22:07 ` rsandifo at gcc dot gnu dot org
2006-02-18 22:25 ` rsandifo at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).