This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

PATCH for type-based alias analysis



Here's a patch to enable type-based alias analysis.  This patch will
also lay the groundwork for implementing the C `restrict' keyword.
First, I'll plug the patch by looking at the code generated for this
program:

  double  u_m;
  double  v_m;

  typedef struct s {
    int     n_m;
    double* x_m;
    double* a_m;
    double* b_m;
  } s;

  void f(struct s* s)
  {
    int i;
    for (i=0; i < s->n_m; ++i)
      s->x_m[i] = (u_m * s->a_m[i]) + (v_m * s->b_m[i]);
  }

This is a boiled-down C version of a C++ scientific computation
program.  In the old days, the compiler would reload s->n_m, s->a_m,
s->b_m, and s->x_m inside the loop, for fear that the store into
s->x_m[i] might have altered them.  Now, however, since s->x_m[i] is a
double, and s->a_m is a double*, those loads are hoisted out of the
loop.  For example, here is the code previously generated on the MIPS:

  .L8:
	  sll     $4,$5,3
	  addu    $3,$4,$3
	  l.d     $f1,0($3)
	  #nop
	  mul.d   $f1,$f3,$f1
	  lw      $2,12($6)      # s->b_m
	  #nop
	  addu    $2,$4,$2
	  l.d     $f0,0($2)
	  #nop
	  mul.d   $f0,$f2,$f0
	  lw      $3,4($6)       # s->x_m
	  add.d   $f1,$f1,$f0
	  addu    $4,$4,$3
	  s.d     $f1,0($4)
	  lw      $2,0($6)       # s->n_m
	  addu    $5,$5,1
	  slt     $2,$5,$2
	  .set    noreorder
	  .set    nomacro
	  bnel    $2,$0,.L8
	  lw      $3,8($6)       # s->a_m

The new code is about 5 instructions shorter:

  .L5:
	  l.d     $f0,0($4)
	  #nop
	  mul.d   $f0,$f3,$f0
	  l.d     $f1,0($5)
	  #nop
	  mul.d   $f1,$f2,$f1
	  addu    $5,$5,8
	  add.d   $f0,$f0,$f1
	  addu    $4,$4,8
	  addu    $3,$3,1
	  slt     $2,$3,$7
	  s.d     $f0,0($6)
	  .set    noreorder
	  .set    nomacro
	  bne     $2,$0,.L5
	  addu    $6,$6,8

The architecture for this patch involves the creation of a new field
in a MEM, called MEM_ALIAS_SET.  This field is zero if the MEM can
alias anything.  If the field is non-zero, the MEM can only alias
other MEMs in the same alias set, i.e., whose MEM_ALIAS_SET field is
equal.  This approach is more conservative that John's back-end
attempt at mode-based aliasing, since any MEM in MEM_ALIAS_SET 0 can
alias anything.  That means that back-end-generated MEMs for which no
type-based alias information is available are treated correctly,
regardless of their machine mode.

This field is set by the front-end in a language-dependent way.  The
middle-end (expand_expr, and the like) call a function defined by the
language to set this value.  I have included an appropriate function
for C and C++.  Languages with even stricter type systems could
presumably use functions that partition expressions into more alias
sets, thereby improving performance.  If no function is provided, the
MEM_ALIAS_SET is always zero, which results in precisely the same code
gnerated without the patch.

These optimizations are controlled by a new flag, -fstrict-aliasing,
which is on by default at -O2 or above.  (If people don't think it
should be on by default, that's OK by me, I guess, but I think it
should be.)  There is support for type-punning using unions; see the
documentation in the patch.  (Ulrich, if you're listening, you could
try glibc with this patch and see what happens.)

I have bootstrapped the compiler with this optimization enabled on
both i686-linux-gnu and mips-sgi-irix6.5SE.  I've verified that no
additional C or C++ test failures occur on Linux when using the
bootstrapped compiler.

The patch follows.  It is not really very long, but may be too long
for the list server, so I have enclosed a uuencoded gzip'd version.
There are two ChangeLog entries; the second is for the C++ front-end. 

I look forward to your comments and criticisms.  I believe that the
basic architecture is sound, although there may of course be
bugs. There may alaso be more places in the middle-end where the
MEM_ALIAS_SET could be set. 

If this is OK to check in, please let me know.  (I'm not quite sure
who has to approve this patch, but if it's you, let me know.)

-- 
Mark Mitchell 			mark@markmitchell.com
Mark Mitchell Consulting	http://www.markmitchell.com

Sat Jun 13 10:09:28 1998  Mark Mitchell  <mark@markmitchell.com>

	* invoke.texi (-fstrict-aliasing): Document.
	* rtl.texi (MEM_ALIAS_SET): Document.

	* flags.h (flag_strict_aliasing): Declare.
	* toplev.c (flag_strict_aliasing): Define.
	(f_options): Add -strict-aliasing.
	(main): Set flag_strict_aliasing if -O2 or higher.

	* tree.h (tree_type): Add alias_set field.
	(TYPE_ALIAS_SET): New macro.
	(TYPE_ALIAS_SET_KNOWN_P): Likewise.
	(get_alias_set): Declare.
	(lang_get_alias_set): Likewise.
	* tree.c (lang_get_alias_set): Define.
	(make_node): Initialize TYPE_ALIAS_SET.
	(get_alias_set): New function.
	* print-tree.c (print_node): Dump the alias set for a type.

	* c-tree.h (c_get_alias_set): Declare.
	* c-common.c (c_get_alias_set): New function.
	* c-decl.c (init_decl_processing): Set lang_get_alias_set.

	* expr.c (protect_from_queue): Propogage alias sets.
	(expand_assignment): Calculate alias set for new MEMs.
	(expand_expr): Likewise.
	* function.c (put_var_into_stack): Likewise.
	(put_reg_into_stack): Likewise.
	(gen_mem_addressof): Likewise.
	(assign_parms): Likewise.
	* stmt.c (expand_decl): Likewise.
	* varasm.c (make_decl_rtl): Eliminate redundant clearing of
	DECL_RTL.  Calculate alias set for new MEMs. 

	* rtl.def (REG): Add dummy operand.
	(MEM): Add extra operand to store the MEM_ALIAS_SET.
	* rtl.h (MEM_ALIAS_SET): New macro.
	(gen_rtx_MEM): Declare.
	* emit-rtl.c (gen_rtx_MEM): New function.
	* gengenrtl.c (sepcial_rtx): Make MEMs special.

	* alias.c (CHECK_ALIAS_SETS_FOR_CONSISTENCY): New macro.
	(DIFFERENT_ALIAS_SETS_P): Likewise.
	(canon_rtx): Propogate the alias set to the new MEM.
	(true_dependence): Check the alias sets.
	(anti_dependence): Likewise.
	(output_dependence): Likewise.
	* explow.c (stabilize): Progoate alias sets.
	* integrate.c (copy_rtx_and_substitute): Likewise.
	* final.c (alter_subreg): Make sure not to leave MEM_IN_STRUCT_P
	in an unpredictable state.  Propogate alias sets.
	* reload1.c (reload): Clear MEM_ALIAS_SET for new MEMs about which
	we have no alias information.
	
1998-06-13  Mark Mitchell  <mark@markmitchell.com>

	* cp-tree.h (c_get_alias_set): Declare.
	* decl.c (init_decl_processing): Set lang_get_alias_set.

begin 600 patch1.gz
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
:-4<9E$XRT-.(!'"JA*PM+/4_5_Z4/;V0````
`
end


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]