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;