Commit 8d074192 by Bernd Schmidt Committed by Bernd Schmidt

re PR rtl-optimization/42575 (arm-eabi-gcc 64-bit multiply weirdness)

	PR rtl-optimization/42575
	* dce.c (word_dce_process_block): Renamed from byte_dce_process_block.
	Argument AU removed.  All callers changed.  Ignore artificial refs.
	Use return value of df_word_lr_simulate_defs to decide whether an insn
	is necessary.
	(fast_dce): Rename arg to WORD_LEVEL.
	(run_word_dce): Renamed from rest_of_handle_fast_byte_dce.  No longer
	static.
	(pass_fast_rtl_byte_dce): Delete.
	* dce.h (run_word_dce): Declare.
	* df-core.c (df_print_word_regset): Renamed from df_print_byteregset.
	All callers changed.  Simplify code to only deal with two-word regs.
	* df.h (DF_WORD_LR): Renamed from DF_BYTE_LR.
	(DF_WORD_LR_BB_INFO): Renamed from DF_BYTE_LR_BB_INFO.
	(DF_WORD_LR_IN): Renamed from DF_BYTE_LR_IN.
	(DF_WORD_LR_OUT): Renamed from DF_BYTE_LR_OUT.
	(struct df_word_lr_bb_info): Renamed from df_byte_lr_bb_info.
	(df_word_lr_mark_ref): Declare.
	(df_word_lr_add_problem, df_word_lr_mark_ref, df_word_lr_simulate_defs,
	df_word_lr_simulate_uses): Declare or rename from byte variants.
	(df_byte_lr_simulate_artificial_refs_at_top,
	df_byte_lr_simulate_artificial_refs_at_end, df_byte_lr_get_regno_start,
	df_byte_lr_get_regno_len, df_compute_accessed_bytes): Delete
	declarations.
	(df_word_lr_get_bb_info): Rename from df_byte_lr_get_bb_info.
	(enum df_mm): Delete.
	* df-byte-scan.c: Delete file.
	* df-problems.c (df_word_lr_problem_data): Renamed from
	df_byte_lr_problem_data, all members deleted except for
	WORD_LR_BITMAPS, which is renamed from BYTE_LR_BITMAPS.  Uses changed.
	(df_word_lr_expand_bitmap, df_byte_lr_simulate_artificial_refs_at_top,
	df_byte_lr_simulate_artificial_refs_at_end, df_byte_lr_get_regno_start,
	df_byte_lr_get_regno_len, df_byte_lr_check_regs,
	df_byte_lr_confluence_0): Delete functions.
	(df_word_lr_free_bb_info): Renamed from df_byte_lr_free_bb_info; all
	callers changed.
	(df_word_lr_alloc): Renamed from df_byte_lr_alloc; all callers changed.
	Don't initialize members that were deleted, don't try to discover data
	about registers.  Ignore hard regs.
	(df_word_lr_reset): Renamed from df_byte_lr_reset; all callers changed.
	(df_word_lr_mark_ref): New function.
	(df_word_lr_bb_local_compute): Renamed from
	df_byte_bb_lr_local_compute; all callers changed.  Use
	df_word_lr_mark_ref.  Assert that artificial refs don't include
	pseudos.  Ignore hard registers.
	(df_word_lr_local_compute): Renamed from df_byte_lr_local_compute.
	Assert that exit block uses don't contain pseudos.
	(df_word_lr_init): Renamed from df_byte_lr_init; all callers changed.
	(df_word_lr_confluence_n): Renamed from df_byte_lr_confluence_n; all
	callers changed.  Ignore hard regs.
	(df_word_lr_transfer_function): Renamed from
	df_byte_lr_transfer_function; all callers changed.
	(df_word_lr_free): Renamed from df_byte_lr_free; all callers changed.
	(df_word_lr_top_dump): Renamed from df_byte_lr_top_dump; all callers
	changed.
	(df_word_lr_bottom_dump): Renamed from df_byte_lr_bottom_dump; all
	callers changed.
	(problem_WORD_LR): Renamed from problem_BYTE_LR; uses changed;
	confluence operator 0 set to NULL.
	(df_word_lr_add_problem): Renamed from df_byte_lr_add_problem; all
	callers changed.
	(df_word_lr_simulate_defs): Renamed from df_byte_lr_simulate_defs.
	Return bool, true if bitmap changed or insn otherwise necessary.
	All callers changed.  Simplify using df_word_lr_mark_ref.
	(df_word_lr_simulate_uses): Renamed from df_byte_lr_simulate_uses;
	all callers changed.  Simplify using df_word_lr_mark_ref.
	* lower-subreg.c: Include "dce.h"
	(decompose_multiword_subregs): Call run_word_dce if df available.
	* Makefile.in (lower-subreg.o): Adjust dependencies.
	(df-byte-scan.o): Delete.
	* timevar.def (TV_DF_WORD_LR): Renamed from TV_DF_BYTE_LR.

From-SVN: r162678
parent 9b638c03
2010-07-29 Bernd Schmidt <bernds@codesourcery.com>
PR rtl-optimization/42575
* dce.c (word_dce_process_block): Renamed from byte_dce_process_block.
Argument AU removed. All callers changed. Ignore artificial refs.
Use return value of df_word_lr_simulate_defs to decide whether an insn
is necessary.
(fast_dce): Rename arg to WORD_LEVEL.
(run_word_dce): Renamed from rest_of_handle_fast_byte_dce. No longer
static.
(pass_fast_rtl_byte_dce): Delete.
* dce.h (run_word_dce): Declare.
* df-core.c (df_print_word_regset): Renamed from df_print_byteregset.
All callers changed. Simplify code to only deal with two-word regs.
* df.h (DF_WORD_LR): Renamed from DF_BYTE_LR.
(DF_WORD_LR_BB_INFO): Renamed from DF_BYTE_LR_BB_INFO.
(DF_WORD_LR_IN): Renamed from DF_BYTE_LR_IN.
(DF_WORD_LR_OUT): Renamed from DF_BYTE_LR_OUT.
(struct df_word_lr_bb_info): Renamed from df_byte_lr_bb_info.
(df_word_lr_mark_ref): Declare.
(df_word_lr_add_problem, df_word_lr_mark_ref, df_word_lr_simulate_defs,
df_word_lr_simulate_uses): Declare or rename from byte variants.
(df_byte_lr_simulate_artificial_refs_at_top,
df_byte_lr_simulate_artificial_refs_at_end, df_byte_lr_get_regno_start,
df_byte_lr_get_regno_len, df_compute_accessed_bytes): Delete
declarations.
(df_word_lr_get_bb_info): Rename from df_byte_lr_get_bb_info.
(enum df_mm): Delete.
* df-byte-scan.c: Delete file.
* df-problems.c (df_word_lr_problem_data): Renamed from
df_byte_lr_problem_data, all members deleted except for
WORD_LR_BITMAPS, which is renamed from BYTE_LR_BITMAPS. Uses changed.
(df_word_lr_expand_bitmap, df_byte_lr_simulate_artificial_refs_at_top,
df_byte_lr_simulate_artificial_refs_at_end, df_byte_lr_get_regno_start,
df_byte_lr_get_regno_len, df_byte_lr_check_regs,
df_byte_lr_confluence_0): Delete functions.
(df_word_lr_free_bb_info): Renamed from df_byte_lr_free_bb_info; all
callers changed.
(df_word_lr_alloc): Renamed from df_byte_lr_alloc; all callers changed.
Don't initialize members that were deleted, don't try to discover data
about registers. Ignore hard regs.
(df_word_lr_reset): Renamed from df_byte_lr_reset; all callers changed.
(df_word_lr_mark_ref): New function.
(df_word_lr_bb_local_compute): Renamed from
df_byte_bb_lr_local_compute; all callers changed. Use
df_word_lr_mark_ref. Assert that artificial refs don't include
pseudos. Ignore hard registers.
(df_word_lr_local_compute): Renamed from df_byte_lr_local_compute.
Assert that exit block uses don't contain pseudos.
(df_word_lr_init): Renamed from df_byte_lr_init; all callers changed.
(df_word_lr_confluence_n): Renamed from df_byte_lr_confluence_n; all
callers changed. Ignore hard regs.
(df_word_lr_transfer_function): Renamed from
df_byte_lr_transfer_function; all callers changed.
(df_word_lr_free): Renamed from df_byte_lr_free; all callers changed.
(df_word_lr_top_dump): Renamed from df_byte_lr_top_dump; all callers
changed.
(df_word_lr_bottom_dump): Renamed from df_byte_lr_bottom_dump; all
callers changed.
(problem_WORD_LR): Renamed from problem_BYTE_LR; uses changed;
confluence operator 0 set to NULL.
(df_word_lr_add_problem): Renamed from df_byte_lr_add_problem; all
callers changed.
(df_word_lr_simulate_defs): Renamed from df_byte_lr_simulate_defs.
Return bool, true if bitmap changed or insn otherwise necessary.
All callers changed. Simplify using df_word_lr_mark_ref.
(df_word_lr_simulate_uses): Renamed from df_byte_lr_simulate_uses;
all callers changed. Simplify using df_word_lr_mark_ref.
* lower-subreg.c: Include "dce.h"
(decompose_multiword_subregs): Call run_word_dce if df available.
* Makefile.in (lower-subreg.o): Adjust dependencies.
(df-byte-scan.o): Delete.
* timevar.def (TV_DF_WORD_LR): Renamed from TV_DF_BYTE_LR.
2010-07-29 Richard Guenther <rguenther@suse.de> 2010-07-29 Richard Guenther <rguenther@suse.de>
* tree.c (build_vector): Assert that the vector constant * tree.c (build_vector): Assert that the vector constant
......
...@@ -1202,7 +1202,6 @@ OBJS-common = \ ...@@ -1202,7 +1202,6 @@ OBJS-common = \
dce.o \ dce.o \
ddg.o \ ddg.o \
debug.o \ debug.o \
df-byte-scan.o \
df-core.o \ df-core.o \
df-problems.o \ df-problems.o \
df-scan.o \ df-scan.o \
...@@ -3167,8 +3166,6 @@ df-scan.o : df-scan.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ ...@@ -3167,8 +3166,6 @@ df-scan.o : df-scan.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
hard-reg-set.h $(BASIC_BLOCK_H) $(DF_H) $(BITMAP_H) sbitmap.h $(TIMEVAR_H) \ hard-reg-set.h $(BASIC_BLOCK_H) $(DF_H) $(BITMAP_H) sbitmap.h $(TIMEVAR_H) \
$(TM_P_H) $(FLAGS_H) $(TARGET_H) $(TARGET_DEF_H) $(TREE_H) output.h \ $(TM_P_H) $(FLAGS_H) $(TARGET_H) $(TARGET_DEF_H) $(TREE_H) output.h \
$(TREE_PASS_H) $(EMIT_RTL_H) $(TREE_PASS_H) $(EMIT_RTL_H)
df-byte-scan.o : df-byte-scan.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(TM_P_H) $(DF_H) output.h $(DBGCNT_H)
regstat.o : regstat.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ regstat.o : regstat.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(TM_P_H) $(FLAGS_H) $(REGS_H) output.h $(EXCEPT_H) hard-reg-set.h \ $(TM_P_H) $(FLAGS_H) $(REGS_H) output.h $(EXCEPT_H) hard-reg-set.h \
$(BASIC_BLOCK_H) $(TIMEVAR_H) $(DF_H) $(BASIC_BLOCK_H) $(TIMEVAR_H) $(DF_H)
...@@ -3487,7 +3484,7 @@ dbgcnt.o: dbgcnt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TOPLEV_H) $(DIAGNOSTIC_ ...@@ -3487,7 +3484,7 @@ dbgcnt.o: dbgcnt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TOPLEV_H) $(DIAGNOSTIC_
lower-subreg.o : lower-subreg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ lower-subreg.o : lower-subreg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(MACHMODE_H) $(TM_H) $(RTL_H) $(TM_P_H) $(TIMEVAR_H) $(FLAGS_H) \ $(MACHMODE_H) $(TM_H) $(RTL_H) $(TM_P_H) $(TIMEVAR_H) $(FLAGS_H) \
insn-config.h $(BASIC_BLOCK_H) $(RECOG_H) $(OBSTACK_H) $(BITMAP_H) \ insn-config.h $(BASIC_BLOCK_H) $(RECOG_H) $(OBSTACK_H) $(BITMAP_H) \
$(EXPR_H) $(EXCEPT_H) $(REGS_H) $(TREE_PASS_H) $(DF_H) $(EXPR_H) $(EXCEPT_H) $(REGS_H) $(TREE_PASS_H) $(DF_H) dce.h
target-globals.o : target-globals.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ target-globals.o : target-globals.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) insn-config.h $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h \ $(TM_H) insn-config.h $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h \
$(FLAGS_H) $(REGS_H) $(RTL_H) reload.h expmed.h $(EXPR_H) $(OPTABS_H) \ $(FLAGS_H) $(REGS_H) $(RTL_H) reload.h expmed.h $(EXPR_H) $(OPTABS_H) \
......
...@@ -767,12 +767,11 @@ struct rtl_opt_pass pass_ud_rtl_dce = ...@@ -767,12 +767,11 @@ struct rtl_opt_pass pass_ud_rtl_dce =
artificial uses. */ artificial uses. */
static bool static bool
byte_dce_process_block (basic_block bb, bool redo_out, bitmap au) word_dce_process_block (basic_block bb, bool redo_out)
{ {
bitmap local_live = BITMAP_ALLOC (&dce_tmp_bitmap_obstack); bitmap local_live = BITMAP_ALLOC (&dce_tmp_bitmap_obstack);
rtx insn; rtx insn;
bool block_changed; bool block_changed;
df_ref *def_rec;
if (redo_out) if (redo_out)
{ {
...@@ -781,8 +780,8 @@ byte_dce_process_block (basic_block bb, bool redo_out, bitmap au) ...@@ -781,8 +780,8 @@ byte_dce_process_block (basic_block bb, bool redo_out, bitmap au)
set. */ set. */
edge e; edge e;
edge_iterator ei; edge_iterator ei;
df_confluence_function_n con_fun_n = df_byte_lr->problem->con_fun_n; df_confluence_function_n con_fun_n = df_word_lr->problem->con_fun_n;
bitmap_clear (DF_BYTE_LR_OUT (bb)); bitmap_clear (DF_WORD_LR_OUT (bb));
FOR_EACH_EDGE (e, ei, bb->succs) FOR_EACH_EDGE (e, ei, bb->succs)
(*con_fun_n) (e); (*con_fun_n) (e);
} }
...@@ -790,76 +789,38 @@ byte_dce_process_block (basic_block bb, bool redo_out, bitmap au) ...@@ -790,76 +789,38 @@ byte_dce_process_block (basic_block bb, bool redo_out, bitmap au)
if (dump_file) if (dump_file)
{ {
fprintf (dump_file, "processing block %d live out = ", bb->index); fprintf (dump_file, "processing block %d live out = ", bb->index);
df_print_byte_regset (dump_file, DF_BYTE_LR_OUT (bb)); df_print_word_regset (dump_file, DF_WORD_LR_OUT (bb));
} }
bitmap_copy (local_live, DF_BYTE_LR_OUT (bb)); bitmap_copy (local_live, DF_WORD_LR_OUT (bb));
df_byte_lr_simulate_artificial_refs_at_end (bb, local_live);
FOR_BB_INSNS_REVERSE (bb, insn) FOR_BB_INSNS_REVERSE (bb, insn)
if (INSN_P (insn)) if (INSN_P (insn))
{ {
/* The insn is needed if there is someone who uses the output. */ bool any_changed;
for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
{
df_ref def = *def_rec;
unsigned int last;
unsigned int dregno = DF_REF_REGNO (def);
unsigned int start = df_byte_lr_get_regno_start (dregno);
unsigned int len = df_byte_lr_get_regno_len (dregno);
unsigned int sb;
unsigned int lb;
/* This is one of the only places where DF_MM_MAY should
be used for defs. Need to make sure that we are
checking for all of the bits that may be used. */
if (!df_compute_accessed_bytes (def, DF_MM_MAY, &sb, &lb))
{
start += sb;
len = lb - sb;
}
if (bitmap_bit_p (au, dregno))
{
mark_insn (insn, true);
goto quickexit;
}
last = start + len;
while (start < last)
if (bitmap_bit_p (local_live, start++))
{
mark_insn (insn, true);
goto quickexit;
}
}
quickexit:
/* No matter if the instruction is needed or not, we remove /* No matter if the instruction is needed or not, we remove
any regno in the defs from the live set. */ any regno in the defs from the live set. */
df_byte_lr_simulate_defs (insn, local_live); any_changed = df_word_lr_simulate_defs (insn, local_live);
if (any_changed)
mark_insn (insn, true);
/* On the other hand, we do not allow the dead uses to set /* On the other hand, we do not allow the dead uses to set
anything in local_live. */ anything in local_live. */
if (marked_insn_p (insn)) if (marked_insn_p (insn))
df_byte_lr_simulate_uses (insn, local_live); df_word_lr_simulate_uses (insn, local_live);
if (dump_file) if (dump_file)
{ {
fprintf (dump_file, "finished processing insn %d live out = ", fprintf (dump_file, "finished processing insn %d live out = ",
INSN_UID (insn)); INSN_UID (insn));
df_print_byte_regset (dump_file, local_live); df_print_word_regset (dump_file, local_live);
} }
} }
df_byte_lr_simulate_artificial_refs_at_top (bb, local_live); block_changed = !bitmap_equal_p (local_live, DF_WORD_LR_IN (bb));
block_changed = !bitmap_equal_p (local_live, DF_BYTE_LR_IN (bb));
if (block_changed) if (block_changed)
bitmap_copy (DF_BYTE_LR_IN (bb), local_live); bitmap_copy (DF_WORD_LR_IN (bb), local_live);
BITMAP_FREE (local_live); BITMAP_FREE (local_live);
return block_changed; return block_changed;
} }
...@@ -938,12 +899,12 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au) ...@@ -938,12 +899,12 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au)
} }
/* Perform fast DCE once initialization is done. If BYTE_LEVEL is /* Perform fast DCE once initialization is done. If WORD_LEVEL is
true, use the byte level dce, otherwise do it at the pseudo true, use the word level dce, otherwise do it at the pseudo
level. */ level. */
static void static void
fast_dce (bool byte_level) fast_dce (bool word_level)
{ {
int *postorder = df_get_postorder (DF_BACKWARD); int *postorder = df_get_postorder (DF_BACKWARD);
int n_blocks = df_get_n_blocks (DF_BACKWARD); int n_blocks = df_get_n_blocks (DF_BACKWARD);
...@@ -985,10 +946,9 @@ fast_dce (bool byte_level) ...@@ -985,10 +946,9 @@ fast_dce (bool byte_level)
continue; continue;
} }
if (byte_level) if (word_level)
local_changed local_changed
= byte_dce_process_block (bb, bitmap_bit_p (redo_out, index), = word_dce_process_block (bb, bitmap_bit_p (redo_out, index));
bb_has_eh_pred (bb) ? au_eh : au);
else else
local_changed local_changed
= dce_process_block (bb, bitmap_bit_p (redo_out, index), = dce_process_block (bb, bitmap_bit_p (redo_out, index),
...@@ -1028,8 +988,8 @@ fast_dce (bool byte_level) ...@@ -1028,8 +988,8 @@ fast_dce (bool byte_level)
to redo the dataflow equations for the blocks that had a to redo the dataflow equations for the blocks that had a
change at the top of the block. Then we need to redo the change at the top of the block. Then we need to redo the
iteration. */ iteration. */
if (byte_level) if (word_level)
df_analyze_problem (df_byte_lr, all_blocks, postorder, n_blocks); df_analyze_problem (df_word_lr, all_blocks, postorder, n_blocks);
else else
df_analyze_problem (df_lr, all_blocks, postorder, n_blocks); df_analyze_problem (df_lr, all_blocks, postorder, n_blocks);
...@@ -1062,14 +1022,15 @@ rest_of_handle_fast_dce (void) ...@@ -1062,14 +1022,15 @@ rest_of_handle_fast_dce (void)
/* Fast byte level DCE. */ /* Fast byte level DCE. */
static unsigned int void
rest_of_handle_fast_byte_dce (void) run_word_dce (void)
{ {
df_byte_lr_add_problem (); timevar_push (TV_DCE);
df_word_lr_add_problem ();
init_dce (true); init_dce (true);
fast_dce (true); fast_dce (true);
fini_dce (true); fini_dce (true);
return 0; timevar_pop (TV_DCE);
} }
...@@ -1139,24 +1100,3 @@ struct rtl_opt_pass pass_fast_rtl_dce = ...@@ -1139,24 +1100,3 @@ struct rtl_opt_pass pass_fast_rtl_dce =
TODO_ggc_collect /* todo_flags_finish */ TODO_ggc_collect /* todo_flags_finish */
} }
}; };
struct rtl_opt_pass pass_fast_rtl_byte_dce =
{
{
RTL_PASS,
"byte-dce", /* name */
gate_fast_dce, /* gate */
rest_of_handle_fast_byte_dce, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_DCE, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func |
TODO_df_finish | TODO_verify_rtl_sharing |
TODO_ggc_collect /* todo_flags_finish */
}
};
...@@ -20,6 +20,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -20,6 +20,7 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_DCE_H #ifndef GCC_DCE_H
#define GCC_DCE_H #define GCC_DCE_H
extern void run_word_dce (void);
extern void run_fast_dce (void); extern void run_fast_dce (void);
extern void run_fast_df_dce (void); extern void run_fast_df_dce (void);
......
...@@ -1919,58 +1919,33 @@ df_print_regset (FILE *file, bitmap r) ...@@ -1919,58 +1919,33 @@ df_print_regset (FILE *file, bitmap r)
debugging dump. */ debugging dump. */
void void
df_print_byte_regset (FILE *file, bitmap r) df_print_word_regset (FILE *file, bitmap r)
{ {
unsigned int max_reg = max_reg_num (); unsigned int max_reg = max_reg_num ();
bitmap_iterator bi;
if (r == NULL) if (r == NULL)
fputs (" (nil)", file); fputs (" (nil)", file);
else else
{ {
unsigned int i; unsigned int i;
for (i = 0; i < max_reg; i++) for (i = FIRST_PSEUDO_REGISTER; i < max_reg; i++)
{ {
unsigned int first = df_byte_lr_get_regno_start (i); bool found = (bitmap_bit_p (r, 2 * i)
unsigned int len = df_byte_lr_get_regno_len (i); || bitmap_bit_p (r, 2 * i + 1));
if (found)
if (len > 1)
{ {
bool found = false; int word;
unsigned int j; const char * sep = "";
fprintf (file, " %d", i);
EXECUTE_IF_SET_IN_BITMAP (r, first, j, bi) fprintf (file, "(");
{ for (word = 0; word < 2; word++)
found = j < first + len; if (bitmap_bit_p (r, 2 * i + word))
break; {
} fprintf (file, "%s%d", sep, word);
if (found) sep = ", ";
{ }
const char * sep = ""; fprintf (file, ")");
fprintf (file, " %d", i);
if (i < FIRST_PSEUDO_REGISTER)
fprintf (file, " [%s]", reg_names[i]);
fprintf (file, "(");
EXECUTE_IF_SET_IN_BITMAP (r, first, j, bi)
{
if (j > first + len - 1)
break;
fprintf (file, "%s%d", sep, j-first);
sep = ", ";
}
fprintf (file, ")");
}
} }
else
{
if (bitmap_bit_p (r, first))
{
fprintf (file, " %d", i);
if (i < FIRST_PSEUDO_REGISTER)
fprintf (file, " [%s]", reg_names[i]);
}
}
} }
} }
fprintf (file, "\n"); fprintf (file, "\n");
......
...@@ -52,7 +52,7 @@ union df_ref_d; ...@@ -52,7 +52,7 @@ union df_ref_d;
#define DF_LIVE 2 /* Live Registers & Uninitialized Registers */ #define DF_LIVE 2 /* Live Registers & Uninitialized Registers */
#define DF_RD 3 /* Reaching Defs. */ #define DF_RD 3 /* Reaching Defs. */
#define DF_CHAIN 4 /* Def-Use and/or Use-Def Chains. */ #define DF_CHAIN 4 /* Def-Use and/or Use-Def Chains. */
#define DF_BYTE_LR 5 /* Subreg tracking lr. */ #define DF_WORD_LR 5 /* Subreg tracking lr. */
#define DF_NOTE 6 /* REG_DEF and REG_UNUSED notes. */ #define DF_NOTE 6 /* REG_DEF and REG_UNUSED notes. */
#define DF_MD 7 /* Multiple Definitions. */ #define DF_MD 7 /* Multiple Definitions. */
...@@ -66,14 +66,6 @@ enum df_flow_dir ...@@ -66,14 +66,6 @@ enum df_flow_dir
DF_BACKWARD DF_BACKWARD
}; };
/* Used in the byte scanning to determine if may or must info is to be
returned. */
enum df_mm
{
DF_MM_MAY,
DF_MM_MUST
};
/* Descriminator for the various df_ref types. */ /* Descriminator for the various df_ref types. */
enum df_ref_class {DF_REF_BASE, DF_REF_ARTIFICIAL, DF_REF_REGULAR, DF_REF_EXTRACT}; enum df_ref_class {DF_REF_BASE, DF_REF_ARTIFICIAL, DF_REF_REGULAR, DF_REF_EXTRACT};
...@@ -624,7 +616,7 @@ struct df_d ...@@ -624,7 +616,7 @@ struct df_d
#define DF_RD_BB_INFO(BB) (df_rd_get_bb_info((BB)->index)) #define DF_RD_BB_INFO(BB) (df_rd_get_bb_info((BB)->index))
#define DF_LR_BB_INFO(BB) (df_lr_get_bb_info((BB)->index)) #define DF_LR_BB_INFO(BB) (df_lr_get_bb_info((BB)->index))
#define DF_LIVE_BB_INFO(BB) (df_live_get_bb_info((BB)->index)) #define DF_LIVE_BB_INFO(BB) (df_live_get_bb_info((BB)->index))
#define DF_BYTE_LR_BB_INFO(BB) (df_byte_lr_get_bb_info((BB)->index)) #define DF_WORD_LR_BB_INFO(BB) (df_word_lr_get_bb_info((BB)->index))
#define DF_MD_BB_INFO(BB) (df_md_get_bb_info((BB)->index)) #define DF_MD_BB_INFO(BB) (df_md_get_bb_info((BB)->index))
/* Most transformations that wish to use live register analysis will /* Most transformations that wish to use live register analysis will
...@@ -641,8 +633,8 @@ struct df_d ...@@ -641,8 +633,8 @@ struct df_d
/* These macros are used by passes that are not tolerant of /* These macros are used by passes that are not tolerant of
uninitialized variables. This intolerance should eventually uninitialized variables. This intolerance should eventually
be fixed. */ be fixed. */
#define DF_BYTE_LR_IN(BB) (&DF_BYTE_LR_BB_INFO(BB)->in) #define DF_WORD_LR_IN(BB) (&DF_WORD_LR_BB_INFO(BB)->in)
#define DF_BYTE_LR_OUT(BB) (&DF_BYTE_LR_BB_INFO(BB)->out) #define DF_WORD_LR_OUT(BB) (&DF_WORD_LR_BB_INFO(BB)->out)
/* Macros to access the elements within the ref structure. */ /* Macros to access the elements within the ref structure. */
...@@ -859,9 +851,11 @@ struct df_live_bb_info ...@@ -859,9 +851,11 @@ struct df_live_bb_info
/* Live registers, a backwards dataflow problem. These bitmaps are /* Live registers, a backwards dataflow problem. These bitmaps are
indexed by the df_byte_lr_offset array which is indexed by pseudo. */ indexed by 2 * regno for each pseudo and have two entries for each
pseudo. Only pseudos that have a size of 2 * UNITS_PER_WORD are
meaningfully tracked. */
struct df_byte_lr_bb_info struct df_word_lr_bb_info
{ {
/* Local sets to describe the basic blocks. */ /* Local sets to describe the basic blocks. */
bitmap_head def; /* The set of registers set in this block bitmap_head def; /* The set of registers set in this block
...@@ -883,7 +877,7 @@ extern struct df_d *df; ...@@ -883,7 +877,7 @@ extern struct df_d *df;
#define df_lr (df->problems_by_index[DF_LR]) #define df_lr (df->problems_by_index[DF_LR])
#define df_live (df->problems_by_index[DF_LIVE]) #define df_live (df->problems_by_index[DF_LIVE])
#define df_chain (df->problems_by_index[DF_CHAIN]) #define df_chain (df->problems_by_index[DF_CHAIN])
#define df_byte_lr (df->problems_by_index[DF_BYTE_LR]) #define df_word_lr (df->problems_by_index[DF_WORD_LR])
#define df_note (df->problems_by_index[DF_NOTE]) #define df_note (df->problems_by_index[DF_NOTE])
#define df_md (df->problems_by_index[DF_MD]) #define df_md (df->problems_by_index[DF_MD])
...@@ -933,7 +927,7 @@ extern df_ref df_find_use (rtx, rtx); ...@@ -933,7 +927,7 @@ extern df_ref df_find_use (rtx, rtx);
extern bool df_reg_used (rtx, rtx); extern bool df_reg_used (rtx, rtx);
extern void df_worklist_dataflow (struct dataflow *,bitmap, int *, int); extern void df_worklist_dataflow (struct dataflow *,bitmap, int *, int);
extern void df_print_regset (FILE *file, bitmap r); extern void df_print_regset (FILE *file, bitmap r);
extern void df_print_byte_regset (FILE *file, bitmap r); extern void df_print_word_regset (FILE *file, bitmap r);
extern void df_dump (FILE *); extern void df_dump (FILE *);
extern void df_dump_region (FILE *); extern void df_dump_region (FILE *);
extern void df_dump_start (FILE *); extern void df_dump_start (FILE *);
...@@ -972,13 +966,12 @@ extern void df_live_verify_transfer_functions (void); ...@@ -972,13 +966,12 @@ extern void df_live_verify_transfer_functions (void);
extern void df_live_add_problem (void); extern void df_live_add_problem (void);
extern void df_live_set_all_dirty (void); extern void df_live_set_all_dirty (void);
extern void df_chain_add_problem (unsigned int); extern void df_chain_add_problem (unsigned int);
extern void df_byte_lr_add_problem (void); extern void df_word_lr_add_problem (void);
extern int df_byte_lr_get_regno_start (unsigned int); extern bool df_word_lr_mark_ref (df_ref, bool, bitmap);
extern int df_byte_lr_get_regno_len (unsigned int); extern bool df_word_lr_simulate_defs (rtx, bitmap);
extern void df_byte_lr_simulate_defs (rtx, bitmap); extern void df_word_lr_simulate_uses (rtx, bitmap);
extern void df_byte_lr_simulate_uses (rtx, bitmap); extern void df_word_lr_simulate_artificial_refs_at_top (basic_block, bitmap);
extern void df_byte_lr_simulate_artificial_refs_at_top (basic_block, bitmap); extern void df_word_lr_simulate_artificial_refs_at_end (basic_block, bitmap);
extern void df_byte_lr_simulate_artificial_refs_at_end (basic_block, bitmap);
extern void df_note_add_problem (void); extern void df_note_add_problem (void);
extern void df_md_add_problem (void); extern void df_md_add_problem (void);
extern void df_md_simulate_artificial_defs_at_top (basic_block, bitmap); extern void df_md_simulate_artificial_defs_at_top (basic_block, bitmap);
...@@ -1029,11 +1022,6 @@ extern void df_compute_regs_ever_live (bool); ...@@ -1029,11 +1022,6 @@ extern void df_compute_regs_ever_live (bool);
extern bool df_read_modify_subreg_p (rtx); extern bool df_read_modify_subreg_p (rtx);
extern void df_scan_verify (void); extern void df_scan_verify (void);
/* Functions defined in df-byte-scan.c. */
extern bool df_compute_accessed_bytes (df_ref, enum df_mm,
unsigned int *, unsigned int *);
/* Get basic block info. */ /* Get basic block info. */
static inline struct df_scan_bb_info * static inline struct df_scan_bb_info *
...@@ -1081,11 +1069,11 @@ df_live_get_bb_info (unsigned int index) ...@@ -1081,11 +1069,11 @@ df_live_get_bb_info (unsigned int index)
return NULL; return NULL;
} }
static inline struct df_byte_lr_bb_info * static inline struct df_word_lr_bb_info *
df_byte_lr_get_bb_info (unsigned int index) df_word_lr_get_bb_info (unsigned int index)
{ {
if (index < df_byte_lr->block_info_size) if (index < df_word_lr->block_info_size)
return &((struct df_byte_lr_bb_info *) df_byte_lr->block_info)[index]; return &((struct df_word_lr_bb_info *) df_word_lr->block_info)[index];
else else
return NULL; return NULL;
} }
......
...@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "basic-block.h" #include "basic-block.h"
#include "recog.h" #include "recog.h"
#include "bitmap.h" #include "bitmap.h"
#include "dce.h"
#include "expr.h" #include "expr.h"
#include "except.h" #include "except.h"
#include "regs.h" #include "regs.h"
...@@ -1091,6 +1092,9 @@ decompose_multiword_subregs (void) ...@@ -1091,6 +1092,9 @@ decompose_multiword_subregs (void)
return; return;
} }
if (df)
run_word_dce ();
/* FIXME: When the dataflow branch is merged, we can change this /* FIXME: When the dataflow branch is merged, we can change this
code to look for each multi-word pseudo-register and to find each code to look for each multi-word pseudo-register and to find each
insn which sets or uses that register. That should be faster insn which sets or uses that register. That should be faster
......
...@@ -91,7 +91,7 @@ DEFTIMEVAR (TV_DF_LR , "df live regs") ...@@ -91,7 +91,7 @@ DEFTIMEVAR (TV_DF_LR , "df live regs")
DEFTIMEVAR (TV_DF_LIVE , "df live&initialized regs") DEFTIMEVAR (TV_DF_LIVE , "df live&initialized regs")
DEFTIMEVAR (TV_DF_UREC , "df uninitialized regs 2") DEFTIMEVAR (TV_DF_UREC , "df uninitialized regs 2")
DEFTIMEVAR (TV_DF_CHAIN , "df use-def / def-use chains") DEFTIMEVAR (TV_DF_CHAIN , "df use-def / def-use chains")
DEFTIMEVAR (TV_DF_BYTE_LR , "df live byte regs") DEFTIMEVAR (TV_DF_WORD_LR , "df live reg subwords")
DEFTIMEVAR (TV_DF_NOTE , "df reg dead/unused notes") DEFTIMEVAR (TV_DF_NOTE , "df reg dead/unused notes")
DEFTIMEVAR (TV_REG_STATS , "register information") DEFTIMEVAR (TV_REG_STATS , "register information")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment