diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2006-06-07 12:07:24 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2006-06-07 12:07:24 +0000 |
commit | 190e95346588b771817f4ebc2a4c0c46b9a46371 (patch) | |
tree | d535bd11e0e10ab904853586862b8d7741f5d78d /gcc/reg-stack.c | |
parent | 0e9a445b9dfd754aec9bf53ce906c493f6b74d26 (diff) | |
download | gcc-190e95346588b771817f4ebc2a4c0c46b9a46371.zip gcc-190e95346588b771817f4ebc2a4c0c46b9a46371.tar.gz gcc-190e95346588b771817f4ebc2a4c0c46b9a46371.tar.bz2 |
re PR target/27390 (gcc.target/x86_64/abi/test_complex_returning.c execution fails at -O0)
2006-06-07 Paolo Bonzini <bonzini@gnu.org>
PR target/27390
* reg-stack.c (subst_stack_regs_pat): Reorder resetting of
the imaginary and real parts of a clobbered register.
Emit insn to set the imaginary part.
From-SVN: r114462
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index bb2e1a1..83f4ebb 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -1371,16 +1371,20 @@ subst_stack_regs_pat (rtx insn, stack regstack, rtx pat) if (!note) { rtx t = *dest; - if (get_hard_regnum (regstack, t) == -1) - control_flow_insn_deleted - |= move_nan_for_stack_reg (insn, regstack, t); if (COMPLEX_MODE_P (GET_MODE (t))) { - t = FP_MODE_REG (REGNO (t) + 1, DFmode); - if (get_hard_regnum (regstack, t) == -1) - control_flow_insn_deleted - |= move_nan_for_stack_reg (insn, regstack, t); + rtx u = FP_MODE_REG (REGNO (t) + 1, SFmode); + if (get_hard_regnum (regstack, u) == -1) + { + rtx pat2 = gen_rtx_CLOBBER (VOIDmode, u); + rtx insn2 = emit_insn_before (pat2, insn); + control_flow_insn_deleted + |= move_nan_for_stack_reg (insn2, regstack, u); + } } + if (get_hard_regnum (regstack, t) == -1) + control_flow_insn_deleted + |= move_nan_for_stack_reg (insn, regstack, t); } } } |