This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] Tweak for constrain_operands
- From: Steven Bosscher <stevenb at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 31 Jan 2005 08:19:11 +0100
- Subject: [patch] Tweak for constrain_operands
- Organization: SUSE Labs
Hi,
There is no need to look for earlyclobber classes if we did
not see an '&' constraint. We also do not have to look at
all operands from 0 to n_operands - just remember where we
saw the '&'. This gives me about half a percent on all the
components of cc1. Not surprising because for the i386 and
rs6000 ports only ~10% of all insns have an earlyclobber
constraint.
Bootstrapped and tested on x86_64-suse-linux-gnu. OK?
Gr.
Steven
Index: recog.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/recog.c,v
retrieving revision 1.217
diff -u -3 -p -r1.217 recog.c
--- recog.c 18 Jan 2005 11:36:16 -0000 1.217
+++ recog.c 30 Jan 2005 23:32:14 -0000
@@ -2233,6 +2233,7 @@ constrain_operands (int strict)
do
{
+ int seen_earlyclobber_at = -1;
int opno;
int lose = 0;
funny_match_index = 0;
@@ -2295,6 +2296,8 @@ constrain_operands (int strict)
case '&':
earlyclobber[opno] = 1;
+ if (seen_earlyclobber_at < 0)
+ seen_earlyclobber_at = opno;
break;
case '0': case '1': case '2': case '3': case '4':
@@ -2543,8 +2546,10 @@ constrain_operands (int strict)
/* See if any earlyclobber operand conflicts with some other
operand. */
- if (strict > 0)
- for (eopno = 0; eopno < recog_data.n_operands; eopno++)
+ if (strict > 0 && seen_earlyclobber_at >= 0)
+ for (eopno = seen_earlyclobber_at;
+ eopno < recog_data.n_operands;
+ eopno++)
/* Ignore earlyclobber operands now in memory,
because we would often report failure when we have
two memory operands, one of which was formerly a REG. */