diff options
author | (no author) <(no author)@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-18 20:32:56 +0000 |
---|---|---|
committer | (no author) <(no author)@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-18 20:32:56 +0000 |
commit | 2ed41cad514cd1eca2ac5a2a8851936004592768 (patch) | |
tree | b0c531ce09c2aaf2eb5d2228e13ce03d7547143b | |
parent | 7f6d1fcaa3dbfde5fe1abccbd153691c61378233 (diff) |
This commit was manufactured by cvs2svn to create taghammer-3_3-merge-20021811
'hammer-3_3-merge-20021811'.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/tags/hammer-3_3-merge-20021811@59231 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/calls.c | 15 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 12 | ||||
-rw-r--r-- | gcc/config/i386/scodbx.h | 84 | ||||
-rw-r--r-- | gcc/config/i386/xm-dgux.h | 4 | ||||
-rw-r--r-- | gcc/config/i386/xm-sun.h | 21 | ||||
-rw-r--r-- | gcc/config/i386/xm-sysv3.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.robertl/eb42.C | 19 | ||||
-rw-r--r-- | gcc/tree-inline.c | 30 | ||||
-rw-r--r-- | gcc/tree.h | 1 |
10 files changed, 65 insertions, 137 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f323ff1ebf3..a2833404637 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +Mon Nov 18 21:29:03 CET 2002 Jan Hubicka <jh@suse.cz> + + * i386.md (addqi_1_slp): Fix output template. + (subqi_1_slp): Fix type. + +Sun Nov 17 00:01:28 CET 2002 Jan Hubicka <jh@suse.cz> + + * calls.c (alloca_call_p): New global function. + * tree.h (alloca_call_p): New. + * tree-inline.c (inlinable_function_p): Do not inline when + function calls alloca. + (find_alloca_call, find_alloca_call_1): New functions. + 2002-11-18 Kazu Hirata <kazu@cs.umass.edu> * config/h8300/h8300.md (*andorqi3): Use bor between bld and diff --git a/gcc/calls.c b/gcc/calls.c index f2f9c570bf2..99722b5da2e 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -801,6 +801,21 @@ setjmp_call_p (fndecl) return special_function_p (fndecl, 0) & ECF_RETURNS_TWICE; } +/* Return true when exp contains alloca call. */ +bool +alloca_call_p (exp) + tree exp; +{ + if (TREE_CODE (exp) == CALL_EXPR + && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR + && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) + == FUNCTION_DECL) + && (special_function_p (TREE_OPERAND (TREE_OPERAND (exp, 0), 0), + 0) & ECF_MAY_BE_ALLOCA)) + return true; + return false; +} + /* Detect flags (function attributes) from the function decl or type node. */ static int diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 7f9de528371..f50a52461b2 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -6049,16 +6049,16 @@ switch (get_attr_type (insn)) { case TYPE_INCDEC: - if (operands[2] == const1_rtx) + if (operands[1] == const1_rtx) return "inc{b}\t%0"; - else if (operands[2] == constm1_rtx) + else if (operands[1] == constm1_rtx) return "dec{b}\t%0"; abort(); default: /* Make things pretty and `subl $4,%eax' rather than `addl $-4, %eax'. */ - if (GET_CODE (operands[2]) == CONST_INT - && INTVAL (operands[2]) < 0) + if (GET_CODE (operands[1]) == CONST_INT + && INTVAL (operands[1]) < 0) { operands[2] = GEN_INT (-INTVAL (operands[2])); return "sub{b}\t{%1, %0|%0, %1}"; @@ -6069,7 +6069,7 @@ [(set (attr "type") (if_then_else (match_operand:QI 2 "incdec_operand" "") (const_string "incdec") - (const_string "alu"))) + (const_string "alu1"))) (set_attr "mode" "QI")]) (define_insn "*addqi_2" @@ -6611,7 +6611,7 @@ "(! TARGET_PARTIAL_REG_STALL || optimize_size) && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)" "sub{b}\t{%1, %0|%0, %1}" - [(set_attr "type" "alu") + [(set_attr "type" "alu1") (set_attr "mode" "QI")]) (define_insn "*subqi_2" diff --git a/gcc/config/i386/scodbx.h b/gcc/config/i386/scodbx.h deleted file mode 100644 index 7da93053256..00000000000 --- a/gcc/config/i386/scodbx.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Definitions for Intel 386 running SCO Unix System V, - using dbx-in-coff encapsulation. - Copyright (C) 1992, 1995, 1996, 1999 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "i386/svr3dbx.h" - -/* Overridden defines for SCO systems from sco.h. */ - -/* By default, target has a 80387, uses IEEE compatible arithmetic, - and returns float values in the 387, ie, - (TARGET_80387 | TARGET_FLOAT_RETURNS_IN_80387) - - SCO's software emulation of a 387 fails to handle the `fucomp' - opcode. fucomp is only used when generating IEEE compliant code. - So don't make TARGET_IEEE_FP default for SCO. */ - -#undef TARGET_SUBTARGET_DEFAULT -#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_FLOAT_RETURNS) - -/* Use crt1.o as a startup file and crtn.o as a closing file. */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC \ - "%{!r:%{!z:svr3.ifile%s}%{z:svr3z.ifile%s}}\ - %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}" - -/* Library spec, including SCO international language support. */ - -#undef LIB_SPEC -#define LIB_SPEC \ - "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} %{scointl:libintl.a%s} -lc" - -/* Specify predefined symbols in preprocessor. */ - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Dunix -DM_UNIX -DM_I386 -DM_COFF -DM_WORDSWAP -Asystem=svr3" - -#undef CPP_SPEC -#define CPP_SPEC "%(cpp_cpu) %{scointl:-DM_INTERNAT}" - -/* This spec is used for telling cpp whether char is signed or not. */ - -#undef SIGNED_CHAR_SPEC -#if DEFAULT_SIGNED_CHAR -#define SIGNED_CHAR_SPEC \ - "%{funsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#else -#define SIGNED_CHAR_SPEC \ - "%{!fsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#endif - -/* caller has to pop the extra argument passed to functions that return - structures. */ - -#undef RETURN_POPS_ARGS -#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ - ((FUNDECL) && TREE_CODE (FUNDECL) == IDENTIFIER_NODE ? 0 \ - : (TARGET_RTD \ - && (TYPE_ARG_TYPES (FUNTYPE) == 0 \ - || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \ - == void_type_node))) ? (SIZE) \ - : 0) -/* On other 386 systems, the last line looks like this: - : (aggregate_value_p (TREE_TYPE (FUNTYPE))) ? GET_MODE_SIZE (Pmode) : 0) */ - -/* Handle #pragma pack. */ -#define HANDLE_SYSV_PRAGMA diff --git a/gcc/config/i386/xm-dgux.h b/gcc/config/i386/xm-dgux.h deleted file mode 100644 index 881c5c7be9d..00000000000 --- a/gcc/config/i386/xm-dgux.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Intel i386 running DG/ux */ - -/* looks just like sysv4 for now */ -#include "xm-svr4.h" diff --git a/gcc/config/i386/xm-sun.h b/gcc/config/i386/xm-sun.h deleted file mode 100644 index 6c0f0a25630..00000000000 --- a/gcc/config/i386/xm-sun.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Configuration for GNU C-compiler for Intel 80386 running SunOS 4.0. - Copyright (C) 1988, 1997 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#define USG diff --git a/gcc/config/i386/xm-sysv3.h b/gcc/config/i386/xm-sysv3.h deleted file mode 100644 index 9a655443ff5..00000000000 --- a/gcc/config/i386/xm-sysv3.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Configuration for GCC for Intel i386 running System V Release 3. */ - -#include "xm-svr3.h" diff --git a/gcc/testsuite/g++.old-deja/g++.robertl/eb42.C b/gcc/testsuite/g++.old-deja/g++.robertl/eb42.C deleted file mode 100644 index c27aa8d2df7..00000000000 --- a/gcc/testsuite/g++.old-deja/g++.robertl/eb42.C +++ /dev/null @@ -1,19 +0,0 @@ -//Build don't link: -#include <vector> -#include <algorithm> - -template <class T> class Expr -{ -public : -Expr(){}; -Expr(const T&){}; -}; - -template <class T > -inline bool compare(const Expr<T> a, const Expr<T> b){ return true; }; - -int main() -{ - std::vector<int> a(3); - std::sort( a.begin(), a.end(), compare ); // ERROR - no matching function -} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 362ddd18b57..73ba48ae51c 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -122,6 +122,8 @@ static void copy_scope_stmt PARAMS ((tree *, int *, inline_data *)); static tree initialize_inlined_parameters PARAMS ((inline_data *, tree, tree, tree)); static void remap_block PARAMS ((tree *, tree, inline_data *)); static tree add_stmt_to_compound PARAMS ((tree, tree, tree)); +static tree find_alloca_call_1 PARAMS ((tree *, int *, void *)); +static tree find_alloca_call PARAMS ((tree)); #endif /* INLINER_FOR_JAVA */ /* The approximate number of instructions per statement. This number @@ -857,6 +859,27 @@ tree_inlinable_function_p (fn) return inlinable_function_p (fn, NULL); } +/* if *TP is possibly call to alloca, return nonzero. */ +static tree +find_alloca_call_1 (tp, walk_subtrees, data) + tree *tp; + int *walk_subtrees ATTRIBUTE_UNUSED; + void *data ATTRIBUTE_UNUSED; +{ + if (alloca_call_p (*tp)) + return *tp; + return NULL; +} + +/* Return subexpression representing possible alloca call, + if any. */ +static tree +find_alloca_call (exp) + tree exp; +{ + return walk_tree (&exp, find_alloca_call_1, NULL, NULL); +} + /* Returns nonzero if FN is a function that can be inlined into the inlining context ID_. If ID_ is NULL, check whether the function can be inlined at all. */ @@ -897,6 +920,13 @@ inlinable_function_p (fn, id) else if (! (*lang_hooks.tree_inlining.disregard_inline_limits) (fn) && currfn_insns > MAX_INLINE_INSNS_SINGLE) ; + /* Refuse to inline alloca call unless user explicitly forced so as this may + change program's memory overhead drastically when the function using alloca + is called in loop. In GCC present in SPEC2000 inlining into schedule_block + cause it to require 2GB of ram instead of 256MB. */ + else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL + && find_alloca_call (DECL_SAVED_TREE (fn))) + ; /* All is well. We can inline this function. Traditionally, GCC has refused to inline functions using alloca, or functions whose values are returned in a PARALLEL, and a few other such obscure diff --git a/gcc/tree.h b/gcc/tree.h index 8e8b168583d..fc405173fac 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -3018,6 +3018,7 @@ extern rtx emit_line_note PARAMS ((const char *, int)); /* In calls.c */ extern int setjmp_call_p PARAMS ((tree)); +extern bool alloca_call_p PARAMS ((tree)); /* In attribs.c. */ |