#include "intl.h"
#include "ggc.h"
#include "graph.h"
-#include "loop.h"
#include "regs.h"
#include "timevar.h"
#include "diagnostic.h"
timevar_push (TV_DUMP);
- gcc_assert (!dump_file);
- gcc_assert (!dump_file_name);
+ if (dump_file != NULL || dump_file_name != NULL)
+ abort ();
dump_file_name = get_dump_file_name (index);
initializing_dump = !dump_initialized_p (index);
&& !DECL_EXTERNAL (decl))
{
if (flag_unit_at_a_time && !cgraph_global_info_ready
- && TREE_CODE (decl) != FUNCTION_DECL && top_level
- /* If we defer processing of decls that have had their
- DECL_RTL set above (say, in make_decl_rtl),
- check_global_declarations() will clear it before
- assemble_variable has a chance to act on it. This
- would remove all traces of the register name in a
- global register variable, for example. */
- && !DECL_RTL_SET_P (decl))
+ && TREE_CODE (decl) != FUNCTION_DECL && top_level)
cgraph_varpool_finalize_decl (decl);
else
assemble_variable (decl, top_level, at_end, 0);
different from the DECL_NAME name used in the source file. */
x = DECL_RTL (current_function_decl);
- gcc_assert (MEM_P (x));
+ if (!MEM_P (x))
+ abort ();
x = XEXP (x, 0);
- gcc_assert (GET_CODE (x) == SYMBOL_REF);
+ if (GET_CODE (x) != SYMBOL_REF)
+ abort ();
fnname = XSTR (x, 0);
assemble_start_function (current_function_decl, fnname);
}
#endif
-/* Track the variables, ie. compute where the variable is stored at each position in function. */
+/* Track the variables, i.e. compute where the variable is stored at each position in function. */
static void
rest_of_handle_variable_tracking (void)
{
it as constant, otherwise -fbranch-probabilities will not read data back.
life_analysis rarely eliminates modification of external memory.
- */
- if (optimize)
+
+ FIXME: now with tree based profiling we are in the trap described above
+ again. It seems to be easiest to disable the optimization for time
+ being before the problem is either solved by moving the transformation
+ to the IPA level (we need the CFG for this) or the very early optimization
+ passes are made to ignore the const/pure flags so code does not change. */
+ if (optimize
+ && (!flag_tree_based_profiling
+ || (!profile_arc_flag && !flag_branch_probabilities)))
{
/* Alias analysis depends on this information and mark_constant_function
depends on alias analysis. */
static void
rest_of_handle_loop_optimize (void)
{
- int do_unroll, do_prefetch;
+ int do_prefetch;
timevar_push (TV_LOOP);
delete_dead_jumptables ();
/* CFG is no longer maintained up-to-date. */
free_bb_for_insn ();
+ profile_status = PROFILE_ABSENT;
- if (flag_unroll_loops)
- do_unroll = LOOP_AUTO_UNROLL; /* Having two unrollers is useless. */
- else
- do_unroll = flag_old_unroll_loops ? LOOP_UNROLL : LOOP_AUTO_UNROLL;
do_prefetch = flag_prefetch_loop_arrays ? LOOP_PREFETCH : 0;
if (flag_rerun_loop_opt)
cleanup_barriers ();
/* We only want to perform unrolling once. */
- loop_optimize (get_insns (), dump_file, do_unroll);
- do_unroll = 0;
+ loop_optimize (get_insns (), dump_file, 0);
/* The first call to loop_optimize makes some instructions
trivially dead. We delete those instructions now in the
reg_scan (get_insns (), max_reg_num (), 1);
}
cleanup_barriers ();
- loop_optimize (get_insns (), dump_file, do_unroll | do_prefetch);
+ loop_optimize (get_insns (), dump_file, do_prefetch);
/* Loop can create trivially dead instructions. */
delete_trivially_dead_insns (get_insns (), max_reg_num ());
timevar_push (TV_JUMP);
open_dump_file (DFI_sibling, current_function_decl);
- /* ??? We may get called either via tree_rest_of_compilation when the CFG
- is already built or directly (for instance from coverage code).
- The direct callers shall be updated. */
- if (!basic_block_info)
- {
- init_flow ();
- rebuild_jump_labels (get_insns ());
- find_exception_handler_labels ();
- find_basic_blocks (get_insns (), max_reg_num (), dump_file);
- }
-
- /* ??? We may get called either via tree_rest_of_compilation when the CFG
- is already built or directly (for instance from coverage code).
- The direct callers shall be updated. */
- if (!basic_block_info)
- {
- init_flow ();
- rebuild_jump_labels (get_insns ());
- find_exception_handler_labels ();
- find_basic_blocks (get_insns (), max_reg_num (), dump_file);
- }
delete_unreachable_blocks ();
#ifdef ENABLE_CHECKING
verify_flow_info ();
after all tree passes have finished for a single function, and we
have expanded the function body from trees to RTL.
Once we are here, we have decided that we're supposed to output
- that function, ie. that we should write assembler code for it.
+ that function, i.e. that we should write assembler code for it.
We run a series of low-level passes here on the function's RTL
representation. Each pass is called via a rest_of_* function. */
-void
+static void
rest_of_compilation (void)
{
/* Convert from NOTE_INSN_EH_REGION style notes, and do other