https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92038

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
Store-merging says

Starting active chain number 1 with statement:
MEM[(struct __as_base  &)&D.14275] ={v} {CLOBBER};
The base object is:
&D.14275
Recording immediate store from stmt:
MEM[(struct _Uninitialized *)&D.14275] ={v} {CLOBBER};
Recording immediate store from stmt:
MEM[(struct _Uninitialized *)&D.14275]._M_storage = 0;
Recording immediate store from stmt:
MEM[(struct _Variant_storage *)&D.14275]._M_index = 0;
stmt causes chain termination:
f (D.14275);
Terminating chain with 4 stores
Attempting to coalesce 4 stores in chain
...
After writing 0 of size 8 at position 32
  the merged value contains 00 00 00 00 00 00 00 00
  the merged mask contains  00 00 00 00 00 ff ff ff
Coalescing successful!
Merged into 1 stores
Exceeded original number of stmts (2).  Not profitable to emit new sequence.

(the non-details dump only says "Merged into 1 stores" which is confusing)

So it seems the trick fails to consider that we can enlarge the store
to cover tail-padding when we didn't see any earlier stores into it?

So the "C++ issue" is that we do

  MEM[(struct __as_base  &)&D.14275] ={v} {CLOBBER};

and thus only clobber the part w/o the tail padding (and std::variant isn't
'final').  Of course since this is an automatic object we do know it isn't
derived so we could have clobbered the whole object.

Not sure if that's visible at the point the C++ FE calls the CTOR.  I think
it is.  We generate:

;; Function void g() (null)
;; enabled by -tree-original


<<cleanup_point <<< Unknown tree: expr_stmt
  f (TARGET_EXPR <D.14275, <<< Unknown tree: aggr_init_expr
  4
  __ct_comp
  D.14275
  (struct variant *) <<< Unknown tree: void_cst >>> >>>>) >>>>>;

so why do we call the as-base CTOR?  Hmm, it seems this ends up as

  struct variant D.14275;

D.14275.D.14084.D.13569.D.13400.D.13268.D.13154.D.13046._M_u._M_first._M_storage
= 0;
  D.14275.D.14084.D.13569.D.13400.D.13268.D.13154.D.13046._M_index = 0;
  std::variant<int, int>::variant (&D.14275);

where the "self-CTOR" is the guilty one.  So maybe it's also a library
problem.

Reply via email to