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

--- Comment #4 from Martin Jambor <jamborm at gcc dot gnu.org> ---
Looking at Martin's reduced testcase....

(In reply to Richard Biener from comment #2)
> Confirmed with -fwhole-program -O3  IPA SRA messes things up here cloning
> wrong
> and producing the strange
> 
> wrong.isra (floatD.41 ISRA.85D.75004)
> {
[...]
> 
>   <bb 6> [local count: 1073741824]:
> 
>   <bb 2> [local count: 1073741824]:
>   _1 = ISRA.85_10(D);
> 
> eventually mixing up param/replacement here?

...this is simple conversion of a parameter passed by reference to one
passed by value.  I'm good at overlooking things but at least at the
moment I cannot see anything wrong with it.

Rather, I believe it is cplxlower1 which turns

  <bb 2> [local count: 1073741824]:
  a$_M_value_21 = COMPLEX_EXPR <ISRA.18_10(D), ISRA.18_10(D)>;

into:

  <bb 2> [local count: 1073741824]:
  a$_M_value_21 = COMPLEX_EXPR <a$_M_value$real_10(D), a$_M_value$real_10(D)>;

i.e. it replaces two uses of the parameter default-def with two
uninitialized value variable default-defs.

When I disable IPA-SRA, the pass starts with:

  <bb 2> [local count: 1073741824]:
  _1 = *pos_6(D);
  a$_M_value_21 = COMPLEX_EXPR <_1, _1>;

and changes it into:

  <bb 2> [local count: 1073741824]:
  a$_M_value$real_1 = *pos_6(D);
  a$_M_value_21 = COMPLEX_EXPR <a$_M_value$real_1, a$_M_value$real_1>;

...so my hypothesis is that cplxlower does not handle good
default-defs properly.

Reply via email to