From 5755cd3808b7ffb637991e6537a69d1bdae4cffb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 8 Aug 2001 12:56:51 -0400 Subject: [PATCH] alias.c (get_alias_set): Return a previously calculated alias set for a VAR_DECL. * alias.c (get_alias_set): Return a previously calculated alias set for a VAR_DECL. * function.c (gen_mem_addressof): Calculate the alias set before touching the RTL. From-SVN: r44720 --- gcc/ChangeLog | 7 +++++++ gcc/alias.c | 7 +++++++ gcc/function.c | 5 ++++- gcc/testsuite/g++.dg/opt/alias1.C | 2 +- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aa19eca..37852f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2001-08-08 Jason Merrill + + * alias.c (get_alias_set): Return a previously calculated + alias set for a VAR_DECL. + * function.c (gen_mem_addressof): Calculate the alias set before + touching the RTL. + Wed Aug 8 18:44:37 CEST 2001 Jan Hubicka * predict.def: Set hitrates according our experimental run. diff --git a/gcc/alias.c b/gcc/alias.c index a1204a2..a79589f 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -526,6 +526,13 @@ get_alias_set (t) return 0; } + /* If we've already determined the alias set for this decl, just + return it. This is necessary for C++ anonymous unions, whose + component variables don't look like union members (boo!). */ + if (TREE_CODE (t) == VAR_DECL + && DECL_RTL_SET_P (t) && GET_CODE (DECL_RTL (t)) == MEM) + return MEM_ALIAS_SET (DECL_RTL (t)); + /* Give the language another chance to do something special. */ if (orig_t != t && (set = lang_get_alias_set (t)) != -1) diff --git a/gcc/function.c b/gcc/function.c index 0c4d712..5a169c6 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2857,6 +2857,9 @@ gen_mem_addressof (reg, decl) rtx r = gen_rtx_ADDRESSOF (Pmode, gen_reg_rtx (GET_MODE (reg)), REGNO (reg), decl); + /* Calculate this before we start messing with decl's RTL. */ + HOST_WIDE_INT set = get_alias_set (decl); + /* If the original REG was a user-variable, then so is the REG whose address is being taken. Likewise for unchanging. */ REG_USERVAR_P (XEXP (r, 0)) = REG_USERVAR_P (reg); @@ -2874,7 +2877,7 @@ gen_mem_addressof (reg, decl) PUT_MODE (reg, decl_mode); MEM_VOLATILE_P (reg) = TREE_SIDE_EFFECTS (decl); MEM_SET_IN_STRUCT_P (reg, AGGREGATE_TYPE_P (type)); - set_mem_alias_set (reg, get_alias_set (decl)); + set_mem_alias_set (reg, set); if (TREE_USED (decl) || DECL_INITIAL (decl) != 0) fixup_var_refs (reg, GET_MODE (reg), TREE_UNSIGNED (type), 0); diff --git a/gcc/testsuite/g++.dg/opt/alias1.C b/gcc/testsuite/g++.dg/opt/alias1.C index 79187d2..b5ed92c 100644 --- a/gcc/testsuite/g++.dg/opt/alias1.C +++ b/gcc/testsuite/g++.dg/opt/alias1.C @@ -1,5 +1,5 @@ // Test that type punning using an anonymous union works with strict aliasing. -// { dg-do run { xfail *-*-* } } +// { dg-do run } // { dg-options "-O2 -fstrict-aliasing" } extern "C" void abort (); -- 2.7.4