On Wed, Mar 09, 2011 at 10:55:39AM +0100, Richard Guenther wrote:
> On Wed, Mar 9, 2011 at 9:40 AM, Eric Botcazou <ebotca...@adacore.com> wrote:
> >> and as t isn't AGGREGATE_TYPE nor COMPLEX_TYPE and is a decl,
> >> it is marked MEM_SCALAR_P and e.g. set_mem_attributes_minus_bitpos
> >> once MEM_SCALAR_P is set doesn't change it to MEM_IN_STRUCT_P
> >> because of BIT_FIELD_REF etc.  The BIT_FIELD_REF <t, 32, *> = 1
> >> stores are done through store_field though, and for some reason
> >> the code sets MEM_IN_STRUCT_P in that codepath unconditionally.
> >
> > The irony of marking something scalar when its type is VECTOR_TYPE...
> >
> >> Changing this fixes the testcase, bootstrapped/regtested on x86_64-linux
> >> and i686-linux.  I'll try to test this on ia64-linux tomorrow.
> >>
> >> 2011-03-08  Jakub Jelinek  <ja...@redhat.com>
> >>
> >>       PR rtl-optimization/47866
> >>       * expr.c (store_field): If MEM_SCALAR_P (target), don't use
> >>       MEM_SET_IN_STRUCT_P (to_rtx, 1), just set MEM_IN_STRUCT_P (to_rtx)
> >>       if target wasn't scalar.
> >
> > I cannot formally approve, but I think it's the way to go.
> 
> Yes, this is ok.

In the posted form or in the proposed.  ia64-linux base regtest is still
pending, once it finishes will bootstrap/regtest whatever patch you prefer.

2011-03-09  Jakub Jelinek  <ja...@redhat.com>

        PR rtl-optimization/47866
        * expr.c (store_field): If MEM_SCALAR_P (target), don't use
        MEM_SET_IN_STRUCT_P (to_rtx, 1), just set MEM_IN_STRUCT_P (to_rtx)
        if target wasn't scalar.
        * function.c (assign_stack_temp_for_type): Assert that neither
        MEM_SCALAR_P nor MEM_IN_STRUCT_P is set previously, set either
        MEM_IN_STRUCT_P or MEM_SCALAR_P instead of using MEM_SET_IN_STRUCT_P
        macro.
        * rtl.h (MEM_SET_IN_STRUCT_P): Removed.

--- gcc/expr.c.jj       2011-02-04 16:45:02.000000000 +0100
+++ gcc/expr.c  2011-03-08 20:49:19.531545778 +0100
@@ -5924,7 +5924,8 @@ store_field (rtx target, HOST_WIDE_INT b
       if (to_rtx == target)
        to_rtx = copy_rtx (to_rtx);
 
-      MEM_SET_IN_STRUCT_P (to_rtx, 1);
+      if (!MEM_SCALAR_P (to_rtx))
+       MEM_IN_STRUCT_P (to_rtx) = 1;
       if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
        set_mem_alias_set (to_rtx, alias_set);
 
--- gcc/function.c.jj   2011-03-04 19:39:17.000000000 +0100
+++ gcc/function.c      2011-03-09 09:52:47.428670935 +0100
@@ -942,8 +942,11 @@ assign_stack_temp_for_type (enum machine
   if (type != 0)
     {
       MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
-      MEM_SET_IN_STRUCT_P (slot, (AGGREGATE_TYPE_P (type)
-                                 || TREE_CODE (type) == COMPLEX_TYPE));
+      gcc_checking_assert (!MEM_SCALAR_P (slot) && !MEM_IN_STRUCT_P (slot));
+      if (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE)
+       MEM_IN_STRUCT_P (slot) = 1;
+      else
+       MEM_SCALAR_P (slot) = 1;
     }
   MEM_NOTRAP_P (slot) = 1;
 
--- gcc/rtl.h.jj        2011-02-28 18:02:20.000000000 +0100
+++ gcc/rtl.h   2011-03-09 09:48:58.858400436 +0100
@@ -1279,24 +1279,6 @@ do {                                                     
                \
 #define MEM_NOTRAP_P(RTX) \
   (RTL_FLAG_CHECK1("MEM_NOTRAP_P", (RTX), MEM)->call)
 
-/* If VAL is nonzero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in
-   RTX.  Otherwise, vice versa.  Use this macro only when you are
-   *sure* that you know that the MEM is in a structure, or is a
-   scalar.  VAL is evaluated only once.  */
-#define MEM_SET_IN_STRUCT_P(RTX, VAL)          \
-do {                                           \
-  if (VAL)                                     \
-    {                                          \
-      MEM_IN_STRUCT_P (RTX) = 1;               \
-      MEM_SCALAR_P (RTX) = 0;                  \
-    }                                          \
-  else                                         \
-    {                                          \
-      MEM_IN_STRUCT_P (RTX) = 0;               \
-      MEM_SCALAR_P (RTX) = 1;                  \
-    }                                          \
-} while (0)
-
 /* The memory attribute block.  We provide access macros for each value
    in the block and provide defaults if none specified.  */
 #define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1)


        Jakub

Reply via email to