<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-1157</id>
	<title>Nabble - gcc - Dev</title>
	<updated>2009-12-23T16:32:44Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/gcc---Dev-f1157.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/gcc---Dev-f1157.html" />
	<subtitle type="html">&lt;b&gt;Please note this is NOT, I repeat NOT, a GCC users list - this is a GCC developers list. &lt;/b&gt;&lt;br&gt;For user general questions, post to &lt;a href=&quot;http://www.nabble.com/gcc---Help-f1158.html&quot; target=&quot;_top&quot;&gt;GCC - Help&lt;/a&gt;.</subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26909217</id>
	<title>Re: target hooks / plugins</title>
	<published>2009-12-23T16:32:44Z</published>
	<updated>2009-12-23T16:32:44Z</updated>
	<author>
		<name>Joern Rennecke-4</name>
	</author>
	<content type="html">Quoting Joern Rennecke &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26909217&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;amylaar@...&lt;/a&gt;&amp;gt;:
&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Right now, to make a new target hook, you have to add a new field in
&lt;br&gt;&amp;gt; target.h, define a new default in target-def.h, place the new macro
&lt;br&gt;&amp;gt; in exactly the right position there of the right initializer macro,
&lt;br&gt;&amp;gt; describe the new hook in tm.texi, and if you need a new function with
&lt;br&gt;&amp;gt; a bunch of parameters returning a constant, you have to add this to
&lt;br&gt;&amp;gt; hooks.c .
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I would like to be able to do all this by adding a single entry in a
&lt;br&gt;&amp;gt; new definition file; and the information should also be usable by
&lt;br&gt;&amp;gt; plugin sources so that they can automatically make wrappers for all
&lt;br&gt;&amp;gt; function-type hooks.
&lt;/div&gt;&lt;/div&gt;I've attached what I have so far.
&lt;br&gt;There is an issue that the struct gcc_target member names don't always agree
&lt;br&gt;with the TARGET_* macro names.
&lt;br&gt;&lt;br&gt;Should I rather change one or the other to make them agree, or add an extra
&lt;br&gt;parameter in the definition file macros to specify these names independently?
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;Index: target.def
&lt;br&gt;===================================================================
&lt;br&gt;--- target.def	(revision 0)
&lt;br&gt;+++ target.def	(revision 0)
&lt;br&gt;@@ -0,0 +1,263 @@
&lt;br&gt;+/* Target hook definitions.
&lt;br&gt;+ &amp;nbsp; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
&lt;br&gt;+ &amp;nbsp; Free Software Foundation, Inc.
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; This program is free software; you can redistribute it and/or modify it
&lt;br&gt;+ &amp;nbsp; under the terms of the GNU General Public License as published by the
&lt;br&gt;+ &amp;nbsp; Free Software Foundation; either version 3, or (at your option) any
&lt;br&gt;+ &amp;nbsp; later version.
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; This program is distributed in the hope that it will be useful,
&lt;br&gt;+ &amp;nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of
&lt;br&gt;+ &amp;nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &amp;nbsp;See the
&lt;br&gt;+ &amp;nbsp; GNU General Public License for more details.
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; You should have received a copy of the GNU General Public License
&lt;br&gt;+ &amp;nbsp; along with this program; see the file COPYING3. &amp;nbsp;If not see
&lt;br&gt;+ &amp;nbsp; &amp;lt;&lt;a href=&quot;http://www.gnu.org/licenses/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.gnu.org/licenses/&lt;/a&gt;&amp;gt;.
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; In other words, you are welcome to use, share and improve this program.
&lt;br&gt;+ &amp;nbsp; You are forbidden to forbid anyone else to use, share and improve
&lt;br&gt;+ &amp;nbsp; what you give them. &amp;nbsp; Help stamp out software-hoarding! &amp;nbsp;*/
&lt;br&gt;+
&lt;br&gt;+/* The following macros should be provided by the including file:
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT): Define a function-valued hook.
&lt;br&gt;+ &amp;nbsp; DEFHOOKPOD(DOC, TYPE, NAME, INIT): Define a piece-of-data 'hook'. &amp;nbsp;*/
&lt;br&gt;+
&lt;br&gt;+/* Defaults for optional macros:
&lt;br&gt;+ &amp;nbsp; DEFHOOKPODX(NAME, NAME, INIT): Like DEFHOOKPOD, but share documentation
&lt;br&gt;+ &amp;nbsp; with the previous 'hook'. &amp;nbsp;*/
&lt;br&gt;+#ifndef DEFHOOKPODX
&lt;br&gt;+#define DEFHOOKPODX(NAME, TYPE, INIT) DEFHOOKPOD (NAME, 0, TYPE, INIT)
&lt;br&gt;+#endif
&lt;br&gt;+ &amp;nbsp; 
&lt;br&gt;+/* HOOKSTRUCT(FRAGMENT): Declarator fragments to encapsulate all the
&lt;br&gt;+ &amp;nbsp; members into a struct gcc_target, which in turn contains several
&lt;br&gt;+ &amp;nbsp; sub-structs. &amp;nbsp;*/
&lt;br&gt;+#ifndef HOOKSTRUCT
&lt;br&gt;+#define HOOKSTRUCT(FRAGMENT)
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+HOOKSTRUCT (struct gcc_target {)
&lt;br&gt;+
&lt;br&gt;+/* Functions that output assembler for the target. &amp;nbsp;*/
&lt;br&gt;+#define HOOK_PREFIX &amp;quot;TARGET_ASM_&amp;quot;
&lt;br&gt;+HOOKSTRUCT (struct asm_out {)
&lt;br&gt;+
&lt;br&gt;+DEFHOOKPOD
&lt;br&gt;+(open_paren,
&lt;br&gt;+&amp;quot;These target hooks are C string constants, describing the syntax in the\
&lt;br&gt;+ assembler for grouping arithmetic expressions. &amp;nbsp;If not overridden, they\
&lt;br&gt;+ default to normal parentheses, which is correct for most assemblers.&amp;quot;,
&lt;br&gt;+ const char *, &amp;quot;(&amp;quot;)
&lt;br&gt;+DEFHOOKPODX (close_paren, const char *, &amp;quot;)&amp;quot;)
&lt;br&gt;+
&lt;br&gt;+DEFHOOKPOD
&lt;br&gt;+(byte_op,
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_HI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_SI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_DI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_TI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_HI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_SI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_DI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_TI_OP\n&amp;quot;
&lt;br&gt;+&amp;quot;These hooks specify assembly directives for creating certain kinds\
&lt;br&gt;+ of integer object. &amp;nbsp;The @code{TARGET_ASM_BYTE_OP} directive creates a\
&lt;br&gt;+ byte-sized object, the @code{TARGET_ASM_ALIGNED_HI_OP} one creates an\
&lt;br&gt;+ aligned two-byte object, and so on. &amp;nbsp;Any of the hooks may be\
&lt;br&gt;+ @code{NULL}, indicating that no suitable directive is available.\n\n&amp;quot;
&lt;br&gt;+
&lt;br&gt;+&amp;quot;The compiler will print these strings at the start of a new line,\
&lt;br&gt;+ followed immediately by the object's initial value. &amp;nbsp;In most cases,\
&lt;br&gt;+ the string should contain a tab, a pseudo-op, and then another tab.&amp;quot;,
&lt;br&gt;+ const char *, &amp;quot;\t.byte\t&amp;quot;)
&lt;br&gt;+DEFHOOKPOD
&lt;br&gt;+(aligned_op, &amp;quot;*&amp;quot;, struct asm_int_op,
&lt;br&gt;+ ({ TARGET_ASM_ALIGNED_HI_OP, TARGET_ASM_ALIGNED_SI_OP,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;TARGET_ASM_ALIGNED_DI_OP, TARGET_ASM_ALIGNED_TI_OP }) )
&lt;br&gt;+DEFHOOKPOD
&lt;br&gt;+(unaligned_op, &amp;quot;*&amp;quot;, struct asm_int_op,
&lt;br&gt;+ ({ TARGET_ASM_UNALIGNED_HI_OP, TARGET_ASM_UNALIGNED_SI_OP,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;TARGET_ASM_UNALIGNED_DI_OP, TARGET_ASM_UNALIGNED_TI_OP }) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Assembler instructions for creating various kinds of integer object. &amp;nbsp;*/
&lt;br&gt;+
&lt;br&gt;+DEFHOOK
&lt;br&gt;+(integer,
&lt;br&gt;+&amp;quot;The @code{assemble_integer} function uses this hook to output an\
&lt;br&gt;+ integer object. &amp;nbsp;@var{x} is the object's value, @var{size} is its size\
&lt;br&gt;+ in bytes and @var{aligned_p} indicates whether it is aligned. &amp;nbsp;The\
&lt;br&gt;+ function should return @code{true} if it was able to output the\
&lt;br&gt;+ object. &amp;nbsp;If it returns false, @code{assemble_integer} will try to\
&lt;br&gt;+ split the object into smaller parts.\n\n&amp;quot;
&lt;br&gt;+
&lt;br&gt;+&amp;quot;The default implementation of this hook will use the\
&lt;br&gt;+ @code{TARGET_ASM_BYTE_OP} family of strings, returning @code{false}\
&lt;br&gt;+ when the relevant string is @code{NULL}.&amp;quot;,
&lt;br&gt;+ /* Only handles cases for which BYTE_OP, ALIGNED_OP and UNALIGNED_OP are
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;NULL. &amp;nbsp;*/
&lt;br&gt;+ bool, (rtx x, unsigned int size, int aligned_p),
&lt;br&gt;+ default_assemble_integer)
&lt;br&gt;+
&lt;br&gt;+DEFHOOK
&lt;br&gt;+(globalize_label,
&lt;br&gt;+&amp;quot;This target hook is a function to output to the stdio stream\
&lt;br&gt;+ @var{stream} some commands that will make the label @var{name} global;\
&lt;br&gt;+ that is, available for reference from other files.\n\n&amp;quot;
&lt;br&gt;+
&lt;br&gt;+&amp;quot;The default implementation relies on a proper definition of\
&lt;br&gt;+ @code{GLOBAL_ASM_OP}.&amp;quot;,
&lt;br&gt;+ void, (FILE *stream, const char *name),
&lt;br&gt;+ default_globalize_label)
&lt;br&gt;+
&lt;br&gt;+DEFHOOK
&lt;br&gt;+(globalize_decl_name,
&lt;br&gt;+&amp;quot;This target hook is a function to output to the stdio stream\
&lt;br&gt;+ @var{stream} some commands that will make the name associated with @var{decl}\
&lt;br&gt;+ global; that is, available for reference from other files.\n\n&amp;quot;
&lt;br&gt;+
&lt;br&gt;+&amp;quot;The default implementation uses the TARGET_ASM_GLOBALIZE_LABEL target hook.&amp;quot;,
&lt;br&gt;+ void, (FILE *stream, tree decl), default_globalize_decl_name)
&lt;br&gt;+
&lt;br&gt;+DEFHOOK
&lt;br&gt;+(emit_unwind_label,
&lt;br&gt;+&amp;quot;This target hook emits a label at the beginning of each FDE@. &amp;nbsp;It \
&lt;br&gt;+ should be defined on targets where FDEs need special labels, and it \
&lt;br&gt;+ should write the appropriate label, for the FDE associated with the \
&lt;br&gt;+ function declaration @var{decl}, to the stdio stream @var{stream}. \
&lt;br&gt;+ The third argument, @var{for_eh}, is a boolean: true if this is for an \
&lt;br&gt;+ exception table. &amp;nbsp;The fourth argument, @var{empty}, is a boolean: \
&lt;br&gt;+ true if this is a placeholder label for an omitted FDE@.\n\n&amp;quot;
&lt;br&gt;+
&lt;br&gt;+&amp;quot;The default is that FDEs are not given nonlocal labels.&amp;quot;,
&lt;br&gt;+ void, (FILE *stream, tree decl, int for_eh, int empty),
&lt;br&gt;+ default_emit_unwind_label)
&lt;br&gt;+
&lt;br&gt;+#if 0
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output code that will emit a label to divide up the exception
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; table. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* except_table_label) (FILE *);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Emit any directives required to unwind this instruction. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* unwind_emit) (FILE *, rtx);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output an internal label. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* internal_label) (FILE *, const char *, unsigned long);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Emit a ttype table reference to a typeinfo object. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;bool (* ttype) (rtx);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Emit an assembler directive to set visibility for the symbol
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; associated with the tree decl. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* visibility) (tree, int);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output the assembler code for entry to a function. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* function_prologue) (FILE *, HOST_WIDE_INT);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output the assembler code for end of prologue. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* function_end_prologue) (FILE *);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output the assembler code for start of epilogue. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* function_begin_epilogue) (FILE *);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output the assembler code for function exit. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* function_epilogue) (FILE *, HOST_WIDE_INT);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Initialize target-specific sections. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* init_sections) (void);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Tell assembler to change to section NAME with attributes FLAGS.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; If DECL is non-NULL, it is the VAR_DECL or FUNCTION_DECL with
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; which this section is associated. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* named_section) (const char *name, unsigned int flags, tree decl);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Return a mask describing how relocations should be treated when
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; selecting sections. &amp;nbsp;Bit 1 should be set if global relocations
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; should be placed in a read-write section; bit 0 should be set if
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; local relocations should be placed in a read-write section. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int (*reloc_rw_mask) (void);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Return a section for EXP. &amp;nbsp;It may be a DECL or a constant. &amp;nbsp;RELOC
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; is nonzero if runtime relocations must be applied; bit 1 will be
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; set if the runtime relocations require non-local name resolution.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; ALIGN is the required alignment of the data. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;section *(* select_section) (tree, int, unsigned HOST_WIDE_INT);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Return a section for X. &amp;nbsp;MODE is X's mode and ALIGN is its
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; alignment in bits. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;section *(* select_rtx_section) (enum machine_mode, rtx,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned HOST_WIDE_INT);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Select a unique section name for DECL. &amp;nbsp;RELOC is the same as
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; for SELECT_SECTION. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* unique_section) (tree, int);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Return the readonly data section associated with function DECL. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;section *(* function_rodata_section) (tree);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output a constructor for a symbol with a given priority. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* constructor) (rtx, int);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output a destructor for a symbol with a given priority. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* destructor) (rtx, int);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output the assembler code for a thunk function. &amp;nbsp;THUNK_DECL is the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; declaration for the thunk function itself, FUNCTION is the decl for
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; the target function. &amp;nbsp;DELTA is an immediate constant offset to be
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; added to THIS. &amp;nbsp;If VCALL_OFFSET is nonzero, the word at
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; *(*this + vcall_offset) should be added to THIS. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (* output_mi_thunk) (FILE *file, tree thunk_decl,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tree function_decl);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Determine whether output_mi_thunk would succeed. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* ??? Ideally, this hook would not exist, and success or failure
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; would be returned from output_mi_thunk directly. &amp;nbsp;But there's
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; too much undo-able setup involved in invoking output_mi_thunk.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; Could be fixed by making output_mi_thunk emit rtl instead of
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; text to the output file. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;bool (* can_output_mi_thunk) (const_tree thunk_decl, HOST_WIDE_INT delta,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HOST_WIDE_INT vcall_offset,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const_tree function_decl);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output any boilerplate text needed at the beginning of a
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; translation unit. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*file_start) (void);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output any boilerplate text needed at the end of a
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; translation unit. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*file_end) (void);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output an assembler pseudo-op to declare a library function name
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; external. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*external_libcall) (rtx);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output an assembler directive to mark decl live. This instructs
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;linker to not dead code strip this symbol. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*mark_decl_preserved) (const char *);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output a record of the command line switches that have been passed. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;print_switch_fn_type record_gcc_switches;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* The name of the section that the example ELF implementation of
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; record_gcc_switches will use to store the information. &amp;nbsp;Target
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; specific versions of record_gcc_switches may or may not use
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; this information. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;const char * record_gcc_switches_section;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output the definition of a section anchor. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*output_anchor) (rtx);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Output a DTP-relative reference to a TLS symbol. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*output_dwarf_dtprel) (FILE *file, int size, rtx x);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Some target machines need to postscan each insn after it is output. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*final_postscan_insn) (FILE *, rtx, rtx *, int);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Emit the trampoline template. &amp;nbsp;This hook may be NULL. &amp;nbsp;*/
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void (*trampoline_template) (FILE *);
&lt;br&gt;+
&lt;br&gt;+HOOKSTRUCT (} asm_out;)
&lt;br&gt;+
&lt;br&gt;+HOOKSTRUCT (struct sched {)
&lt;br&gt;+#endif /* 0 */
&lt;br&gt;Index: target.h
&lt;br&gt;===================================================================
&lt;br&gt;--- target.h	(revision 155367)
&lt;br&gt;+++ target.h	(working copy)
&lt;br&gt;@@ -108,7 +108,13 @@ struct asm_int_op
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* The target structure. &amp;nbsp;This holds all the backend hooks. &amp;nbsp;*/
&lt;br&gt;+#define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME;
&lt;br&gt;+#define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS;
&lt;br&gt;+#define HOOKSTRUCT(FRAGMENT) FRAGMENT
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#include &amp;quot;target.def&amp;quot;
&lt;br&gt;+
&lt;br&gt;+#if 0
&lt;br&gt;&amp;nbsp;struct gcc_target
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp;/* Functions that output assembler for the target. &amp;nbsp;*/
&lt;br&gt;@@ -141,6 +147,7 @@ struct gcc_target
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this is only a placeholder for an omitted FDE. &amp;nbsp;*/
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void (* unwind_label) (FILE *, tree, int, int);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#endif /* 0 */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Output code that will emit a label to divide up the exception
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table. &amp;nbsp;*/
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void (* except_table_label) (FILE *);
&lt;br&gt;Index: dwarf2out.c
&lt;br&gt;===================================================================
&lt;br&gt;--- dwarf2out.c	(revision 155367)
&lt;br&gt;+++ dwarf2out.c	(working copy)
&lt;br&gt;@@ -3457,8 +3457,8 @@ output_fde (dw_fde_ref fde, bool for_eh,
&lt;br&gt;&amp;nbsp; &amp;nbsp;char l1[20], l2[20];
&lt;br&gt;&amp;nbsp; &amp;nbsp;dw_cfi_ref cfi;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp;targetm.asm_out.unwind_label (asm_out_file, fde-&amp;gt;decl, for_eh,
&lt;br&gt;-				/* empty */ 0);
&lt;br&gt;+ &amp;nbsp;targetm.asm_out.emit_unwind_label (asm_out_file, fde-&amp;gt;decl, for_eh,
&lt;br&gt;+				 &amp;nbsp; &amp;nbsp; /* empty */ 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp;targetm.asm_out.internal_label (asm_out_file, FDE_LABEL,
&lt;br&gt;&amp;nbsp;				 &amp;nbsp;for_eh + j);
&lt;br&gt;&amp;nbsp; &amp;nbsp;ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + j);
&lt;br&gt;@@ -3651,8 +3651,8 @@ output_call_frame_info (int for_eh)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((fde_table[i].nothrow || fde_table[i].all_throwers_are_sibcalls)
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;&amp;&amp; !fde_table[i].uses_eh_lsda
&lt;br&gt;&amp;nbsp;	 &amp;nbsp;&amp;&amp; ! DECL_WEAK (fde_table[i].decl))
&lt;br&gt;-	targetm.asm_out.unwind_label (asm_out_file, fde_table[i].decl,
&lt;br&gt;-				 &amp;nbsp; &amp;nbsp; &amp;nbsp;for_eh, /* empty */ 1);
&lt;br&gt;+	targetm.asm_out.emit_unwind_label (asm_out_file, fde_table[i].decl,
&lt;br&gt;+					 &amp;nbsp; for_eh, /* empty */ 1);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;/* If we don't have any functions we'll want to unwind out of, don't
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; emit any EH unwind information. &amp;nbsp;Note that if exceptions aren't
&lt;br&gt;Index: gentarget.c
&lt;br&gt;===================================================================
&lt;br&gt;--- gentarget.c	(revision 0)
&lt;br&gt;+++ gentarget.c	(revision 0)
&lt;br&gt;@@ -0,0 +1,70 @@
&lt;br&gt;+#include &amp;quot;bconfig.h&amp;quot;
&lt;br&gt;+#include &amp;quot;system.h&amp;quot;
&lt;br&gt;+#include &amp;lt;string.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+struct hook_desc { const char *doc, *type, *name, *param, *init; };
&lt;br&gt;+static struct hook_desc hook_array[] = {
&lt;br&gt;+#define DEFHOOKPOD(NAME, DOC, TYPE, INIT) \
&lt;br&gt;+ &amp;nbsp;{ DOC, #TYPE, HOOK_PREFIX #NAME, 0, #INIT },
&lt;br&gt;+#define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) \
&lt;br&gt;+ &amp;nbsp;{ DOC, #TYPE, HOOK_PREFIX #NAME, #PARAMS, #INIT },
&lt;br&gt;+#include &amp;quot;target.def&amp;quot;
&lt;br&gt;+#undef DEFHOOK
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+int
&lt;br&gt;+main (int argc, char **argv)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp;bool doc_p = false;
&lt;br&gt;+ &amp;nbsp;int i, j;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;if (argc &amp;gt;= 2 &amp;&amp; strcmp (argv[1], &amp;quot;-doc&amp;quot;) == 0)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;doc_p = true;
&lt;br&gt;+ &amp;nbsp;for (i = 0; i &amp;lt; (int) (sizeof hook_array / sizeof hook_array[0]); i++)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;char *name = xstrdup (hook_array[i].name);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;char *p;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;const char *q, *e;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;for (p = name; *p; p++)
&lt;br&gt;+	*p = TOUPPER (*p);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;if (doc_p)
&lt;br&gt;+	{
&lt;br&gt;+	 &amp;nbsp;const char *deftype;
&lt;br&gt;+
&lt;br&gt;+	 &amp;nbsp;if (!hook_array[i].doc)
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;+	 &amp;nbsp;if (*hook_array[i].doc == '*')
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp;printf (&amp;quot;%s&amp;quot;, hook_array[i].doc + 1);
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+	 &amp;nbsp;deftype = hook_array[i].param ? &amp;quot;deftypefn&amp;quot; : &amp;quot;deftypevr&amp;quot;;
&lt;br&gt;+	 &amp;nbsp;printf (&amp;quot;@%s {Target Hook} {%s} %s&amp;quot;,
&lt;br&gt;+		 &amp;nbsp;deftype, hook_array[i].type, name);
&lt;br&gt;+	 &amp;nbsp;if (hook_array[i].param)
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Print the parameter list, with the parameter names
&lt;br&gt;+		 enclosed in @var{}. &amp;nbsp;*/
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp;printf (&amp;quot; &amp;quot;);
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp;for (q = hook_array[i].param; (e = strpbrk (q, &amp;quot; ,)&amp;quot;));
&lt;br&gt;+		 &amp;nbsp; q = e + 1)
&lt;br&gt;+		if (*e == ' ')
&lt;br&gt;+		 &amp;nbsp;printf (&amp;quot;%.*s&amp;quot;, e - q + 1, q);
&lt;br&gt;+		else
&lt;br&gt;+		 &amp;nbsp;printf (&amp;quot;@var{%.*s}%c&amp;quot;, e - q, q, *e);
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+	 &amp;nbsp;printf (&amp;quot;\n&amp;quot;);
&lt;br&gt;+	 &amp;nbsp;for (j = i + 1;
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp; j &amp;lt; (int) (sizeof hook_array / sizeof hook_array[0])
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; hook_array[j].doc == 0; j++)
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;printf (&amp;quot;@%sx {Target Hook} {%s} %s\n&amp;quot;,
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp;deftype, hook_array[i].type, name);
&lt;br&gt;+	 &amp;nbsp;printf (&amp;quot;%s\n@end %s\n\n&amp;quot;, hook_array[i].doc, deftype);
&lt;br&gt;+	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+	printf (&amp;quot;#ifndef %s\n#define %s %s\n#endif\n&amp;quot;,
&lt;br&gt;+		name, name, hook_array[i].init);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp;return 0;
&lt;br&gt;+}
&lt;br&gt;Index: Makefile.in
&lt;br&gt;===================================================================
&lt;br&gt;--- Makefile.in	(revision 155367)
&lt;br&gt;+++ Makefile.in	(working copy)
&lt;br&gt;@@ -3714,6 +3714,7 @@ build/genpreds.o : genpreds.c $(RTL_BASE
&lt;br&gt;&amp;nbsp; &amp;nbsp;coretypes.h $(GTM_H) errors.h gensupport.h $(OBSTACK_H)
&lt;br&gt;&amp;nbsp;build/genrecog.o : genrecog.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H)	\
&lt;br&gt;&amp;nbsp; &amp;nbsp;coretypes.h $(GTM_H) errors.h gensupport.h
&lt;br&gt;+build/gentarget.o : gentarget.c target.def $(BCONFIG_H) $(SYSTEM_H)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;# Compile the programs that generate insn-* from the machine description.
&lt;br&gt;&amp;nbsp;# They are compiled with $(COMPILER_FOR_BUILD), and associated libraries,
&lt;br&gt;@@ -3738,6 +3739,7 @@ build/gengenrtl$(build_exeext) : $(BUILD
&lt;br&gt;&amp;nbsp;build/genmodes$(build_exeext) : $(BUILD_ERRORS)
&lt;br&gt;&amp;nbsp;build/gengtype$(build_exeext) : build/gengtype-lex.o build/gengtype-parse.o \
&lt;br&gt;&amp;nbsp;				$(BUILD_ERRORS)
&lt;br&gt;+build/gentarget$(build_exeext) : $(BUILD_ERRORS)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;# Generated source files for gengtype.
&lt;br&gt;&amp;nbsp;gengtype-lex.c : gengtype-lex.l
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/plugin-hooks-tp26076637p26909217.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26908343</id>
	<title>RE: Approval as AVR maintainer</title>
	<published>2009-12-23T14:30:00Z</published>
	<updated>2009-12-23T14:30:00Z</updated>
	<author>
		<name>Weddington, Eric</name>
	</author>
	<content type="html">&amp;nbsp;
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; -----Original Message-----
&lt;br&gt;&amp;gt; From: Andrew Hutchinson [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26908343&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;andrewhutchinson@...&lt;/a&gt;] 
&lt;br&gt;&amp;gt; Sent: Wednesday, December 23, 2009 3:25 PM
&lt;br&gt;&amp;gt; To: Denis Chertykov; Anatoly Sokolov; GCC Development; 
&lt;br&gt;&amp;gt; Weddington, Eric
&lt;br&gt;&amp;gt; Subject: Approval as AVR maintainer
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; How does one get to be maintainer of port?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Specifically AVR port - so that I do not need to get approval 
&lt;br&gt;&amp;gt; to commit 
&lt;br&gt;&amp;gt; changes. The time it takes now is rather longer than getting 
&lt;br&gt;&amp;gt; approval on 
&lt;br&gt;&amp;gt; other parts of GCC.
&lt;/div&gt;&lt;br&gt;AFAIK, you ask the current maintainers of the AVR port, Denis and Anatoly, which you have just done so.
&lt;br&gt;&lt;br&gt;I haven't asked yet, but I'm also interested.
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Approval-as-AVR-maintainer-tp26908271p26908343.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26908271</id>
	<title>Approval as AVR maintainer</title>
	<published>2009-12-23T14:24:58Z</published>
	<updated>2009-12-23T14:24:58Z</updated>
	<author>
		<name>Andrew Hutchinson</name>
	</author>
	<content type="html">How does one get to be maintainer of port?
&lt;br&gt;&lt;br&gt;Specifically AVR port - so that I do not need to get approval to commit 
&lt;br&gt;changes. The time it takes now is rather longer than getting approval on 
&lt;br&gt;other parts of GCC.
&lt;br&gt;&lt;br&gt;The process does not seem to be written down anywhere - but I am sure 
&lt;br&gt;someone will correct me if I am wrong.
&lt;br&gt;&lt;br&gt;Seasonal Greetings
&lt;br&gt;&lt;br&gt;Andy
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Approval-as-AVR-maintainer-tp26908271p26908271.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26908220</id>
	<title>tree check: expected SSA_NAME, have var_decl</title>
	<published>2009-12-23T14:19:29Z</published>
	<updated>2009-12-23T14:19:29Z</updated>
	<author>
		<name>Aravinda-2</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;After the tree-loop pass, I need to perform some analysis on the loop
&lt;br&gt;and insert a &amp;quot;gimple function call statement&amp;quot; before the loop body.
&lt;br&gt;The function call looks like,
&lt;br&gt;&lt;br&gt;foo(a, 1, 1); for a loop that looks like,
&lt;br&gt;&lt;br&gt;for (i = 0; i &amp;lt; 20; i ++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; a[i]++;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;When compiled with -O2, after the tree loop init, the loops have SSA
&lt;br&gt;names for variables. Based on the analysis I do on the loop, I get a
&lt;br&gt;TREE_NODE for the variable 'a', and two integer_one_node s.
&lt;br&gt;I have trouble constructing the gimple_call_statement and adding it
&lt;br&gt;before the loop_body. I am running into 'expected ssa_name have
&lt;br&gt;var_decl' error. I am not sure I can use make_ssa_name for the
&lt;br&gt;TREE_NODE of variable 'a' since I am yet to build a gimple_stmt that
&lt;br&gt;will contain this variable.
&lt;br&gt;&lt;br&gt;How could I insert a call statement after a loop analysis ?
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;Aravinda
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/tree-check%3A-expected-SSA_NAME%2C-have-var_decl-tp26908220p26908220.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26906951</id>
	<title>Re: Which optimizer should remove redundant subreg of sign_extension?</title>
	<published>2009-12-23T12:22:41Z</published>
	<updated>2009-12-23T12:22:41Z</updated>
	<author>
		<name>Andrew Hutchinson</name>
	</author>
	<content type="html">&lt;br&gt;Paolo Bonzini wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I think that if you add the simplification to simplify-rtx.c's 
&lt;br&gt;&amp;gt; simplify_subreg, combine should pick it up automagically.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Paolo
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;There we have it! There is apparently already &amp;nbsp;this optimization 
&lt;br&gt;performed - so I will have to dig further into why it does not a happen.
&lt;br&gt;&lt;br&gt;simplify_subreg()
&lt;br&gt;&amp;lt;snip&amp;gt;
&lt;br&gt;&amp;nbsp;/* If we're requesting the lowpart of a zero or sign extension,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;there are three possibilities. &amp;nbsp;If the outermode is the same
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;as the origmode, we can omit both the extension and the subreg.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;If the outermode is not larger than the origmode, we can apply
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;the truncation without the extension. &amp;nbsp;Finally, if the outermode
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;is larger than the origmode, but both are integer modes, we
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;can just extend to the appropriate mode. &amp;nbsp;*/
&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Which-optimizer-should-remove-redundant-subreg-of-sign_extension--tp26892121p26906951.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26906478</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T11:41:15Z</published>
	<updated>2009-12-23T11:41:15Z</updated>
	<author>
		<name>Xinliang David Li</name>
	</author>
	<content type="html">Similar situation happens in non loop context as well. PRE commoned
&lt;br&gt;address computation without knowing the existence of advanced
&lt;br&gt;addressing mode, which result in unnecessary address computation
&lt;br&gt;instruction.  The forward substitution code makes local heuristics and
&lt;br&gt;looks at each use individually -- it does not know if the propagation
&lt;br&gt;will happen for all uses and therefore exposes DCE opportunity -- so a
&lt;br&gt;precise cost estimation is not available. Even so, for such cases, a
&lt;br&gt;simple change of 'gain &amp;gt; 0' into 'gain &amp;gt;= 0' in
&lt;br&gt;should_replace_address_p can do the job.
&lt;br&gt;&lt;br&gt;For LIM case discussed in this thread, it is trickier to estimate the
&lt;br&gt;cost of forward substitution without knowing the register pressure --
&lt;br&gt;forward prop MAY increase the live range of the propagated value
&lt;br&gt;(RHS), even though in this case it does not, and it actually shrinks
&lt;br&gt;the LR of the LHS temps, thus reducing register pressure overall.   I
&lt;br&gt;have submitted a live range shrink (LRS) patch a while back, but it
&lt;br&gt;was not accepted.  This address computation propagation can be easily
&lt;br&gt;implemented in the LPS pass with precise knowledge of the change of
&lt;br&gt;register pressure.
&lt;br&gt;&lt;br&gt;In general it will be tricky for latter passes to clean up the messes.
&lt;br&gt;The fundamental problem is that the address computation is exposed to
&lt;br&gt;PRE prematurely (for a given target  ) at GIMPLE level. In this case,
&lt;br&gt;if the INDIRECT_REFs are expressed as MEM_REFs, such problem might be
&lt;br&gt;avoided. &amp;nbsp;A similar &amp;nbsp;issue (for ARM) is reported in bug 40956.
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;David
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;On Wed, Dec 23, 2009 at 10:06 AM, Paolo Bonzini &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26906478&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bonzini@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On 12/23/2009 06:47 PM, H.J. Lu wrote:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Wed, Dec 23, 2009 at 8:41 AM, Paolo Bonzini&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26906478&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bonzini@...&lt;/a&gt;&amp;gt;  wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; On 12/23/2009 04:19 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; It seems that just commenting out this check in fwprop.c should work.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Yes, but it would pessimize x86.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Is there a bug open for x86? Can't we make it target dependent, something
&lt;br&gt;&amp;gt;&amp;gt; like
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;  /* Do not propagate loop invariant definitions inside the loop.  */
&lt;br&gt;&amp;gt;&amp;gt;  if (targetm.foobar
&lt;br&gt;&amp;gt;&amp;gt;     &amp;&amp;  DF_REF_BB (def)-&amp;gt;loop_father != DF_REF_BB (use)-&amp;gt;loop_father)
&lt;br&gt;&amp;gt;&amp;gt;    return;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I'll open a bug.  The solution is to actually understand what the address costs are on x86 (apparently it's not true that the more complex addressing modes are always better, probably because of instruction sizes), not to add a target macro.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Paolo
&lt;br&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26906478.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26905678</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T10:28:52Z</published>
	<updated>2009-12-23T10:28:52Z</updated>
	<author>
		<name>H.J. Lu-30</name>
	</author>
	<content type="html">On Wed, Dec 23, 2009 at 10:06 AM, Paolo Bonzini &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26905678&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bonzini@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On 12/23/2009 06:47 PM, H.J. Lu wrote:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; On Wed, Dec 23, 2009 at 8:41 AM, Paolo Bonzini&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26905678&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bonzini@...&lt;/a&gt;&amp;gt;  wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; On 12/23/2009 04:19 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; It seems that just commenting out this check in fwprop.c should work.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Yes, but it would pessimize x86.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Is there a bug open for x86? Can't we make it target dependent, something
&lt;br&gt;&amp;gt;&amp;gt; like
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;  /* Do not propagate loop invariant definitions inside the loop.  */
&lt;br&gt;&amp;gt;&amp;gt;  if (targetm.foobar
&lt;br&gt;&amp;gt;&amp;gt;     &amp;&amp;  DF_REF_BB (def)-&amp;gt;loop_father != DF_REF_BB (use)-&amp;gt;loop_father)
&lt;br&gt;&amp;gt;&amp;gt;    return;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I'll open a bug.  The solution is to actually understand what the address
&lt;br&gt;&amp;gt; costs are on x86 (apparently it's not true that the more complex addressing
&lt;br&gt;&amp;gt; modes are always better, probably because of instruction sizes), not to add
&lt;br&gt;&amp;gt; a target macro.
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;I will ask around to see if there are any guild lines for this
&lt;br&gt;after the bug is open.
&lt;br&gt;&lt;br&gt;Thanks.
&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;H.J.
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26905678.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26905429</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T10:06:31Z</published>
	<updated>2009-12-23T10:06:31Z</updated>
	<author>
		<name>Paolo Bonzini-6</name>
	</author>
	<content type="html">On 12/23/2009 06:47 PM, H.J. Lu wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Wed, Dec 23, 2009 at 8:41 AM, Paolo Bonzini&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26905429&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bonzini@...&lt;/a&gt;&amp;gt; &amp;nbsp;wrote:
&lt;br&gt;&amp;gt;&amp;gt; On 12/23/2009 04:19 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; It seems that just commenting out this check in fwprop.c should work.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Yes, but it would pessimize x86.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Is there a bug open for x86? Can't we make it target dependent, something
&lt;br&gt;&amp;gt; like
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; /* Do not propagate loop invariant definitions inside the loop. &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; if (targetm.foobar
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;&amp; &amp;nbsp;DF_REF_BB (def)-&amp;gt;loop_father != DF_REF_BB (use)-&amp;gt;loop_father)
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; return;
&lt;/div&gt;&lt;br&gt;I'll open a bug. &amp;nbsp;The solution is to actually understand what the 
&lt;br&gt;address costs are on x86 (apparently it's not true that the more complex 
&lt;br&gt;addressing modes are always better, probably because of instruction 
&lt;br&gt;sizes), not to add a target macro.
&lt;br&gt;&lt;br&gt;Paolo
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26905429.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26905227</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T09:47:46Z</published>
	<updated>2009-12-23T09:47:46Z</updated>
	<author>
		<name>H.J. Lu-30</name>
	</author>
	<content type="html">On Wed, Dec 23, 2009 at 8:41 AM, Paolo Bonzini &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26905227&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bonzini@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; On 12/23/2009 04:19 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; It seems that just commenting out this check in fwprop.c should work.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Yes, but it would pessimize x86.
&lt;br&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;Is there a bug open for x86? Can't we make it target dependent, something
&lt;br&gt;like
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* Do not propagate loop invariant definitions inside the loop. &amp;nbsp;*/
&lt;br&gt;&amp;nbsp;if (targetm.foobar
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;&amp; DF_REF_BB (def)-&amp;gt;loop_father != DF_REF_BB (use)-&amp;gt;loop_father)
&lt;br&gt;&amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;H.J.
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26905227.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26905163</id>
	<title>Re: How should I prototype cpp_define in target patch?</title>
	<published>2009-12-23T09:42:36Z</published>
	<updated>2009-12-23T09:42:36Z</updated>
	<author>
		<name>Andrew Hutchinson</name>
	</author>
	<content type="html">Doh!
&lt;br&gt;&lt;br&gt;&lt;br&gt;Joseph S. Myers wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Wed, 23 Dec 2009, Andrew Hutchinson wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; builtin_define_std
&lt;br&gt;&amp;gt;&amp;gt; cpp_define
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Both from c-cppbuiltin.c. These have no prototypes defined in gcc.
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; They do have prototypes, in c-common.h and cpplib.h.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-should-I-prototype-cpp_define-in-target-patch--tp26901813p26905163.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26904485</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T08:41:19Z</published>
	<updated>2009-12-23T08:41:19Z</updated>
	<author>
		<name>Paolo Bonzini-6</name>
	</author>
	<content type="html">On 12/23/2009 04:19 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt; It seems that just commenting out this check in fwprop.c should work.
&lt;br&gt;&lt;br&gt;Yes, but it would pessimize x86.
&lt;br&gt;&lt;br&gt;Paolo
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26904485.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26903989</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T08:02:44Z</published>
	<updated>2009-12-23T08:02:44Z</updated>
	<author>
		<name>Ramana Radhakrishnan-4</name>
	</author>
	<content type="html">&lt;br&gt;On Wed, 2009-12-23 at 16:00 +0100, Paolo Bonzini wrote:
&lt;br&gt;&amp;gt; On 12/23/2009 03:27 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt; &amp;gt; Do you mean if TARGET_ADDRES_COST (non-x86) is defined properly,
&lt;br&gt;&amp;gt; &amp;gt; this should be fixed? &amp;nbsp;Or it requires extra patch?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; No, if TARGET_ADDRESS_COST was fixed for x86 (and of course defined 
&lt;br&gt;&amp;gt; properly for your target), we could fix this very easily.
&lt;br&gt;&lt;br&gt;This problem appears to affect the ARM port as well - I can see this
&lt;br&gt;being useful for the ARM port and might force us to look at
&lt;br&gt;TARGET_ADDRESS_COST a little more carefully - so if you're happy to post
&lt;br&gt;the fwprop patch I'm happy to test for performance on the ARM and look
&lt;br&gt;at ADDRESS_COST carefully on the ARM.
&lt;br&gt;&lt;br&gt;cheers
&lt;br&gt;Ramana
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Paolo
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26903989.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26903785</id>
	<title>Re: How should I prototype cpp_define in target patch?</title>
	<published>2009-12-23T07:46:45Z</published>
	<updated>2009-12-23T07:46:45Z</updated>
	<author>
		<name>Joseph S. Myers</name>
	</author>
	<content type="html">On Wed, 23 Dec 2009, Andrew Hutchinson wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; builtin_define_std
&lt;br&gt;&amp;gt; cpp_define
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Both from c-cppbuiltin.c. These have no prototypes defined in gcc.
&lt;br&gt;&lt;br&gt;They do have prototypes, in c-common.h and cpplib.h.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Joseph S. Myers
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26903785&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-should-I-prototype-cpp_define-in-target-patch--tp26901813p26903785.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26903463</id>
	<title>RE: Unnecessary PRE optimization</title>
	<published>2009-12-23T07:19:09Z</published>
	<updated>2009-12-23T07:19:09Z</updated>
	<author>
		<name>Bingfeng Mei</name>
	</author>
	<content type="html">It seems that just commenting out this check in fwprop.c should work.
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* Do not propagate loop invariant definitions inside the loop. &amp;nbsp;*/
&lt;br&gt;/* &amp;nbsp;if (DF_REF_BB (def)-&amp;gt;loop_father != DF_REF_BB (use)-&amp;gt;loop_father)
&lt;br&gt;&amp;nbsp; &amp;nbsp; return;*/
&lt;br&gt;&lt;br&gt;Bingfeng
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; -----Original Message-----
&lt;br&gt;&amp;gt; From: Paolo Bonzini [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26903463&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;paolo.bonzini@...&lt;/a&gt;] On 
&lt;br&gt;&amp;gt; Behalf Of Paolo Bonzini
&lt;br&gt;&amp;gt; Sent: 23 December 2009 15:01
&lt;br&gt;&amp;gt; To: Bingfeng Mei
&lt;br&gt;&amp;gt; Cc: Steven Bosscher; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26903463&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gcc@...&lt;/a&gt;; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26903463&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dberlin@...&lt;/a&gt;
&lt;br&gt;&amp;gt; Subject: Re: Unnecessary PRE optimization
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On 12/23/2009 03:27 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt; &amp;gt; Do you mean if TARGET_ADDRES_COST (non-x86) is defined properly,
&lt;br&gt;&amp;gt; &amp;gt; this should be fixed? &amp;nbsp;Or it requires extra patch?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; No, if TARGET_ADDRESS_COST was fixed for x86 (and of course defined 
&lt;br&gt;&amp;gt; properly for your target), we could fix this very easily.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Paolo
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26903463.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26903385</id>
	<title>target hooks / plugins</title>
	<published>2009-12-23T07:12:56Z</published>
	<updated>2009-12-23T07:12:56Z</updated>
	<author>
		<name>Joern Rennecke-4</name>
	</author>
	<content type="html">Target hooks would often be interesting for plugins to modify. &amp;nbsp;And
&lt;br&gt;some proposed new plugin callbacks would also be interesting to have as
&lt;br&gt;target hooks. &amp;nbsp;Therefore, I would like target hooks to become writeable
&lt;br&gt;by plugins, and make it much easier to add new target hooks in the GCC
&lt;br&gt;sources.
&lt;br&gt;&lt;br&gt;Right now, to make a new target hook, you have to add a new field in
&lt;br&gt;target.h, define a new default in target-def.h, place the new macro
&lt;br&gt;in exactly the right position there of the right initializer macro,
&lt;br&gt;describe the new hook in tm.texi, and if you need a new function with
&lt;br&gt;a bunch of parameters returning a constant, you have to add this to
&lt;br&gt;hooks.c .
&lt;br&gt;&lt;br&gt;I would like to be able to do all this by adding a single entry in a
&lt;br&gt;new definition file; and the information should also be usable by
&lt;br&gt;plugin sources so that they can automatically make wrappers for all
&lt;br&gt;function-type hooks.
&lt;br&gt;&lt;br&gt;Most of the ICI unroll_parameter_handler / graphite_parameter_handler
&lt;br&gt;callbacks can the be made into target hooks.
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/plugin-hooks-tp26076637p26903385.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26903259</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T07:00:38Z</published>
	<updated>2009-12-23T07:00:38Z</updated>
	<author>
		<name>Paolo Bonzini-6</name>
	</author>
	<content type="html">On 12/23/2009 03:27 PM, Bingfeng Mei wrote:
&lt;br&gt;&amp;gt; Do you mean if TARGET_ADDRES_COST (non-x86) is defined properly,
&lt;br&gt;&amp;gt; this should be fixed? &amp;nbsp;Or it requires extra patch?
&lt;br&gt;&lt;br&gt;No, if TARGET_ADDRESS_COST was fixed for x86 (and of course defined 
&lt;br&gt;properly for your target), we could fix this very easily.
&lt;br&gt;&lt;br&gt;Paolo
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26903259.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26903205</id>
	<title>Re: Preserving order of variable declarations</title>
	<published>2009-12-23T06:57:17Z</published>
	<updated>2009-12-23T06:57:17Z</updated>
	<author>
		<name>Diego Novillo-3</name>
	</author>
	<content type="html">On Tue, Dec 22, 2009 at 11:47, Aravinda &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26903205&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;aravindakidambi@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; Is this is the only way it can be done ? Or can I have
&lt;br&gt;&amp;gt; (non-temporary)variables inserted whos order can be preserved always ?
&lt;br&gt;&lt;br&gt;Not really, the compiler will reorder variables in the stack in almost
&lt;br&gt;arbitrary ways. &amp;nbsp;Wrapping them in structs is the safest approach.
&lt;br&gt;&lt;br&gt;&lt;br&gt;Diego.
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Preserving-order-of-variable-declarations-tp26891029p26903205.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26902860</id>
	<title>RE: Unnecessary PRE optimization</title>
	<published>2009-12-23T06:27:15Z</published>
	<updated>2009-12-23T06:27:15Z</updated>
	<author>
		<name>Bingfeng Mei</name>
	</author>
	<content type="html">Do you mean if TARGET_ADDRES_COST (non-x86) is defined properly, 
&lt;br&gt;this should be fixed? &amp;nbsp;Or it requires extra patch?
&lt;br&gt;&lt;br&gt;Bingfeng
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; -----Original Message-----
&lt;br&gt;&amp;gt; From: Paolo Bonzini [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26902860&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;paolo.bonzini@...&lt;/a&gt;] On 
&lt;br&gt;&amp;gt; Behalf Of Paolo Bonzini
&lt;br&gt;&amp;gt; Sent: 23 December 2009 13:28
&lt;br&gt;&amp;gt; To: Steven Bosscher
&lt;br&gt;&amp;gt; Cc: Bingfeng Mei; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26902860&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gcc@...&lt;/a&gt;; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26902860&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dberlin@...&lt;/a&gt;
&lt;br&gt;&amp;gt; Subject: Re: Unnecessary PRE optimization
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On 12/23/2009 01:01 PM, Steven Bosscher wrote:
&lt;br&gt;&amp;gt; &amp;gt; On Wed, Dec 23, 2009 at 12:49 PM, Bingfeng 
&lt;br&gt;&amp;gt; Mei&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26902860&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bmei@...&lt;/a&gt;&amp;gt; &amp;nbsp;wrote:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Hello,
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; I encounter an issue with PRE optimization, which created worse
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Is this at -O2 or -O3?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I think this could be fixed if fwprop propagated addresses 
&lt;br&gt;&amp;gt; into loops; 
&lt;br&gt;&amp;gt; it doesn't because it made performance worse on x86. &amp;nbsp;The 
&lt;br&gt;&amp;gt; real reason is 
&lt;br&gt;&amp;gt; &amp;quot;address_cost on x86 sucks and nobody knows how to fix it 
&lt;br&gt;&amp;gt; exactly&amp;quot;, but 
&lt;br&gt;&amp;gt; the performance hit was bad enough that we (Steven Bosscher and I) 
&lt;br&gt;&amp;gt; decided to put that hack into fwprop.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Paolo
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26902860.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26902688</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T06:09:54Z</published>
	<updated>2009-12-23T06:09:54Z</updated>
	<author>
		<name>Paolo Bonzini-6</name>
	</author>
	<content type="html">On 12/23/2009 03:05 PM, Joern Rennecke wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; So if this is only useful for a limited set of targets, why isn't it
&lt;br&gt;&amp;gt; controlled by an option or a target hook so that it is only turned on
&lt;br&gt;&amp;gt; on the targets where it is deemed to make sense overall?
&lt;br&gt;&lt;br&gt;Well, this optimization is basically the opposite of loop-invariant 
&lt;br&gt;motion, so there is some merit in not doing it: you could also tweak 
&lt;br&gt;loop-invariant motion to not hoist unnecessarily (and increase register 
&lt;br&gt;pressure unnecessarily) instead of relying on fwprop undoing it. &amp;nbsp;Indeed 
&lt;br&gt;in trunk loop-invariant motion is not hoisting cheap addresses anymore. 
&lt;br&gt;&amp;nbsp; Bingfeng is seeing the problem because in his case PRE is doing the 
&lt;br&gt;hoisting rather than LIM.
&lt;br&gt;&lt;br&gt;Paolo
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26902688.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26902635</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T06:05:54Z</published>
	<updated>2009-12-23T06:05:54Z</updated>
	<author>
		<name>Joern Rennecke-4</name>
	</author>
	<content type="html">Quoting Paolo Bonzini &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26902635&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bonzini@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On 12/23/2009 01:01 PM, Steven Bosscher wrote:
&lt;br&gt;&amp;gt;&amp;gt; On Wed, Dec 23, 2009 at 12:49 PM, Bingfeng Mei&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26902635&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bmei@...&lt;/a&gt;&amp;gt; &amp;nbsp;wrote:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hello,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I encounter an issue with PRE optimization, which created worse
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Is this at -O2 or -O3?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I think this could be fixed if fwprop propagated addresses into loops;
&lt;br&gt;&amp;gt; it doesn't because it made performance worse on x86. &amp;nbsp;The real reason
&lt;br&gt;&amp;gt; is &amp;quot;address_cost on x86 sucks and nobody knows how to fix it exactly&amp;quot;,
&lt;/div&gt;&lt;br&gt;And nobody has bothered to put in a bug report into bugzilla to describe
&lt;br&gt;what they see malfunctioning... or if they did, it doesn't mention
&lt;br&gt;address_cost.
&lt;br&gt;&lt;br&gt;&amp;gt; but the performance hit was bad enough that we (Steven Bosscher and I)
&lt;br&gt;&amp;gt; decided to put that hack into fwprop.
&lt;br&gt;&lt;br&gt;So if this is only useful for a limited set of targets, why isn't it
&lt;br&gt;controlled by an option or a target hook so that it is only turned on
&lt;br&gt;on the targets where it is deemed to make sense overall?
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26902635.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26902206</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T05:28:06Z</published>
	<updated>2009-12-23T05:28:06Z</updated>
	<author>
		<name>Paolo Bonzini-6</name>
	</author>
	<content type="html">On 12/23/2009 01:01 PM, Steven Bosscher wrote:
&lt;br&gt;&amp;gt; On Wed, Dec 23, 2009 at 12:49 PM, Bingfeng Mei&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26902206&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bmei@...&lt;/a&gt;&amp;gt; &amp;nbsp;wrote:
&lt;br&gt;&amp;gt;&amp;gt; Hello,
&lt;br&gt;&amp;gt;&amp;gt; I encounter an issue with PRE optimization, which created worse
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Is this at -O2 or -O3?
&lt;br&gt;&lt;br&gt;I think this could be fixed if fwprop propagated addresses into loops; 
&lt;br&gt;it doesn't because it made performance worse on x86. &amp;nbsp;The real reason is 
&lt;br&gt;&amp;quot;address_cost on x86 sucks and nobody knows how to fix it exactly&amp;quot;, but 
&lt;br&gt;the performance hit was bad enough that we (Steven Bosscher and I) 
&lt;br&gt;decided to put that hack into fwprop.
&lt;br&gt;&lt;br&gt;Paolo
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26902206.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26901813</id>
	<title>How should I prototype cpp_define in target patch?</title>
	<published>2009-12-23T05:05:37Z</published>
	<updated>2009-12-23T05:05:37Z</updated>
	<author>
		<name>Andrew Hutchinson</name>
	</author>
	<content type="html">I want to post patch for
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42457&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42457&lt;/a&gt;&lt;br&gt;&lt;br&gt;The code moved out to -c.c file ALREADY uses:
&lt;br&gt;&lt;br&gt;builtin_define_std
&lt;br&gt;cpp_define
&lt;br&gt;&lt;br&gt;Both from c-cppbuiltin.c. These have no prototypes defined in gcc.
&lt;br&gt;&lt;br&gt;So of course there are warnings emitted.
&lt;br&gt;&lt;br&gt;Is this OK?
&lt;br&gt;Should I locally define prototypes?
&lt;br&gt;Something else?
&lt;br&gt;&lt;br&gt;Andy
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-should-I-prototype-cpp_define-in-target-patch--tp26901813p26901813.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26901192</id>
	<title>RE: Unnecessary PRE optimization</title>
	<published>2009-12-23T04:03:09Z</published>
	<updated>2009-12-23T04:03:09Z</updated>
	<author>
		<name>Bingfeng Mei</name>
	</author>
	<content type="html">-O2 
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; -----Original Message-----
&lt;br&gt;&amp;gt; From: Steven Bosscher [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26901192&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;stevenb.gcc@...&lt;/a&gt;] 
&lt;br&gt;&amp;gt; Sent: 23 December 2009 12:01
&lt;br&gt;&amp;gt; To: Bingfeng Mei
&lt;br&gt;&amp;gt; Cc: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26901192&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gcc@...&lt;/a&gt;; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26901192&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dberlin@...&lt;/a&gt;
&lt;br&gt;&amp;gt; Subject: Re: Unnecessary PRE optimization
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Wed, Dec 23, 2009 at 12:49 PM, Bingfeng Mei 
&lt;br&gt;&amp;gt; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26901192&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bmei@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; Hello,
&lt;br&gt;&amp;gt; &amp;gt; I encounter an issue with PRE optimization, which created worse
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Is this at -O2 or -O3?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Ciao!
&lt;br&gt;&amp;gt; Steven
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26901192.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26901172</id>
	<title>Re: Unnecessary PRE optimization</title>
	<published>2009-12-23T04:01:17Z</published>
	<updated>2009-12-23T04:01:17Z</updated>
	<author>
		<name>Steven Bosscher-6</name>
	</author>
	<content type="html">On Wed, Dec 23, 2009 at 12:49 PM, Bingfeng Mei &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26901172&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;bmei@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; Hello,
&lt;br&gt;&amp;gt; I encounter an issue with PRE optimization, which created worse
&lt;br&gt;&lt;br&gt;Is this at -O2 or -O3?
&lt;br&gt;&lt;br&gt;Ciao!
&lt;br&gt;Steven
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26901172.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26901069</id>
	<title>Unnecessary PRE optimization</title>
	<published>2009-12-23T03:49:55Z</published>
	<updated>2009-12-23T03:49:55Z</updated>
	<author>
		<name>Bingfeng Mei</name>
	</author>
	<content type="html">Hello,
&lt;br&gt;I encounter an issue with PRE optimization, which created worse
&lt;br&gt;code than no optimization.
&lt;br&gt;&lt;br&gt;This the test function: 
&lt;br&gt;&lt;br&gt;void foo(int *data, int *m_v4w, int num)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; int i;
&lt;br&gt;&amp;nbsp; int m0;
&lt;br&gt;&amp;nbsp; for( i=0; i&amp;lt;num; i++ )
&lt;br&gt;&amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; int *data1 = (data[i] - 2);
&lt;br&gt;&amp;nbsp; &amp;nbsp; int *data2 = &amp;nbsp;data[i];
&lt;br&gt;&amp;nbsp; &amp;nbsp; int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
&lt;br&gt;&amp;nbsp; &amp;nbsp; int d0, d1, d2, d3;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; d0 = data1[0];
&lt;br&gt;&amp;nbsp; &amp;nbsp; d1 = data2[0];
&lt;br&gt;&amp;nbsp; &amp;nbsp; d2 = data1[1];
&lt;br&gt;&amp;nbsp; &amp;nbsp; d3 = data2[1];
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp0 = m_v4w[0];
&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp1 = m_v4w[2];
&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp2 = m_v4w[4];
&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp3 = m_v4w[6];
&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp4 = m_v4w[8];
&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp5 = m_v4w[10];
&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp6 = m_v4w[12];
&lt;br&gt;&amp;nbsp; &amp;nbsp; tmp7 = m_v4w[14];
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 = tmp0 * d0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 += tmp1 * d0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 += tmp2 * d1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 += tmp3 * d1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 += tmp4 * d2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 += tmp5 * d2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 += tmp6 * d3;
&lt;br&gt;&amp;nbsp; &amp;nbsp; m0 += tmp7 * d3;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; data2[0] = &amp;nbsp;m0;
&lt;br&gt;&amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;} &amp;nbsp; 
&lt;br&gt;&lt;br&gt;The following is the code generated for our processor (easy to understand). 
&lt;br&gt;PRE pass moves address expression (reg + constant offset) out of loop.
&lt;br&gt;It increases both size and cycle unnecessarily since our architecture support
&lt;br&gt;reg + constant offset addressing mode. It is even worse in bigger loops. 
&lt;br&gt;Too many registers cause spill in register allocation and performance suffers
&lt;br&gt;further. This happens on both 4.4 and TRUNK versions. &amp;nbsp;I also tested on x86,
&lt;br&gt;which is the same. 
&lt;br&gt;&lt;br&gt;gcc_compiled.:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .section .text, &amp;quot;axU&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .align 8
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .global	foo
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .type	foo,@function
&lt;br&gt;foo:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cmplew p0, r2, zr
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sbpt p0.0, [link]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r9, r1, #0x08	:	addw r8, r1, #0x10
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r7, r1, #0x18	:	addw r6, r1, #0x20
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r5, r1, #0x28	:	addw r4, r1, #0x30
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r3, r1, #0x38
&lt;br&gt;.L3:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loop &amp;nbsp;r2,.L6
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r10, [r0], #4!	:	ldw r11, [r1]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r14, [r9]	:	ldw r22, [r7]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r15, [r8]	:	ldw r21, [r5]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r20, [r3]	:	ldw r13, [r6]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r12, [r4]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r19, [r10]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r18, [r10, #-2]	:	ldw r17, [r10, #2]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r16, [r10, #4]	:	addw r14, r14, r11
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r15, r22, r15	:	addw r13, r21, r13
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r12, r20, r12
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mulw r15, r15, r19
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mulw r14, r14, r18	:	mulw r13, r13, r17
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mulw r12, r12, r16
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r11, r15, r14
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r11, r11, r13
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r11, r11, r12
&lt;br&gt;.L6:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stw r11, [r10]
&lt;br&gt;.L7:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sbl [link]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .size	foo,.-foo
&lt;br&gt;&lt;br&gt;&lt;br&gt;The following is assembly code generated with -fno-tree-pre option. 
&lt;br&gt;foo:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cmplew p0, r2, zr
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sbpt p0.0, [link]
&lt;br&gt;.L3:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loop &amp;nbsp;r2,.L6
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r3, [r0], #4!	:	ldw r4, [r1]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r7, [r1, #8]	:	ldw r15, [r1, #24]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r8, [r1, #16]	:	ldw r14, [r1, #40]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r13, [r1, #56]	:	ldw r6, [r1, #32]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r5, [r1, #48]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r12, [r3]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r11, [r3, #-2]	:	ldw r10, [r3, #2]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ldw r9, [r3, #4]	:	addw r7, r7, r4
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r8, r15, r8	:	addw r6, r14, r6
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r5, r13, r5
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mulw r8, r8, r12
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mulw r7, r7, r11	:	mulw r6, r6, r10
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mulw r5, r5, r9
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r4, r8, r7
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r4, r4, r6
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addw r4, r4, r5
&lt;br&gt;.L6:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stw r4, [r3]
&lt;br&gt;.L7:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sbl [link]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .size	foo,.-foo
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Unnecessary-PRE-optimization-tp26901069p26901069.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26900240</id>
	<title>Re: Question on PR36873</title>
	<published>2009-12-23T02:13:21Z</published>
	<updated>2009-12-23T02:13:21Z</updated>
	<author>
		<name>Jie Zhang-4</name>
	</author>
	<content type="html">On 12/23/2009 06:12 PM, Dave Korn wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Jie Zhang wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; typedef unsigned short u16;
&lt;br&gt;&amp;gt;&amp;gt; typedef unsigned int u32;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; u32 a(volatile u16* off) {
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return *off;
&lt;br&gt;&amp;gt;&amp;gt; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; mingw32-gcc-4.3.0.exe -c -O2 -fomit-frame-pointer -mtune=core2 test.c
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; it produces:
&lt;br&gt;&amp;gt;&amp;gt; 00000000&amp;lt;_a&amp;gt;:
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 0: &amp;nbsp; 8b 44 24 04 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp;0x4(%esp),%eax
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 4: &amp;nbsp; 0f b7 00 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movzwl (%eax),%eax
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 7: &amp;nbsp; 0f b7 c0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movzwl %ax,%eax&amp;lt;== The redundant insn
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; a: &amp;nbsp; c3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;How does it look at the RTL level? &amp;nbsp;I wonder if this situation is similar to
&lt;br&gt;&amp;gt; the one being discussed in the other current thread &amp;quot;Which optimizer should
&lt;br&gt;&amp;gt; remove redundant subreg of sign_extension?&amp;quot;
&lt;br&gt;&amp;gt;
&lt;/div&gt;With my native GCC on Debian AMD64 unstable, in t.c.128r.expand:
&lt;br&gt;&lt;br&gt;(insn 6 5 7 3 t.c:5 (set (reg:HI 58 [ D.1595 ])
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(mem/v:HI (reg/v/f:DI 60 [ off ]) [2 S2 A16])) -1 (nil))
&lt;br&gt;&lt;br&gt;(insn 7 6 8 3 t.c:5 (set (reg:SI 61)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(zero_extend:SI (reg:HI 58 [ D.1595 ]))) -1 (nil))
&lt;br&gt;&lt;br&gt;In t.c.201r.shorten:
&lt;br&gt;&lt;br&gt;(insn:TI 6 3 7 t.c:5 (set (reg:HI 0 ax [orig:58 D.1595 ] [58])
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(mem/v:HI (reg/v/f:DI 5 di [orig:60 off ] [60]) [2 S2 A16])) 53 
&lt;br&gt;{*movhi_1} (expr_list:REG_DEAD (reg/v/f:DI 5 di [orig:60 off ] [60])
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(nil)))
&lt;br&gt;&lt;br&gt;(insn:TI 7 6 18 t.c:5 (set (reg:SI 0 ax [orig:61 D.1595 ] [61])
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(zero_extend:SI (reg:HI 0 ax [orig:58 D.1595 ] [58]))) 114 
&lt;br&gt;{*zero_extendhisi2_movzwl} (nil))
&lt;br&gt;&lt;br&gt;There is a volatile flag for mem operand. If there is no such flag, I 
&lt;br&gt;think one of RTL passes might combine them. It looks similar with the 
&lt;br&gt;issue in the thread you mentioned. But the cause is different.
&lt;br&gt;&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;Jie
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-on-PR36873-tp26898659p26900240.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26900054</id>
	<title>Re: Question on PR36873</title>
	<published>2009-12-23T02:12:28Z</published>
	<updated>2009-12-23T02:12:28Z</updated>
	<author>
		<name>Dave Korn-6</name>
	</author>
	<content type="html">Jie Zhang wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; typedef unsigned short u16;
&lt;br&gt;&amp;gt; typedef unsigned int u32;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; u32 a(volatile u16* off) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return *off;
&lt;br&gt;&amp;gt; }
&lt;br&gt;&lt;br&gt;&amp;gt; mingw32-gcc-4.3.0.exe -c -O2 -fomit-frame-pointer -mtune=core2 test.c
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; it produces:
&lt;br&gt;&amp;gt; 00000000 &amp;lt;_a&amp;gt;:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;0: &amp;nbsp; 8b 44 24 04 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp;0x4(%esp),%eax
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;4: &amp;nbsp; 0f b7 00 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movzwl (%eax),%eax
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;7: &amp;nbsp; 0f b7 c0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movzwl %ax,%eax &amp;nbsp;&amp;lt;== The redundant insn
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;a: &amp;nbsp; c3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret
&lt;br&gt;&lt;br&gt;&amp;nbsp; How does it look at the RTL level? &amp;nbsp;I wonder if this situation is similar to
&lt;br&gt;the one being discussed in the other current thread &amp;quot;Which optimizer should
&lt;br&gt;remove redundant subreg of sign_extension?&amp;quot;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; cheers,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; DaveK
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-on-PR36873-tp26898659p26900054.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26900062</id>
	<title>Re: How to implement pattens with more that 30 alternatives</title>
	<published>2009-12-23T01:56:24Z</published>
	<updated>2009-12-23T01:56:24Z</updated>
	<author>
		<name>Richard Earnshaw</name>
	</author>
	<content type="html">&lt;br&gt;On Wed, 2009-12-23 at 10:11 +0530, Mohamed Shafi wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 2009/12/22 Richard Earnshaw &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26900062&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;rearnsha@...&lt;/a&gt;&amp;gt;:
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; On Mon, 2009-12-21 at 18:44 +0000, Paul Brook wrote:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; I am doing a port in GCC 4.4.0 for a 32 bit target. As a part of
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; scheduling framework i have to write the move patterns with more
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; clarity, so that i could control the scheduling with the help of
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; attributes. Re-writting the pattern resulted in movsi pattern with 41
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; alternatives :(
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; &amp;gt; Use rtl expressions instead of alternatives. e.g. arm.md:arith_shiftsi
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; &amp;gt; Or use the more modern iterators approach.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Aren't iterators for generating multiple insns (e.g. movsi and movdi) from the
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; same pattern, whereas in this case we have a single insn &amp;nbsp;that needs to accept
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; many different operand combinartions?
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Yes, but that is often better, I suspect, than having too fancy a
&lt;br&gt;&amp;gt; &amp;gt; pattern that breaks the optimization simplifications that genrecog does.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Note that the attributes that were requested could be made part of the
&lt;br&gt;&amp;gt; &amp;gt; iterator as well, using a mode_attribute.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; I can't find a back-end that does this. Can you show me a example?
&lt;/div&gt;&lt;br&gt;I think the mips port is currently the most comprehensive example for
&lt;br&gt;use of iterators.
&lt;br&gt;&lt;br&gt;R.
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-to-implement-pattens-with-more-that-30-alternatives-tp26874159p26900062.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26899753</id>
	<title>Re: Which optimizer should remove redundant subreg of sign_extension?</title>
	<published>2009-12-23T01:22:24Z</published>
	<updated>2009-12-23T01:22:24Z</updated>
	<author>
		<name>Paolo Bonzini-6</name>
	</author>
	<content type="html">On 12/22/2009 07:24 PM, Jeff Law wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On 12/22/09 11:16, Andrew Hutchinson wrote:
&lt;br&gt;&amp;gt;&amp;gt; I came across this RTL on AVR in combine dump (part of va-arg-9.c test)
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; (set (reg:QI 25 r25 [+1 ])
&lt;br&gt;&amp;gt;&amp;gt; (subreg:QI (sign_extend:HI (reg:QI 49)) 1))
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; The sign extension is completely redundant - the upper part of
&lt;br&gt;&amp;gt;&amp;gt; register is not used elsewhere
&lt;br&gt;&amp;gt;&amp;gt; - but the RTL remains unchanged through all the optimizers and
&lt;br&gt;&amp;gt;&amp;gt; sign_extension appears in final code.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Which RTL optimisation should be taking care of this? Propagation?
&lt;br&gt;&amp;gt;&amp;gt; It would help me look in the right place to understand and perhaps fix
&lt;br&gt;&amp;gt;&amp;gt; issue.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I suspect the presence of hard register is why it does not get
&lt;br&gt;&amp;gt;&amp;gt; removed. (the hard register is the function return value)
&lt;br&gt;&amp;gt; I'd look at combine, though I think it's more concerned with determining
&lt;br&gt;&amp;gt; that an extension is redundant because the bits already have the proper
&lt;br&gt;&amp;gt; value rather than the bits not being used later. It might be the case
&lt;br&gt;&amp;gt; that you can extend what's already in combine to do what you want.
&lt;/div&gt;&lt;br&gt;I think that if you add the simplification to simplify-rtx.c's 
&lt;br&gt;simplify_subreg, combine should pick it up automagically.
&lt;br&gt;&lt;br&gt;Paolo
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Which-optimizer-should-remove-redundant-subreg-of-sign_extension--tp26892121p26899753.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26899737</id>
	<title>Re: Question on PR36873</title>
	<published>2009-12-23T01:21:19Z</published>
	<updated>2009-12-23T01:21:19Z</updated>
	<author>
		<name>Jie Zhang-4</name>
	</author>
	<content type="html">On 12/23/2009 02:43 PM, Jie Zhang wrote:
&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; We just got a similar problem on Blackfin GCC recently. Let me take the
&lt;br&gt;&amp;gt; test code from the bug as an example:
&lt;br&gt;&amp;gt;
&lt;br&gt;I reduce the test case to a simpler one:
&lt;br&gt;&lt;br&gt;$ cat foo.c
&lt;br&gt;unsigned int
&lt;br&gt;foo (volatile unsigned short *p)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp;return *p;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;I the tree dump &amp;quot;foo.c.126t.optimized&amp;quot;, GCC refused to eliminate D.1256 
&lt;br&gt;because the first statement contains a volatile operand:
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;D.1256 ={v} *p;
&lt;br&gt;&amp;nbsp; &amp;nbsp;return (unsigned int) D.1256;
&lt;br&gt;&lt;br&gt;I'm not familiar with the trees. Is it possible to replace D.1256 and 
&lt;br&gt;have something like below?
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;return (unsigned int) {v} *p;
&lt;br&gt;&lt;br&gt;I experiment a little. It seems {v} will be lost in SSA name replacing 
&lt;br&gt;during out of SSA transform. Can anyone pointed me if it's possible to 
&lt;br&gt;do the replace but still keep {v}? Or I should find another way to do 
&lt;br&gt;that? Or it's wrong to do this optimization?
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;Jie
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-on-PR36873-tp26898659p26899737.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26899725</id>
	<title>Re: CSE &amp; compare/branch template problem</title>
	<published>2009-12-23T01:20:06Z</published>
	<updated>2009-12-23T01:20:06Z</updated>
	<author>
		<name>Paolo Bonzini-6</name>
	</author>
	<content type="html">On 12/21/2009 08:10 PM, Richard Henderson wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; (define_insn_and_split &amp;quot;*cmp&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=r&amp;quot;)
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(lt:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)))]
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;quot;cmp %0,%1,%2\;andi $0,$0,1&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;[(set (match_dup 0)
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(unspec:SI [(match_dup 1) (match_dup 2)] UNSPEC_CMP))
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (and:SI (match_dup 0) (const_int 1)))]
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;/div&gt;&lt;br&gt;It's actually the MSB that is affected, and the entire register is set 
&lt;br&gt;to zero if a == b. &amp;nbsp;Basically cmp/cmpu prepare rD so that a signed 
&lt;br&gt;compare-with-zero-and-branch will do the requested conditional branch.
&lt;br&gt;&lt;br&gt;So, branches are easy, but cstores are tricky. &amp;nbsp;Something like this 
&lt;br&gt;should work; indeed you do not need any CC mode:
&lt;br&gt;&lt;br&gt;;; cbranch expander, possibly use cmp/cmpu to make operand 0 into a
&lt;br&gt;;; signed comparison with zero
&lt;br&gt;(define_expand &amp;quot;cbranchsi4&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (pc)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(if_then_else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_operator 0 &amp;quot;ordered_comparison_operator&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [(match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_operand:SI 2 &amp;quot;register_operand_or_0&amp;quot; &amp;quot;&amp;quot;)])
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(label_ref (match_operand 3 &amp;quot;&amp;quot;))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(pc)))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;enum rtx_code signed =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; signed_condition (GET_CODE (operands[0]));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (operands[2] != const0_rtx || signed != GET_CODE (operands[0]))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rtx reg = gen_reg_rtx (SImode);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (signed != GET_CODE (operands[0]))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; emit_insn (gen_cmpusi (reg, operands[1], operands[2]));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; emit_insn (gen_cmpsi (reg, operands[1], operands[2]));
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; operands[1] = reg;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; operands[2] = const0_rtx;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; operands[0] = gen_rtx_fmt_ee (signed, SImode, reg, const0_rtx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;quot;)
&lt;br&gt;&lt;br&gt;;; branch instructions do a signed comparison with 0 (needs
&lt;br&gt;;; a predicate signed_comparison_operator), you could also
&lt;br&gt;;; write a pattern for indirect conditional branches
&lt;br&gt;(define_insn &amp;quot;*branch&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (pc)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(if_then_else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_operator 0 &amp;quot;signed_comparison_operator&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [(match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(const_int 0)])
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(label_ref (match_operand 2 &amp;quot;&amp;quot;))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(pc)))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;b%0i %1,%2&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;;; unspecs for cmp/cmpu
&lt;br&gt;(define_insn &amp;quot;cmpsi&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(unspec
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[(match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)] UNSPEC_CMP))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;cmp %0,%1,%2&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;(define_insn &amp;quot;cmpusi&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(unspec
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[(match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)] UNSPEC_CMPU))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;cmp %0,%1,%2&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;;; these are used for cstore tricks when the old contents of rD are
&lt;br&gt;;; significant
&lt;br&gt;(define_insn &amp;quot;*cmpsi4&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;+r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(unspec
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[(match_dup 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)] UNSPEC_CMP))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;cmp %0,%1,%2&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;(define_insn &amp;quot;*cmpusi4&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;+r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(unspec
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[(match_dup 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)] UNSPEC_CMPU))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;cmp %0,%1,%2&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;;; some cstore patterns: cstoresi4 should canonicalize lt/ltu to gt/gtu,
&lt;br&gt;;; as should CANONICALIZE_COMPARISON.
&lt;br&gt;;;
&lt;br&gt;;; common code takes care of ge/geu/le/leu as long as the rtx_costs say
&lt;br&gt;;; it's profitable. &amp;nbsp;Same for a != b for nonzero b.
&lt;br&gt;;;
&lt;br&gt;;; &amp;nbsp; ...
&lt;br&gt;;; &amp;nbsp; if (GET_CODE (operands[1]) == LT || GET_CODE (operands[1]) == LTU)
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; &amp;nbsp; operands[1] =
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gen_rtx_fmt_ee (swap_condition (GET_CODE (operands[1])),
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SImode, operands[3], operands[2]);
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; &amp;nbsp; operands[2] = XEXP (operands[1], 0);
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; &amp;nbsp; operands[3] = XEXP (operands[1], 1);
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;;; &amp;nbsp; else if (GET_CODE (operands[1]) == NE &amp;&amp; operands[3] != const0_rtx)
&lt;br&gt;;; &amp;nbsp; &amp;nbsp; FAIL;
&lt;br&gt;;;
&lt;br&gt;&lt;br&gt;;; preset rD to 1 to implement a == b
&lt;br&gt;(define_insn_and_split &amp;quot;eqsi3&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=&amp;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(eq:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_dup 0) (const_int 1))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (unspec:SI [(match_dup 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_dup 1) (match_dup 2)]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNSPEC_CMP))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (and:SI (match_dup 0) (const_int 1))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;;; use a GTU 0 to implement a != 0. &amp;nbsp;but cmpu does not accept immediates
&lt;br&gt;(define_insn_and_split &amp;quot;nesi3&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=&amp;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(ne:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (const_int 0)))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_dup 0) (const_int 0))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (unspec:SI [(match_dup 1) (match_dup 0)]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNSPEC_CMPU))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 31))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;;; these are easy at least :-)
&lt;br&gt;(define_insn_and_split &amp;quot;gtsi3&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(gt:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_dup 0) (unspec:SI [(const_int 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_dup 1) (match_dup 2)]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNSPEC_CMP))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 31))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;(define_insn_and_split &amp;quot;gtusi3&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(gtu:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_dup 0) (unspec:SI [(const_int 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_dup 1) (match_dup 2)]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNSPEC_CMPU))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (lshiftrt:SI (match_dup 0) (const_int 31))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;;; some sample combiner patterns
&lt;br&gt;&lt;br&gt;(define_insn_and_split &amp;quot;*negnesi3&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=&amp;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (neg:SI
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(ne:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (const_int 0))))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_dup 0) (const_int 0))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (unspec:SI [(match_dup 1) (match_dup 0)]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNSPEC_CMPU))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 31))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;(define_insn_and_split &amp;quot;*neggtsi3&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (neg:SI
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(gt:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;))))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_dup 0) (unspec:SI [(const_int 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_dup 1) (match_dup 2)]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNSPEC_CMP))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 31))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;(define_insn_and_split &amp;quot;*neggtusi3&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_operand:SI 0 &amp;quot;register_operand&amp;quot; &amp;quot;=r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (neg:SI
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(gtu:SI (match_operand:SI 1 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_operand:SI 2 &amp;quot;register_operand&amp;quot; &amp;quot;r&amp;quot;))))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;[(set (match_dup 0) (unspec:SI [(const_int 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(match_dup 1) (match_dup 2)]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; UNSPEC_CMPU))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (set (match_dup 0) (ashiftrt:SI (match_dup 0) (const_int 31))]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;&amp;quot;)
&lt;br&gt;&lt;br&gt;Paolo
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/CSE---compare-branch-template-problem-tp26851054p26899725.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26898778</id>
	<title>Package hosting sites for MPC</title>
	<published>2009-12-22T23:08:53Z</published>
	<updated>2009-12-22T23:08:53Z</updated>
	<author>
		<name>Kaveh R. Ghazi</name>
	</author>
	<content type="html">If anyone would like to obtain MPC from a pre-built package, there is a page
&lt;br&gt;on the MPC website listing known providers for various OSes.
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://www.multiprecision.org/index.php?prog=mpc&amp;page=packages&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.multiprecision.org/index.php?prog=mpc&amp;page=packages&lt;/a&gt;&lt;br&gt;&lt;br&gt;It's still missing several of our important platforms, including solaris,
&lt;br&gt;aix and hpux. &amp;nbsp;If you can convince your favorite package site (e.g.
&lt;br&gt;blastwave.org or hpux.connect.org.uk) to offer binaries for these systems,
&lt;br&gt;please do and notify the MPC mailing list (not me) about it here:
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://lists.gforge.inria.fr/mailman/listinfo/mpc-discuss&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.gforge.inria.fr/mailman/listinfo/mpc-discuss&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Thanks,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; --Kaveh
&lt;br&gt;--
&lt;br&gt;Kaveh R. Ghazi
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Package-hosting-sites-for-MPC-tp26898778p26898778.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26898659</id>
	<title>Question on PR36873</title>
	<published>2009-12-22T22:43:23Z</published>
	<updated>2009-12-22T22:43:23Z</updated>
	<author>
		<name>Jie Zhang-4</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;We just got a similar problem on Blackfin GCC recently. Let me take the 
&lt;br&gt;test code from the bug as an example:
&lt;br&gt;&lt;br&gt;typedef unsigned short u16;
&lt;br&gt;typedef unsigned int u32;
&lt;br&gt;&lt;br&gt;u32 a(volatile u16* off) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return *off;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;u32 b(u16* off) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return *off;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;compiled with
&lt;br&gt;mingw32-gcc-4.3.0.exe -c -O2 -fomit-frame-pointer -mtune=core2 test.c
&lt;br&gt;&lt;br&gt;it produces:
&lt;br&gt;00000000 &amp;lt;_a&amp;gt;:
&lt;br&gt;&amp;nbsp; &amp;nbsp; 0: &amp;nbsp; 8b 44 24 04 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp;0x4(%esp),%eax
&lt;br&gt;&amp;nbsp; &amp;nbsp; 4: &amp;nbsp; 0f b7 00 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movzwl (%eax),%eax
&lt;br&gt;&amp;nbsp; &amp;nbsp; 7: &amp;nbsp; 0f b7 c0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movzwl %ax,%eax &amp;nbsp;&amp;lt;== The redundant insn
&lt;br&gt;&amp;nbsp; &amp;nbsp; a: &amp;nbsp; c3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret
&lt;br&gt;&lt;br&gt;00000010 &amp;lt;_b&amp;gt;:
&lt;br&gt;&amp;nbsp; &amp;nbsp;10: &amp;nbsp; 8b 44 24 04 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp;0x4(%esp),%eax
&lt;br&gt;&amp;nbsp; &amp;nbsp;14: &amp;nbsp; 0f b7 00 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;movzwl (%eax),%eax
&lt;br&gt;&amp;nbsp; &amp;nbsp;17: &amp;nbsp; c3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret
&lt;br&gt;&lt;br&gt;I don't understand Richard's comment. What do we not optimize volatile 
&lt;br&gt;accesses in this test case. I know we cannot do many optimizations on 
&lt;br&gt;volatile accesses, but I think it's OK to remove the redundant insn in 
&lt;br&gt;this case. Could someone provide me a case in which we cannot remove it.
&lt;br&gt;&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;Jie
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-on-PR36873-tp26898659p26898659.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26898066</id>
	<title>Re: How to implement pattens with more that 30 alternatives</title>
	<published>2009-12-22T20:41:59Z</published>
	<updated>2009-12-22T20:41:59Z</updated>
	<author>
		<name>Mohamed Shafi</name>
	</author>
	<content type="html">2009/12/22 Richard Earnshaw &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26898066&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;rearnsha@...&lt;/a&gt;&amp;gt;:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On Mon, 2009-12-21 at 18:44 +0000, Paul Brook wrote:
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; I am doing a port in GCC 4.4.0 for a 32 bit target. As a part of
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; scheduling framework i have to write the move patterns with more
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; clarity, so that i could control the scheduling with the help of
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; attributes. Re-writting the pattern resulted in movsi pattern with 41
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; &amp;gt; &amp;gt; alternatives :(
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; &amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; &amp;gt; Use rtl expressions instead of alternatives. e.g. arm.md:arith_shiftsi
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;gt; Or use the more modern iterators approach.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Aren't iterators for generating multiple insns (e.g. movsi and movdi) from the
&lt;br&gt;&amp;gt;&amp;gt; same pattern, whereas in this case we have a single insn  that needs to accept
&lt;br&gt;&amp;gt;&amp;gt; many different operand combinartions?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Yes, but that is often better, I suspect, than having too fancy a
&lt;br&gt;&amp;gt; pattern that breaks the optimization simplifications that genrecog does.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Note that the attributes that were requested could be made part of the
&lt;br&gt;&amp;gt; iterator as well, using a mode_attribute.
&lt;br&gt;&amp;gt;
&lt;/div&gt;&amp;nbsp; I can't find a back-end that does this. Can you show me a example?
&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;Shafi
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-to-implement-pattens-with-more-that-30-alternatives-tp26874159p26898066.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26895515</id>
	<title>gcc-4.4-20091222 is now available</title>
	<published>2009-12-22T14:48:58Z</published>
	<updated>2009-12-22T14:48:58Z</updated>
	<author>
		<name>gccadmin</name>
	</author>
	<content type="html">Snapshot gcc-4.4-20091222 is now available on
&lt;br&gt;&amp;nbsp; ftp://gcc.gnu.org/pub/gcc/snapshots/4.4-20091222/
&lt;br&gt;and on various mirrors, see &lt;a href=&quot;http://gcc.gnu.org/mirrors.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://gcc.gnu.org/mirrors.html&lt;/a&gt;&amp;nbsp;for details.
&lt;br&gt;&lt;br&gt;This snapshot has been generated from the GCC 4.4 SVN branch
&lt;br&gt;with the following options: svn://gcc.gnu.org/svn/gcc/branches/gcc-4_4-branch revision 155409
&lt;br&gt;&lt;br&gt;You'll find:
&lt;br&gt;&lt;br&gt;gcc-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Complete GCC (includes all of below)
&lt;br&gt;&lt;br&gt;gcc-core-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C front end and core compiler
&lt;br&gt;&lt;br&gt;gcc-ada-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Ada front end and runtime
&lt;br&gt;&lt;br&gt;gcc-fortran-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp; &amp;nbsp;Fortran front end and runtime
&lt;br&gt;&lt;br&gt;gcc-g++-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;C++ front end and runtime
&lt;br&gt;&lt;br&gt;gcc-java-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Java front end and runtime
&lt;br&gt;&lt;br&gt;gcc-objc-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Objective-C front end and runtime
&lt;br&gt;&lt;br&gt;gcc-testsuite-4.4-20091222.tar.bz2 &amp;nbsp; &amp;nbsp;The GCC testsuite
&lt;br&gt;&lt;br&gt;Diffs from 4.4-20091215 are available in the diffs/ subdirectory.
&lt;br&gt;&lt;br&gt;When a particular snapshot is ready for public consumption the LATEST-4.4
&lt;br&gt;link is updated and a message is sent to the gcc list. &amp;nbsp;Please do not use
&lt;br&gt;a snapshot before it has been announced that way.
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/gcc-4.4-20091222-is-now-available-tp26895515p26895515.html" />
</entry>

</feed>
