summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog24
-rw-r--r--gcc/Makefile.in6
-rw-r--r--gcc/alias.c4
-rw-r--r--gcc/c-decl.c2
-rw-r--r--gcc/expr.c11
-rw-r--r--gcc/jump.c3
-rw-r--r--gcc/objc/objc-act.c26
-rw-r--r--gcc/objc/objc-lang.c3
-rw-r--r--gcc/optabs.c21
-rw-r--r--gcc/regclass.c5
-rw-r--r--gcc/timevar.def4
11 files changed, 99 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6e1633b4571..b3fc381d9a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,27 @@
+Tue Feb 25 22:46:27 CET 2003 Jan Hubicka <jh@suse.cz>
+
+ * objc-act.c: Include cgraph.h
+ (mark_referenced_methods): New function.
+ (objc_init): Call it.
+ * objc-lang.c (LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION): Set.
+
+ * c-decl.c (finish_function): Honor can_defer_p even in unit-at-a-time
+ mode.
+
+ * optabs.c (expand_fix): Do not widen the input operand.
+
+ * expr.c (emit_group_store): Fix crash when converting single
+ register into complex register.
+
+ * Makefile.in (jump.o, regclass.o, alias.o): Add dependency on timevar.h
+ * alias.c: Include timevar.h
+ (init_alias_analysis): Set timevar
+ * jump.c: Include timevar.h
+ (rebuild_jump_labels): Set timevar
+ * regcalss.c: Include timevar.h
+ (reg_scan): Set timevar
+ * timevar.def (TV_ALIAS_ANALYSIS, TV_REG_SCAN, TV_REBUILD_JUMP): New
+
2003-02-26 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
* cse.c (count_reg_usage): Fix handling of REG_EQUAL notes.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 600fea65f7a..9510321e339 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1526,7 +1526,7 @@ integrate.o : integrate.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $
$(PARAMS_H) $(TM_P_H) $(TARGET_H) langhooks.h gt-integrate.h
jump.o : jump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \
hard-reg-set.h $(REGS_H) insn-config.h $(RECOG_H) $(EXPR_H) real.h except.h function.h \
- toplev.h $(INSN_ATTR_H) $(TM_P_H) reload.h $(PREDICT_H)
+ toplev.h $(INSN_ATTR_H) $(TM_P_H) reload.h $(PREDICT_H) $(TIMEVAR_H)
simplify-rtx.o : simplify-rtx.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(REGS_H) hard-reg-set.h flags.h real.h insn-config.h $(RECOG_H) $(EXPR_H) toplev.h \
@@ -1623,7 +1623,7 @@ combine.o : combine.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags
$(BASIC_BLOCK_H) $(RECOG_H) real.h hard-reg-set.h toplev.h $(TM_P_H)
regclass.o : regclass.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
hard-reg-set.h flags.h $(BASIC_BLOCK_H) $(REGS_H) insn-config.h $(RECOG_H) reload.h \
- real.h toplev.h function.h output.h $(GGC_H) $(TM_P_H) $(EXPR_H)
+ real.h toplev.h function.h output.h $(GGC_H) $(TM_P_H) $(EXPR_H) $(TIMEVAR_H)
local-alloc.o : local-alloc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
flags.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h insn-config.h $(RECOG_H) \
output.h function.h $(INSN_ATTR_H) toplev.h except.h $(TM_P_H)
@@ -1664,7 +1664,7 @@ reorg.o : reorg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) condition
alias.o : alias.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \
hard-reg-set.h $(BASIC_BLOCK_H) $(REGS_H) toplev.h output.h $(EXPR_H) \
$(GGC_H) function.h cselib.h $(TREE_H) $(TM_P_H) langhooks.h $(TARGET_H) \
- gt-alias.h
+ gt-alias.h $(TIMEVAR_H)
regmove.o : regmove.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) insn-config.h \
$(RECOG_H) output.h $(REGS_H) hard-reg-set.h flags.h function.h \
$(EXPR_H) $(BASIC_BLOCK_H) toplev.h $(TM_P_H) except.h reload.h
diff --git a/gcc/alias.c b/gcc/alias.c
index de8d8d7c221..9be3aa05534 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -39,6 +39,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "splay-tree.h"
#include "ggc.h"
#include "langhooks.h"
+#include "timevar.h"
#include "target.h"
/* The alias sets assigned to MEMs assist the back-end in determining
@@ -2745,6 +2746,8 @@ init_alias_analysis ()
unsigned int ui;
rtx insn;
+ timevar_push (TV_ALIAS_ANALYSIS);
+
reg_known_value_size = maxreg;
reg_known_value
@@ -2950,6 +2953,7 @@ init_alias_analysis ()
new_reg_base_value = 0;
free (reg_seen);
reg_seen = 0;
+ timevar_pop (TV_ALIAS_ANALYSIS);
}
void
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 66a57dbe505..a5bb317bde7 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -6413,7 +6413,7 @@ finish_function (nested, can_defer_p)
free_after_compilation (cfun);
cfun = NULL;
- if (flag_unit_at_a_time)
+ if (flag_unit_at_a_time && can_defer_p)
{
cgraph_finalize_function (fndecl, DECL_SAVED_TREE (fndecl));
current_function_decl = NULL;
diff --git a/gcc/expr.c b/gcc/expr.c
index d8f4c7967ea..9643a558c73 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -2477,6 +2477,15 @@ emit_group_store (orig_dst, src, ssize)
bytepos -= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)));
dest = XEXP (dst, 1);
}
+ else if (bytepos == 0 && XVECLEN (src, 0))
+ {
+ dest = assign_stack_temp (GET_MODE (dest),
+ GET_MODE_SIZE (GET_MODE (dest)), 0);
+ emit_move_insn (adjust_address (dest, GET_MODE (tmps[i]), bytepos),
+ tmps[i]);
+ dst = dest;
+ break;
+ }
else
abort ();
}
@@ -2495,7 +2504,7 @@ emit_group_store (orig_dst, src, ssize)
emit_queue ();
/* Copy from the pseudo into the (probable) hard reg. */
- if (GET_CODE (dst) == REG)
+ if (orig_dst != dst)
emit_move_insn (orig_dst, dst);
}
diff --git a/gcc/jump.c b/gcc/jump.c
index e18abef51a7..15c9d36618f 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -53,6 +53,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "reload.h"
#include "predict.h"
+#include "timevar.h"
/* Optimize jump y; x: ... y: jumpif... x?
Don't know if it is worth bothering with. */
@@ -82,6 +83,7 @@ rebuild_jump_labels (f)
{
rtx insn;
+ timevar_push (TV_REBUILD_JUMP);
init_label_info (f);
mark_all_labels (f);
@@ -92,6 +94,7 @@ rebuild_jump_labels (f)
for (insn = forced_labels; insn; insn = XEXP (insn, 1))
if (GET_CODE (XEXP (insn, 0)) == CODE_LABEL)
LABEL_NUSES (XEXP (insn, 0))++;
+ timevar_pop (TV_REBUILD_JUMP);
}
/* Some old code expects exactly one BARRIER as the NEXT_INSN of a
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index fb3b79f9258..3dace91ff10 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -60,6 +60,7 @@ Boston, MA 02111-1307, USA. */
#include "debug.h"
#include "target.h"
#include "diagnostic.h"
+#include "cgraph.h"
/* This is the default way of generating a method name. */
/* I am not sure it is really correct.
@@ -294,6 +295,7 @@ static void handle_class_ref PARAMS ((tree));
static void generate_struct_by_value_array PARAMS ((void))
ATTRIBUTE_NORETURN;
static void encode_complete_bitfield PARAMS ((int, tree, int));
+static void mark_referenced_methods PARAMS ((void));
/*** Private Interface (data) ***/
@@ -486,6 +488,7 @@ objc_init (filename)
void
finish_file ()
{
+ mark_referenced_methods ();
c_objc_common_finish_file ();
/* Finalize Objective-C runtime data. No need to generate tables
@@ -4028,6 +4031,29 @@ generate_dispatch_table (type, name, size, list)
}
static void
+mark_referenced_methods ()
+{
+ struct imp_entry *impent;
+ tree chain;
+
+ for (impent = imp_list; impent; impent = impent->next)
+ {
+ chain = CLASS_CLS_METHODS (impent->imp_context);
+ while (chain)
+ {
+ cgraph_mark_needed_node (cgraph_node (METHOD_DEFINITION (chain)));
+ chain = TREE_CHAIN (chain);
+ }
+ chain = CLASS_NST_METHODS (impent->imp_context);
+ while (chain)
+ {
+ cgraph_mark_needed_node (cgraph_node (METHOD_DEFINITION (chain)));
+ chain = TREE_CHAIN (chain);
+ }
+ }
+}
+
+static void
generate_dispatch_tables ()
{
tree initlist, chain, method_list_template;
diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c
index ff17f0fd249..686e35e3d66 100644
--- a/gcc/objc/objc-lang.c
+++ b/gcc/objc/objc-lang.c
@@ -99,6 +99,9 @@ static void objc_init_options PARAMS ((void));
#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
c_convert_parm_for_inlining
+#undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION
+#define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION c_expand_body
+
#undef LANG_HOOKS_TYPE_FOR_MODE
#define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
#undef LANG_HOOKS_TYPE_FOR_SIZE
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 93b14984c31..e30e47720ca 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5119,15 +5119,26 @@ expand_fix (to, from, unsignedp)
one plus the highest signed number, convert, and add it back.
We only need to check all real modes, since we know we didn't find
- anything with a wider integer mode. */
+ anything with a wider integer mode.
+
+ This code used to extend FP value into mode wider than the destination.
+ This is not needed. Consider, for instance conversion from SFmode
+ into DImode.
+
+ The hot path trought the code is dealing with inputs smaller than 2^63
+ and doing just the conversion, so there is no bits to lose.
+
+ In the other path we know the value is positive in the range 2^63..2^64-1
+ inclusive. (as for other imput overflow happens and result is undefined)
+ So we know that the most important bit set in mantisa corresponds to
+ 2^63. The subtraction of 2^63 should not generate any rounding as it
+ simply clears out that bit. The rest is trivial. */
if (unsignedp && GET_MODE_BITSIZE (GET_MODE (to)) <= HOST_BITS_PER_WIDE_INT)
for (fmode = GET_MODE (from); fmode != VOIDmode;
fmode = GET_MODE_WIDER_MODE (fmode))
- /* Make sure we won't lose significant bits doing this. */
- if (GET_MODE_BITSIZE (fmode) > GET_MODE_BITSIZE (GET_MODE (to))
- && CODE_FOR_nothing != can_fix_p (GET_MODE (to), fmode, 0,
- &must_trunc))
+ if (CODE_FOR_nothing != can_fix_p (GET_MODE (to), fmode, 0,
+ &must_trunc))
{
int bitsize;
REAL_VALUE_TYPE offset;
diff --git a/gcc/regclass.c b/gcc/regclass.c
index fe6f0a775e2..abbd6eabe3d 100644
--- a/gcc/regclass.c
+++ b/gcc/regclass.c
@@ -43,6 +43,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "output.h"
#include "ggc.h"
+#include "timevar.h"
#ifndef REGISTER_MOVE_COST
#define REGISTER_MOVE_COST(m, x, y) 2
@@ -2338,6 +2339,8 @@ reg_scan (f, nregs, repeat)
max_parallel = 3;
max_set_parallel = 0;
+ timevar_push (TV_REG_SCAN);
+
for (insn = f; insn; insn = NEXT_INSN (insn))
if (GET_CODE (insn) == INSN
|| GET_CODE (insn) == CALL_INSN
@@ -2353,6 +2356,8 @@ reg_scan (f, nregs, repeat)
}
max_parallel += max_set_parallel;
+
+ timevar_pop (TV_REG_SCAN);
}
/* Update 'regscan' information by looking at the insns
diff --git a/gcc/timevar.def b/gcc/timevar.def
index ced2c7b10c3..f8a32f63a8f 100644
--- a/gcc/timevar.def
+++ b/gcc/timevar.def
@@ -47,6 +47,10 @@ DEFTIMEVAR (TV_DELETE_TRIVIALLY_DEAD , "trivially dead code")
/* Time spent by life analysis. */
DEFTIMEVAR (TV_LIFE , "life analysis")
DEFTIMEVAR (TV_LIFE_UPDATE , "life info update")
+
+DEFTIMEVAR (TV_ALIAS_ANALYSIS , "alias analysis")
+DEFTIMEVAR (TV_REG_SCAN , "register scan")
+DEFTIMEVAR (TV_REBUILD_JUMP , "rebuild jump labels")
/* Timing in various stages of the compiler. */
DEFTIMEVAR (TV_CPP , "preprocessing")
DEFTIMEVAR (TV_LEX , "lexical analysis")