Message ID | 4D4C5CC2.2060205@redhat.com |
---|---|
State | New |
Headers | show |
On 02/04/2011 12:08 PM, Aldy Hernandez wrote: > + if (DECL_BY_REFERENCE (x)) > + { > + /* Stupid GCC magic. In assign_params() we'll see the > + DECL_BY_REFERENCE and put the whole thing in a register, > + so we can't instrument this by calculating &<retval>. We > + will see the resulting INDIRECT_REF elsewhere and > + instrument that. See... this is why GCC hackers will > + always have a job, cause nobody understands this and > + takes too long to rewrite it. */ > + return false; Ha ha. A better comment might be /* ??? This value is a pointer, but aggregate_value_p has been jigged to return true which confuses needs_to_live_in_memory. This ought to be cleaned up generically. */ Ok with that change. I sincerely believe that the test in aggregate_value_p is a mistake. We should not be lying about the fact that this value is a pointer. But looking at how DECL_BY_REFERENCE is used elsewhere, it'll be a hard one to unravel. And that certainly should not be done on this branch. r~
On 02/04/11 14:29, Richard Henderson wrote: > On 02/04/2011 12:08 PM, Aldy Hernandez wrote: >> + if (DECL_BY_REFERENCE (x)) >> + { >> + /* Stupid GCC magic. In assign_params() we'll see the >> + DECL_BY_REFERENCE and put the whole thing in a register, >> + so we can't instrument this by calculating&<retval>. We >> + will see the resulting INDIRECT_REF elsewhere and >> + instrument that. See... this is why GCC hackers will >> + always have a job, cause nobody understands this and >> + takes too long to rewrite it. */ >> + return false; > > Ha ha. > > A better comment might be > > /* ??? This value is a pointer, but aggregate_value_p has been > jigged to return true which confuses needs_to_live_in_memory. > This ought to be cleaned up generically. */ Well, I was going to commit it as obvious to keep you from vetoing my comment and forcing into the sources, but I changed my mind at the last minute :). > I sincerely believe that the test in aggregate_value_p is a mistake. > We should not be lying about the fact that this value is a pointer. > But looking at how DECL_BY_REFERENCE is used elsewhere, it'll be a > hard one to unravel. And that certainly should not be done on this > branch. La la la, can't hear you. Aldy
On Fri, Feb 4, 2011 at 9:29 PM, Richard Henderson <rth@redhat.com> wrote: > On 02/04/2011 12:08 PM, Aldy Hernandez wrote: >> + if (DECL_BY_REFERENCE (x)) >> + { >> + /* Stupid GCC magic. In assign_params() we'll see the >> + DECL_BY_REFERENCE and put the whole thing in a register, >> + so we can't instrument this by calculating &<retval>. We >> + will see the resulting INDIRECT_REF elsewhere and >> + instrument that. See... this is why GCC hackers will >> + always have a job, cause nobody understands this and >> + takes too long to rewrite it. */ >> + return false; > > Ha ha. > > A better comment might be > > /* ??? This value is a pointer, but aggregate_value_p has been > jigged to return true which confuses needs_to_live_in_memory. > This ought to be cleaned up generically. */ > > Ok with that change. > > > I sincerely believe that the test in aggregate_value_p is a mistake. > We should not be lying about the fact that this value is a pointer. > But looking at how DECL_BY_REFERENCE is used elsewhere, it'll be a > hard one to unravel. And that certainly should not be done on this > branch. Hm, I think we fixed this on trunk and DECL_BY_REFERENCE result-decls are now even in SSA form. Richard. > > r~ >
Index: testsuite/g++.dg/tm/pr47554.C =================================================================== --- testsuite/g++.dg/tm/pr47554.C (revision 0) +++ testsuite/g++.dg/tm/pr47554.C (revision 0) @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-options "-fgnu-tm" } + +class list +{ + public: list() + { + } + list(const list&) + { + } + const list& _M_get_Node_allocator() const + { + } + list _M_get_Tp_allocator() const + { + return list(_M_get_Node_allocator()); + } +}; +static list buildProjects; +static void build() +{ + __transaction [[relaxed]] + { + buildProjects._M_get_Tp_allocator(); + } +} Index: trans-mem.c =================================================================== --- trans-mem.c (revision 169830) +++ trans-mem.c (working copy) @@ -1467,6 +1467,18 @@ requires_barrier (basic_block entry_bloc case PARM_DECL: case RESULT_DECL: case VAR_DECL: + if (DECL_BY_REFERENCE (x)) + { + /* Stupid GCC magic. In assign_params() we'll see the + DECL_BY_REFERENCE and put the whole thing in a register, + so we can't instrument this by calculating &<retval>. We + will see the resulting INDIRECT_REF elsewhere and + instrument that. See... this is why GCC hackers will + always have a job, cause nobody understands this and + takes too long to rewrite it. */ + return false; + } + if (is_global_var (x)) return !TREE_READONLY (x); if (/* FIXME: This condition should actually go below in the