This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix recog_for_combine (was Re: [testcase] -fssa -fssa-ccp -march=i686 ICE)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 2 Feb 2002 22:30:53 +0100
- Subject: [PATCH] Fix recog_for_combine (was Re: [testcase] -fssa -fssa-ccp -march=i686 ICE)
- References: <20020202003822.R618@sunsite.ms.mff.cuni.cz> <20020201154243.A10857@redhat.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Fri, Feb 01, 2002 at 03:42:43PM -0800, Richard Henderson wrote:
> On Sat, Feb 02, 2002 at 12:38:22AM +0100, Jakub Jelinek wrote:
> > or recog_for_combine needs to temporarily modify the instruction by
> > setting its pattern to pat and back or, if modifying insn is not an
> > option, making a dummy insn with PATTERN pat and reg notes copied over).
> > What do you think?
>
> Using a dummy insn would eliminate the old_notes frobbing too,
> so that would seem the best way.
Here it is, bootstrapped on i386-redhat-linux, no regressions.
Ok to commit?
2002-02-02 Jakub Jelinek <jakub@redhat.com>
* combine.c (recog_for_combine): Create a dummy insn with PATTERN
pat for recog.
* gcc.dg/20020201-4.c: New test.
--- gcc/combine.c.jj Wed Jan 23 16:29:00 2002
+++ gcc/combine.c Sat Feb 2 12:07:13 2002
@@ -9590,7 +9590,7 @@ recog_for_combine (pnewpat, insn, pnotes
int num_clobbers_to_add = 0;
int i;
rtx notes = 0;
- rtx old_notes;
+ rtx dummy_insn;
/* If PAT is a PARALLEL, check to see if it contains the CLOBBER
we use to indicate that something didn't match. If we find such a
@@ -9601,11 +9601,13 @@ recog_for_combine (pnewpat, insn, pnotes
&& XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
return -1;
- /* Remove the old notes prior to trying to recognize the new pattern. */
- old_notes = REG_NOTES (insn);
- REG_NOTES (insn) = 0;
+ /* *pnewpat does not have to be actual PATTERN (insn), so make a dummy
+ instruction for pattern recognition. */
+ dummy_insn = shallow_copy_rtx (insn);
+ PATTERN (dummy_insn) = pat;
+ REG_NOTES (dummy_insn) = 0;
- insn_code_number = recog (pat, insn, &num_clobbers_to_add);
+ insn_code_number = recog (pat, dummy_insn, &num_clobbers_to_add);
/* If it isn't, there is the possibility that we previously had an insn
that clobbered some register as a side effect, but the combined
@@ -9630,15 +9632,14 @@ recog_for_combine (pnewpat, insn, pnotes
if (pos == 1)
pat = XVECEXP (pat, 0, 0);
- insn_code_number = recog (pat, insn, &num_clobbers_to_add);
+ PATTERN (dummy_insn) = pat;
+ insn_code_number = recog (pat, dummy_insn, &num_clobbers_to_add);
}
/* Recognize all noop sets, these will be killed by followup pass. */
if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
- REG_NOTES (insn) = old_notes;
-
/* If we had any clobbers to add, make a new pattern than contains
them. Then check to make sure that all of them are dead. */
if (num_clobbers_to_add)
--- gcc/testsuite/gcc.dg/20020201-4.c.jj Sat Feb 2 12:24:00 2002
+++ gcc/testsuite/gcc.dg/20020201-4.c Sat Feb 2 23:19:55 2002
@@ -0,0 +1,16 @@
+/* This testcase failed because recog_for_combine used to pass a different
+ pattern than contained in insn to recog. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fssa -fssa-ccp" } */
+/* { dg-options "-O2 -march=i686 -fssa -fssa-ccp" { target i?86-*-* } } */
+
+extern int bar (char *);
+
+int
+foo (void)
+{
+ char b[512];
+
+ bar (b);
+ return __builtin_strlen (b);
+}
Jakub