This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: more on Solaris internal compiler error
- To: Joe Buck <jbuck at synopsys dot com>
- Subject: Re: more on Solaris internal compiler error
- From: Jeffrey A Law <law at cygnus dot com>
- Date: Sat, 08 Nov 1997 10:26:07 -0700
- cc: egcs at cygnus dot com (egcs team), brendan at cygnus dot com, jason at cygnus dot com
- Reply-To: law at cygnus dot com
In message <199711080745.XAA20966@atrus.synopsys.com>you write:
> Earlier I reported an internal compiler error that seems to make vectors
> of class objects unusable on Solaris. I reduced the problem still more,
> down to the file that appears at the end of this message. I made a stab
> at debugging it, and to make my life easier decided to build a cc1plus
> with the old gcc (2.7.2.1) and CFLAGS=-g for easier debugging and
> Purify'ing. But the resulting compiler behaves differently than the
> bootstrapped, optimized compiler. The debug compiler gives
>
> foo3.cxx:31: internal error--insn does not satisfy its constraints:
> (insn 166 162 167 (set (reg/v:SI 8 %o0)
> (reg/v:SI 107)) 111 {*movsi_insn} (nil)
> (expr_list:REG_DEAD (reg/v:SI 107)
> (nil)))
> foo3.cxx:31: confused by earlier errors, bailing out
This is a flow problem.
Brendan -- I think this is the same basic bug you posted to gcc-local
earlier today.
We have one set of reg107 and two refs of reg107.
One set & ref occurs in bb X the other ref is in bb Y.
flow is putting a REG_DEAD note on the ref in bb X, and combine
is completely eliminating the register in bb X. When it does
so it sets REG_N_REFS to zero, which keeps the pseudo from being
allocated to a hard reg.
However, that leaves a ref in bb Y, which causes bad things to
happen.
I'm working on it (from Joe's testcase since it's a whole lot
simpler :-)
jeff