http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39246

--- Comment #6 from Andreas Krebbel <krebbel at gcc dot gnu.org> 2011-03-01 
18:08:11 UTC ---
The first difference between x86_64 and s390x appears in 004t.gimple since
s390x returns complex numbers in memory:

x86_64:

foo ()
{
  float D.2684;
  C D.2685;
  C f;

  D.2684 = REALPART_EXPR <f>;
  f = COMPLEX_EXPR <D.2684, 0.0>;
  D.2685 = f;
  return D.2685;
}

s390x:

foo ()
{
  float D.2702;
  C f;

  D.2702 = REALPART_EXPR <f>;
  f = COMPLEX_EXPR <D.2702, 0.0>;
  <retval> = f;
  return <retval>;
}


The assignment to the imaginary part is introduced by cplxlower:

foo ()
{
  float f$real;
  C f;
  float D.2702;

<bb 2>:
  f$real_2 = f$real_6(D);
  f_3 = COMPLEX_EXPR <f$real_2, 0.0>;
  REALPART_EXPR <<retval>> = f$real_2;
  IMAGPART_EXPR <<retval>> = 0.0;
  return <retval>;

}

expand_complex_operations_1 is invoked for gimple stmt:
# .MEM_5 = VDEF <.MEM_4(D)>
<retval> = f_3;

the code falls through to the default label and invokes emit_complex_move in
tree-complex.c:1459

Since <retval> is no SSA_NAME emit_complex_move falls through to the code in
tree-complex.c:826 which splits the complex move to:

  REALPART_EXPR <<retval>> = f$real_2;
  IMAGPART_EXPR <<retval>> = 0.0;

Reply via email to