From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10824 invoked by alias); 6 Aug 2007 15:30:41 -0000 Received: (qmail 10712 invoked by uid 22791); 6 Aug 2007 15:30:39 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate8.de.ibm.com (HELO mtagate8.de.ibm.com) (195.212.29.157) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 06 Aug 2007 15:30:34 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate8.de.ibm.com (8.13.8/8.13.8) with ESMTP id l76FUUCJ432400 for ; Mon, 6 Aug 2007 15:30:30 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.4) with ESMTP id l76FUVeR2330786 for ; Mon, 6 Aug 2007 17:30:31 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l76FURUq017001 for ; Mon, 6 Aug 2007 17:30:27 +0200 Received: from blc4eb430604175.ibm.com (dyn-9-152-216-52.boeblingen.de.ibm.com [9.152.216.52]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id l76FURTK016998 for ; Mon, 6 Aug 2007 17:30:27 +0200 Received: by blc4eb430604175.ibm.com (sSMTP sendmail emulation); Mon, 6 Aug 2007 17:29:27 +0200 Date: Mon, 06 Aug 2007 15:30:00 -0000 From: Andreas Krebbel To: gcc-patches@gcc.gnu.org Subject: [RFC,PATCH] Provide get_attr functions with alternative parameter Message-ID: <20070806152927.GA3999@blc4eb430604175.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2007-08/txt/msg00342.txt.bz2 Hello, I'm working on a patch which has to draw an insn attribute of a certain alternative into account. Unfortunately the existing getter functions for insn attributes only return an attribute value for the matching alternative. The attached patch provides getter functions with an additional argument specifying the number of the alternative for which the attribute value should be returned. In order to get the old behaviour the functions need to be invoked with -1 as alternative number. Inline wrappers with the old function names are provided in order to keep backwards compatibility. Does this look like the right approach? Bye, -Andreas- Index: gcc/genattr.c =================================================================== *** gcc/genattr.c.orig 2007-01-16 13:47:34.000000000 +0100 --- gcc/genattr.c 2007-08-06 16:04:26.000000000 +0200 *************** gen_attr (rtx attr) *** 51,58 **** /* If numeric attribute, don't need to write an enum. */ p = XSTR (attr, 1); if (*p == '\0') ! printf ("extern int get_attr_%s (%s);\n", XSTR (attr, 0), ! (is_const ? "void" : "rtx")); else { printf ("enum attr_%s {", XSTR (attr, 0)); --- 51,73 ---- /* If numeric attribute, don't need to write an enum. */ p = XSTR (attr, 1); if (*p == '\0') ! { ! if (!strcmp (XSTR (attr, 0), "length")) ! printf ("extern int get_attr_length (rtx);\n"); ! else ! { ! printf ("extern int get_attr_alt_%s (%s);\n", XSTR (attr, 0), ! (is_const ? "void" : "rtx, int")); ! if (!is_const) ! { ! printf ("static inline int get_attr_%s (rtx);\n\n\n", XSTR (attr, 0)); ! printf ("static inline int get_attr_%s (rtx insn)\n", ! XSTR (attr, 0)); ! printf ("{\n return get_attr_alt_%s (insn, -1);\n}\n\n", ! XSTR (attr, 0)); ! } ! } ! } else { printf ("enum attr_%s {", XSTR (attr, 0)); *************** gen_attr (rtx attr) *** 68,75 **** } fputs ("};\n", stdout); ! printf ("extern enum attr_%s get_attr_%s (%s);\n\n", ! XSTR (attr, 0), XSTR (attr, 0), (is_const ? "void" : "rtx")); } /* If `length' attribute, write additional function definitions and define --- 83,99 ---- } fputs ("};\n", stdout); ! printf ("extern enum attr_%s get_attr_alt_%s (%s);\n\n\n", ! XSTR (attr, 0), XSTR (attr, 0), (is_const ? "void" : "rtx, int")); ! if (!is_const) ! { ! printf ("static inline enum attr_%s get_attr_%s (rtx);\n", ! XSTR (attr, 0), XSTR (attr, 0)); ! printf ("static inline enum attr_%s get_attr_%s (rtx insn)\n", ! XSTR (attr, 0), XSTR (attr, 0)); ! printf ("{\n return get_attr_alt_%s (insn, -1);\n}\n\n", ! XSTR (attr, 0)); ! } } /* If `length' attribute, write additional function definitions and define *************** gen_attr (rtx attr) *** 78,87 **** { puts ("\ extern void shorten_branches (rtx);\n\ ! extern int insn_default_length (rtx);\n\ ! extern int insn_min_length (rtx);\n\ ! extern int insn_variable_length_p (rtx);\n\ ! extern int insn_current_length (rtx);\n\n\ #include \"insn-addr.h\"\n"); } } --- 102,135 ---- { puts ("\ extern void shorten_branches (rtx);\n\ ! extern int insn_alt_default_length (rtx, int);\n\ ! extern int insn_alt_min_length (rtx, int);\n\ ! extern int insn_alt_variable_length_p (rtx, int);\n\ ! extern int insn_alt_current_length (rtx, int);\n\n\ ! static inline int insn_default_length (rtx);\n\ ! static inline int insn_min_length (rtx);\n\ ! static inline int insn_variable_length_p (rtx);\n\ ! static inline int insn_current_length (rtx);\n\n\ ! static inline int\n\ ! insn_default_length (rtx insn)\n\ ! {\n\ ! return insn_alt_default_length (insn, -1);\n\ ! }\n\ ! static inline int\n\ ! insn_min_length (rtx insn)\n\ ! {\n\ ! return insn_alt_min_length (insn, -1);\n\ ! }\n\ ! static inline int\n\ ! insn_variable_length_p (rtx insn)\n\ ! {\n\ ! return insn_alt_variable_length_p (insn, -1);\n\ ! }\n\ ! static inline int\n\ ! insn_current_length (rtx insn)\n\ ! {\n\ ! return insn_alt_current_length (insn, -1);\n\ ! }\n\n\ #include \"insn-addr.h\"\n"); } } *************** main (int argc, char **argv) *** 175,186 **** printf ("#endif\n\n"); /* Interface itself: */ printf ("/* Internal insn code number used by automata. */\n"); ! printf ("extern int internal_dfa_insn_code (rtx);\n\n"); printf ("/* Insn latency time defined in define_insn_reservation. */\n"); ! printf ("extern int insn_default_latency (rtx);\n\n"); printf ("/* Return nonzero if there is a bypass for given insn\n"); printf (" which is a data producer. */\n"); ! printf ("extern int bypass_p (rtx);\n\n"); printf ("/* Insn latency time on data consumed by the 2nd insn.\n"); printf (" Use the function if bypass_p returns nonzero for\n"); printf (" the 1st insn. */\n"); --- 223,252 ---- printf ("#endif\n\n"); /* Interface itself: */ printf ("/* Internal insn code number used by automata. */\n"); ! printf ("static inline int internal_dfa_insn_code (rtx);\n\n"); ! printf ("extern int internal_alt_dfa_insn_code (rtx, int);\n\n"); ! printf ("static inline int\n"); ! printf ("internal_dfa_insn_code (rtx insn)\n"); ! printf ("{\n"); ! printf (" return internal_alt_dfa_insn_code (insn, -1);\n"); ! printf ("}\n\n"); printf ("/* Insn latency time defined in define_insn_reservation. */\n"); ! printf ("static inline int insn_default_latency (rtx);\n\n"); ! printf ("extern int insn_alt_default_latency (rtx, int);\n\n"); ! printf ("static inline int\n"); ! printf ("insn_default_latency (rtx insn)\n"); ! printf ("{\n"); ! printf (" return insn_alt_default_latency (insn, -1);\n"); ! printf ("}\n\n"); printf ("/* Return nonzero if there is a bypass for given insn\n"); printf (" which is a data producer. */\n"); ! printf ("static inline int bypass_p (rtx);\n\n"); ! printf ("extern int bypass_alt_p (rtx, int);\n\n"); ! printf ("static inline int\n"); ! printf ("bypass_p (rtx insn)\n"); ! printf ("{\n"); ! printf (" return bypass_alt_p (insn, -1);\n"); ! printf ("}\n\n"); printf ("/* Insn latency time on data consumed by the 2nd insn.\n"); printf (" Use the function if bypass_p returns nonzero for\n"); printf (" the 1st insn. */\n"); Index: gcc/genattrtab.c =================================================================== *** gcc/genattrtab.c.orig 2007-02-19 08:41:15.000000000 +0100 --- gcc/genattrtab.c 2007-08-06 16:03:58.000000000 +0200 *************** make_length_attrs (void) *** 1531,1540 **** { static const char *new_names[] = { ! "*insn_default_length", ! "*insn_min_length", ! "*insn_variable_length_p", ! "*insn_current_length" }; static rtx (*const no_address_fn[]) (rtx) = {identity_fn,identity_fn, zero_fn, zero_fn}; --- 1531,1540 ---- { static const char *new_names[] = { ! "*insn_alt_default_length", ! "*insn_alt_min_length", ! "*insn_alt_variable_length_p", ! "*insn_alt_current_length" }; static rtx (*const no_address_fn[]) (rtx) = {identity_fn,identity_fn, zero_fn, zero_fn}; *************** write_test_expr (rtx exp, int flags) *** 3253,3259 **** if (! (flags & 1) && GET_CODE (XEXP (exp, 0)) == EQ_ATTR && XSTR (XEXP (exp, 0), 0) == alternative_name) { ! printf ("which_alternative != %s", XSTR (XEXP (exp, 0), 1)); break; } --- 3253,3259 ---- if (! (flags & 1) && GET_CODE (XEXP (exp, 0)) == EQ_ATTR && XSTR (XEXP (exp, 0), 0) == alternative_name) { ! printf ("alternative != %s", XSTR (XEXP (exp, 0), 1)); break; } *************** write_test_expr (rtx exp, int flags) *** 3317,3328 **** if (!(set & 1)) bit++; ! printf ("which_alternative %s= %d", XINT (exp, 1) ? "!" : "=", bit); } else { ! printf ("%s((1 << which_alternative) & 0x%x)", XINT (exp, 1) ? "!" : "", set); } } --- 3317,3328 ---- if (!(set & 1)) bit++; ! printf ("alternative %s= %d", XINT (exp, 1) ? "!" : "=", bit); } else { ! printf ("%s((1 << alternative) & 0x%x)", XINT (exp, 1) ? "!" : "", set); } } *************** write_test_expr (rtx exp, int flags) *** 3337,3343 **** if (XSTR (exp, 0) == alternative_name) { ! printf ("which_alternative == %s", XSTR (exp, 1)); break; } --- 3337,3343 ---- if (XSTR (exp, 0) == alternative_name) { ! printf ("alternative == %s", XSTR (exp, 1)); break; } *************** write_attr_get (struct attr_desc *attr) *** 3648,3656 **** /* If the attribute name starts with a star, the remainder is the name of the subroutine to use, instead of `get_attr_...'. */ if (attr->name[0] == '*') ! printf ("%s (rtx insn ATTRIBUTE_UNUSED)\n", &attr->name[1]); else if (attr->is_const == 0) ! printf ("get_attr_%s (rtx insn ATTRIBUTE_UNUSED)\n", attr->name); else { printf ("get_attr_%s (void)\n", attr->name); --- 3648,3660 ---- /* If the attribute name starts with a star, the remainder is the name of the subroutine to use, instead of `get_attr_...'. */ if (attr->name[0] == '*') ! printf ("%s (rtx insn ATTRIBUTE_UNUSED, " ! "int alternative ATTRIBUTE_UNUSED)\n", ! &attr->name[1]); else if (attr->is_const == 0) ! printf ("get_attr_alt_%s (rtx insn ATTRIBUTE_UNUSED, " ! "int alternative ATTRIBUTE_UNUSED)\n", ! attr->name); else { printf ("get_attr_%s (void)\n", attr->name); *************** write_attr_case (struct attr_desc *attr, *** 3857,3868 **** --- 3861,3888 ---- if (must_constrain) { write_indent (indent + 2); + printf ("if (alternative == -1)\n"); + write_indent (indent + 2); + printf ("{\n"); + write_indent (indent + 4); printf ("extract_constrain_insn_cached (insn);\n"); + write_indent (indent + 4); + printf ("alternative = which_alternative;\n"); + write_indent (indent + 2); + printf ("}\n"); } else if (must_extract) { write_indent (indent + 2); + printf ("if (alternative == -1)\n"); + write_indent (indent + 2); + printf ("{\n"); + write_indent (indent + 4); printf ("extract_insn_cached (insn);\n"); + write_indent (indent + 4); + printf ("alternative = which_alternative;\n"); + write_indent (indent + 2); + printf ("}\n"); } if (av->num_insns == 1) *************** make_automaton_attrs (void) *** 4429,4437 **** } } ! make_internal_attr ("*internal_dfa_insn_code", code_exp, ATTR_NONE); ! make_internal_attr ("*insn_default_latency", lats_exp, ATTR_NONE); ! make_internal_attr ("*bypass_p", byps_exp, ATTR_NONE); } int --- 4449,4457 ---- } } ! make_internal_attr ("*internal_alt_dfa_insn_code", code_exp, ATTR_NONE); ! make_internal_attr ("*insn_alt_default_latency", lats_exp, ATTR_NONE); ! make_internal_attr ("*bypass_alt_p", byps_exp, ATTR_NONE); } int