mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-28 14:24:43 +08:00
combine.c (recog_for_combine): Create a dummy insn with PATTERN pat for recog.
* combine.c (recog_for_combine): Create a dummy insn with PATTERN pat for recog. * gcc.dg/20020201-4.c: New test. From-SVN: r49473
This commit is contained in:
parent
9780c24faf
commit
fa85240399
@ -1,3 +1,8 @@
|
||||
2002-02-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* combine.c (recog_for_combine): Create a dummy insn with PATTERN
|
||||
pat for recog.
|
||||
|
||||
2002-02-04 Hartmut Penner <hpenner@de.ibm.com>
|
||||
|
||||
* varasm.c (decode_rtx_const): Allow unspec (symbol_ref) in
|
||||
|
@ -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)
|
||||
|
@ -1,3 +1,7 @@
|
||||
2002-02-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.dg/20020201-4.c: New test.
|
||||
|
||||
2002-02-04 Ben Elliston <bje@redhat.com>
|
||||
|
||||
* lib/gcc.exp (gcc_init): Check that the need_status_wrapper
|
||||
|
16
gcc/testsuite/gcc.dg/20020201-4.c
Normal file
16
gcc/testsuite/gcc.dg/20020201-4.c
Normal file
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user