update_flow_info error for rs6000-ibm-aix4.1.5 configuration
David S. Miller
davem@dm.cobaltmicro.com
Sat Oct 17 04:57:00 GMT 1998
Date: Sat, 17 Oct 1998 02:19:31 -0600
From: Jeffrey A Law <law@cygnus.com>
In message < 9810162133.AA56656@marc.watson.ibm.com >you write:
> >>>>> Jeffrey A Law writes:
>
> Jeff> In message < 9810161913.AA41810@kitch9.watson.ibm.com >you write:
> >> FYI, I am receiving an internal compiler error in
> >> haifa-sched.c:update_flow_info() from the current CVS sources for
> >> rs6000-ibm-aix4.1.5 configuration.
> >>
> >> haifa-sched.c:8085: Internal compiler error in function update_flow_info
> Jeff> During a bootstrap or with a specific testcase? Do you have a .i fil
> e?
>
> Sorry, yes, during bootstrap, stage1 compiler, compiling libgcc.a:
Thanks. Unfortunately, it didn't fail for me. The most common cause of this
would either be an uninitialized memory read, variable or something along those
lines or a bug in whatever compiler you used to build the stage1 compiler.
I've checked in a few fixes since yesterday which may or may not address
this problem (I tried a build with the sources just after the big flow checkin).
A short note, I get the same for execute/compile-1.c in gcc.c-torture
on sparc for -O2
You may be able to reproduce it more easily using that.
I think I see what is going on, here are some debugging dumps at the
time of the crash. The note list is:
(expr_list:REG_DEAD (reg:SI 26 %i2)
(expr_list:REG_DEAD (reg:SI 27 %i3)
(expr_list:REG_DEAD (reg/v:DF 16 %l0)
(expr_list:REG_UNUSED (reg:SI 26 %i2)
(expr_list:REG_UNUSED (reg:SI 27 %i3)
(nil))))))
The insn in the list from first to last which sets %i2 is:
(insn 68 65 41 (set (reg:DF 26 %i2)
(mem:DF (plus:SI (reg:SI 30 %fp)
(const_int -8)) 0)) 160 {*movdf_insn_sp32} (nil)
(nil))
and then there are a bunch of uses:
(insn 41 68 49 (use (reg/i:DC 24 %i0)) -1 (insn_list:REG_DEP_ANTI 3 (insn_list:REG_DEP_ANTI 7 (insn_list:REG_DEP_ANTI 14 (insn_list:REG_DEP_ANTI 16 (insn_list:REG_DEP_ANTI 18 (insn_list:REG_DEP_ANTI 21 (insn_list:REG_DEP_ANTI 23 (insn_list:REG_DEP_ANTI 26 (insn_list:REG_DEP_ANTI 29 (insn_list:REG_DEP_ANTI 31 (insn_list:REG_DEP_ANTI 36 (insn_list:REG_DEP_ANTI 38 (insn_list 40 (nil))))))))))))))
(expr_list:REG_DEAD (reg/i:DC 24 %i0)
(nil)))
as float complexes value are returned in integer registers on Sparc.
I believe the problem is that the mode has changed.
This is a result of some of the splits on sparc.md, and I now realize
how illegal this is. I tried very hard to make sure such mode changes
only happened after reload, and the scheduler used to allow these just
fine.
I believe rs6000 is suffering from the same problem here.
Just to explain, often it is easier for me to change the modes on
floats to split up operations on multi-register quantities. One
example that comes to mind is where a floating constant is being
loaded to a SFmode register, which happens to be assigned an integer
hard regiser (this is common for parameter passing on 32-bit sparc).
If I pun the mode to SImode, I can even handle all the constant
loading cases which require 2 instructions. If I left it at SFmode
I'd have to do a lot of ugly stuff and still have the 1 to 1 RTL insn
to sparc insn schedulable mapping.
Later,
David S. Miller
davem@dm.cobaltmicro.com
More information about the Gcc-bugs
mailing list