On July 14, 2020 3:37:35 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote:
>Hi!
>
>On Tue, Jul 07, 2020 at 09:04:40AM +0200, Richard Biener via
>Gcc-patches wrote:
>> > The store to the whole of each volatile object was picked apart
>> > like there had been an individual assignment to each of the
>> > fields.  Reads were added as part of that; see PR for details.
>> > The reads from volatile memory were a clear bug; individual
>> > stores questionable.  A separate patch clarifies the docs.
>> >
>> > Tested x86_64-linux, powerpc64le-linux and cris-elf.
>> > Ok to commit?  Backport to gcc-10?
>> 
>> OK for both.
>
>This breaks building of mesa on both the trunk and 10 branch.
>
>The problem is that the middle-end may never create temporaries of
>non-POD
>(TREE_ADDRESSABLE) types, those can be only created when the language
>says
>so and thus only the FE is allowed to create those.
>
>This patch just reverts the behavior to what we used to do before for
>the
>stores to volatile non-PODs.  Perhaps we want to do something else, but
>definitely we can't create temporaries of the non-POD type.  It is up
>to
>discussions on what should happen in those cases.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for
>trunk/10.2?

OK. 

Richard. 

>2020-07-14  Jakub Jelinek  <ja...@redhat.com>
>
>       PR middle-end/96194
>       * expr.c (expand_constructor): Don't create temporary for store to
>       volatile MEM if exp has an addressable type.
>
>       * g++.dg/opt/pr96194.C: New test.
>
>--- gcc/expr.c.jj      2020-07-13 19:09:33.173872178 +0200
>+++ gcc/expr.c 2020-07-14 13:07:26.228801996 +0200
>@@ -8382,7 +8382,9 @@ expand_constructor (tree exp, rtx target
>      || GET_CODE (target) == PARALLEL || modifier == EXPAND_STACK_PARM
>       /* Also make a temporary if the store is to volatile memory, to
>        avoid individual accesses to aggregate members.  */
>-      || (GET_CODE (target) == MEM && MEM_VOLATILE_P (target)))
>+      || (GET_CODE (target) == MEM
>+        && MEM_VOLATILE_P (target)
>+        && !TREE_ADDRESSABLE (TREE_TYPE (exp))))
>     {
>       if (avoid_temp_mem)
>       return NULL_RTX;
>--- gcc/testsuite/g++.dg/opt/pr96194.C.jj      2020-07-14 13:15:32.185733939
>+0200
>+++ gcc/testsuite/g++.dg/opt/pr96194.C 2020-07-14 13:16:16.033096197
>+0200
>@@ -0,0 +1,21 @@
>+// PR middle-end/96194
>+// { dg-do compile }
>+// { dg-options "-O2" }
>+
>+#include <new>
>+
>+struct A { ~A (); };
>+struct B : A { float e[64]; };
>+
>+B *
>+foo ()
>+{
>+  return new ((void *) 0) B ();
>+}
>+
>+B *
>+bar (void *x, bool y)
>+{
>+  void *p = y ? x : (void *) 0;
>+  return new (p) B ();
>+}
>
>
>       Jakub

Reply via email to