[RFC] PR/27390, latent complex-mode bug in regstack
Paolo Bonzini
paolo.bonzini@lu.unisi.ch
Mon Jun 5 17:41:00 GMT 2006
This patch fixes two problems in regstack involving complex modes.
The problem is latent on 4.1 too, and manifests as a stack underflow in
gcc.target/x86_64/abi/test_complex_returning.c at -O0. Unluckily, after
the PR/19653 patch something convinces reload to produce slightly
different RTL, and the stack underflow turns into a wrong-code generation.
The problematic RTL is a clobber in complex mode. When regstack
encounters one, it calls move_nan_to_stack_reg twice on the same insn.
However, the second call does *not* add a new insn, so we get only one
stack load instead of two.
Then, however, when popping a complex floating-point value, the real
part is popped first and the imaginary part is popped second. However,
this seems to produce wrong code in this case. For this part, I would
appreciate help because I am not sure whether what I should reorder
these two, or rather I should invert the two pushes in subst_stack_regs_pat.
So, I propose two patches: the first one does not change the
move_nan_to_stack_reg order, and only makes sure that both are emitted
in the insn stream, and reorders the pops in emit_pop_insn. This patch
was bootstrapped/regtested on x86_64-pc-linux-gnu and fixes the
regression without introducing any new failure.
The second one changes the move_nan_to_stack_reg order, and of course
makes sure that both are emitted in the insn stream. This seems to fix
the regression too. It was not bootstrapped/regtested because I do not
have access to the affected hardware; Richard Guenther has been very
kind in testing the patches for this regression, but I'd rather have
counsel from the reg-stack expert before asking him for a third
bootstrap/regtest.
Does any of these sound ok, or is either approach completely wrong? (I
am not asking explicitly for approval of either patch, but would not be
unhappy with it).
Paolo
More information about the Gcc-patches
mailing list