Back then, I must've missed that INCOMING_REGNO / OUTGOING_REGNO are used to map return-value-register/s too. Fixes: FAIL: gcc.dg/builtin-apply4.c execution test ... FAIL: gcc.dg/builtin-return-1.c execution test ... FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -O0 execution test FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -O1 execution test FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -O2 execution test FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -O3 -fomit-frame-pointer execution test FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -O3 -g execution test FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -Os execution test FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution tes\ t FAIL: gcc.dg/torture/stackalign/builtin-apply-4.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects execution test FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -O0 execution test FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -O1 execution test FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -O2 execution test FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -O3 -fomit-frame-pointer execution test FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -O3 -g execution test FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -Os execution test FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution te\ st FAIL: gcc.dg/torture/stackalign/builtin-return-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects execution test
Committed. * config/mmix/mmix.c (mmix_opposite_regno): Handle the return-value register too. --- gcc/config/mmix/mmix.c.prev 2012-10-09 02:00:51.000000000 +0200 +++ gcc/config/mmix/mmix.c 2012-10-14 00:59:54.000000000 +0200 @@ -392,15 +392,33 @@ mmix_conditional_register_usage (void) /* INCOMING_REGNO and OUTGOING_REGNO worker function. Those two macros must only be applied to function argument - registers. FIXME: for their current use in gcc, it'd be better - with an explicit specific additional FUNCTION_INCOMING_ARG_REGNO_P - a'la TARGET_FUNCTION_ARG / TARGET_FUNCTION_INCOMING_ARG instead of + registers and the function return value register for the opposite + use. FIXME: for their current use in gcc, it'd be better with an + explicit specific additional FUNCTION_INCOMING_ARG_REGNO_P a'la + TARGET_FUNCTION_ARG / TARGET_FUNCTION_INCOMING_ARG instead of forcing the target to commit to a fixed mapping and for any - unspecified register use. */ + unspecified register use. Particularly when thinking about the + return-value, it is better to imagine INCOMING_REGNO and + OUTGOING_REGNO as named CALLEE_TO_CALLER_REGNO and INNER_REGNO as + named CALLER_TO_CALLEE_REGNO because the direction. The "incoming" + and "outgoing" is from the perspective of the parameter-registers, + but the same macro is (must be, lacking an alternative like + suggested above) used to map the return-value-register from the + same perspective. To make directions even more confusing, the macro + MMIX_OUTGOING_RETURN_VALUE_REGNUM holds the number of the register + in which to return a value, i.e. INCOMING_REGNO for the return-value- + register as received from a called function; the return-value on the + way out. */ int mmix_opposite_regno (int regno, int incoming) { + if (incoming && regno == MMIX_OUTGOING_RETURN_VALUE_REGNUM) + return MMIX_RETURN_VALUE_REGNUM; + + if (!incoming && regno == MMIX_RETURN_VALUE_REGNUM) + return MMIX_OUTGOING_RETURN_VALUE_REGNUM; + if (!mmix_function_arg_regno_p (regno, incoming)) return regno; brgds, H-P