alias.c (get_alias_set): Return a previously calculated alias set for a VAR_DECL.
authorJason Merrill <jason@redhat.com>
Wed, 8 Aug 2001 16:56:51 +0000 (12:56 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 8 Aug 2001 16:56:51 +0000 (12:56 -0400)
        * 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
gcc/alias.c
gcc/function.c
gcc/testsuite/g++.dg/opt/alias1.C

index aa19eca..37852f3 100644 (file)
@@ -1,3 +1,10 @@
+2001-08-08  Jason Merrill  <jason_merrill@redhat.com>
+
+       * 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  <jh@suse.cz>
 
        * predict.def: Set hitrates according our experimental run.
index a1204a2..a79589f 100644 (file)
@@ -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)
index 0c4d712..5a169c6 100644 (file)
@@ -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);
index 79187d2..b5ed92c 100644 (file)
@@ -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 ();