This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Use the improved get_attr_length in min_insn_size
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Henderson <rth at redhat dot com>, Uros Bizjak <ubizjak at gmail dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 10 Jun 2009 22:14:12 +0200
- Subject: [PATCH] Use the improved get_attr_length in min_insn_size
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
After the large ix86 insn length computation bugfixes get_attr_length is
something we can almost always trust (and if it very rarely happens to be
too large, worst case we end up with 4 jumps in 16 bytes, the world doesn't
end). This saves 38KB (resp. 33KB for 32-bit) .text from cc1plus.
No regressions in test4jmp.sh report on cc1plus.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2009-06-10 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.c (min_insn_size): Use get_attr_length
for normal insns other than TYPE_MULTI, TYPE_OTHER and TYPE_FCMP.
For __asm return 0.
--- gcc/config/i386/i386.c.jj 2009-06-10 15:57:53.000000000 +0200
+++ gcc/config/i386/i386.c 2009-06-10 17:10:06.000000000 +0200
@@ -27571,7 +27571,7 @@ x86_function_profiler (FILE *file, int l
static int
min_insn_size (rtx insn)
{
- int l = 0;
+ int l = 0, len;
if (!INSN_P (insn) || !active_insn_p (insn))
return 0;
@@ -27580,7 +27580,7 @@ min_insn_size (rtx insn)
if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
&& XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
return 0;
- if (JUMP_TABLE_DATA_P(insn))
+ if (JUMP_TABLE_DATA_P (insn))
return 0;
/* Important case - calls are always 5 bytes.
@@ -27589,14 +27589,31 @@ min_insn_size (rtx insn)
&& symbolic_reference_mentioned_p (PATTERN (insn))
&& !SIBLING_CALL_P (insn))
return 5;
- if (get_attr_length (insn) <= 1)
+ len = get_attr_length (insn);
+ if (len <= 1)
return 1;
- /* For normal instructions we may rely on the sizes of addresses
- and the presence of symbol to require 4 bytes of encoding.
- This is not the case for jumps where references are PC relative. */
+ /* For normal instructions we rely on get_attr_length being exact,
+ with a few exceptions. */
if (!JUMP_P (insn))
{
+ enum attr_type type = get_attr_type (insn);
+
+ switch (type)
+ {
+ case TYPE_MULTI:
+ if (GET_CODE (PATTERN (insn)) == ASM_INPUT
+ || asm_noperands (PATTERN (insn)) >= 0)
+ return 0;
+ break;
+ case TYPE_OTHER:
+ case TYPE_FCMP:
+ break;
+ default:
+ /* Otherwise trust get_attr_length. */
+ return len;
+ }
+
l = get_attr_length_address (insn);
if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
l = 4;
Jakub