This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug optimization/12630] [3.4 regression] Various unrecognizable insns and ICEs at -O3
- From: "dave at hiauly1 dot hia dot nrc dot ca" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 3 Nov 2003 01:32:21 -0000
- Subject: [Bug optimization/12630] [3.4 regression] Various unrecognizable insns and ICEs at -O3
- References: <20031015232442.12630.danglin@gcc.gnu.org>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12630
------- Additional Comments From dave at hiauly1 dot hia dot nrc dot ca 2003-11-03 01:32 -------
Subject: Re: [3.4 regression] Various unrecognizable
> > Switching from match_dup to match_scratch introduced a need for two
> additional
> > temporaries. We only have one register in the class R1_REGS.
>
> Why these two temporaries are needed?
> R1_REGS has constraint 'a' that is not used in the pattern at all so why
> reload chooses to use it?
I'm not sure that I understand this yet but I have the sense that
the problem is related to loop optimization. The principal place
that %r1 is needed is to load the address of a symbol that isn't
a read only operand. For this, we use a pair of high and losum
insns. The high insn requires %r1. In the case at hand, I noticed
that the movstr insn is in a loop where the high insn has been
pulled out of the loop. Possibly, by doing this, we have introduced
a situation that reload can't handle. Both the source and destination
registers for the movstr operation are loaded in the loop using
high-losum sequences.
Dave