Index: calls.c =================================================================== --- calls.c (revision 143663) +++ calls.c (working copy) @@ -992,7 +992,6 @@ initialize_argument_information (int num && targetm.calls.split_complex_arg (argtype)) { tree subtype = TREE_TYPE (argtype); - arg = save_expr (arg); args[j].tree_value = build1 (REALPART_EXPR, subtype, arg); j += inc; args[j].tree_value = build1 (IMAGPART_EXPR, subtype, arg); Index: testsuite/gcc.c-torture/execute/pr38969.c =================================================================== --- testsuite/gcc.c-torture/execute/pr38969.c (revision 0) +++ testsuite/gcc.c-torture/execute/pr38969.c (revision 0) @@ -0,0 +1,25 @@ +__complex__ float +__attribute__ ((noinline)) foo (__complex__ float x) +{ + return x; +} + +__complex__ float +__attribute__ ((noinline)) bar (__complex__ float x) +{ + return foo (x); +} + +int main() +{ + __complex__ float a, b; + __real__ a = 9; + __imag__ a = 42; + + b = bar (a); + + if (a != b) + abort (); + + return 0; +}