Line 40... |
Line 40... |
1, 1, 0, 1, 0, 1, 0, 1,
|
1, 1, 0, 1, 0, 1, 0, 1,
|
0, 1, 0, 1, 0, 1, 0, 1,
|
0, 1, 0, 1, 0, 1, 0, 1,
|
0, 1, 0, 1, 0, 1, 0, 1,
|
0, 1, 0, 1, 0, 1, 0, 1,
|
1, 1};
|
1, 1};
|
|
|
cuc_timings *preunroll_bb (char *bb_filename, cuc_func *f, cuc_timings *timings, int b, int i, int j)
|
/* Does all known instruction optimizations */
|
|
void cuc_optimize (cuc_func *func)
|
{
|
{
|
cuc_func *func;
|
int modified = 0;
|
cucdebug (2, "BB%i unroll %i times preroll %i times\n", b, j, i);
|
|
func = preunroll_loop (f, b, i, j, bb_filename);
|
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_PREUNROLL");
|
|
|
|
log ("Optimizing.\n");
|
log ("Optimizing.\n");
|
optimize_cmovs (func);
|
do {
|
|
modified = 0;
|
|
if (optimize_cmovs (func)) {
|
if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_CMOVS");
|
if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_CMOVS");
|
optimize_tree (func);
|
modified = 1;
|
|
}
|
|
if (optimize_tree (func)) {
|
if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_TREE1");
|
if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_TREE1");
|
remove_nops (func);
|
modified = 1;
|
|
}
|
|
if (remove_nops (func)) {
|
if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
|
if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
|
remove_dead (func);
|
modified = 1;
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD1");
|
}
|
optimize_bb (func);
|
if (remove_dead (func)) {
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_OPT_BB");
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD");
|
remove_dead_bb (func);
|
modified = 1;
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD_BB");
|
}
|
optimize_tree (func);
|
if (cse (func)) {
|
if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_OPT_TREE");
|
|
log ("Common subexpression elimination.\n");
|
log ("Common subexpression elimination.\n");
|
cse (func);
|
|
if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_CSE");
|
if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_CSE");
|
remove_dead (func);
|
modified = 1;
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD");
|
}
|
remove_trivial_regs (func);
|
if (optimize_bb (func)) {
|
set_io (func);
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_OPT_BB");
|
|
modified = 1;
|
|
}
|
|
if (remove_nops (func)) {
|
|
if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
|
|
modified = 1;
|
|
}
|
|
if (remove_dead_bb (func)) {
|
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD_BB");
|
|
modified = 1;
|
|
}
|
|
if (remove_trivial_regs (func)) {
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_TRIVIAL");
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_TRIVIAL");
|
|
modified = 1;
|
|
}
|
|
if (remove_nops (func)) {
|
|
if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
|
|
modified = 1;
|
|
}
|
|
} while (modified);
|
|
set_io (func);
|
|
}
|
|
|
|
/* Pre/unrolls basic block and optimizes it */
|
|
cuc_timings *preunroll_bb (char *bb_filename, cuc_func *f, cuc_timings *timings, int b, int i, int j)
|
|
{
|
|
cuc_func *func;
|
|
cucdebug (2, "BB%i unroll %i times preroll %i times\n", b, j, i);
|
|
func = preunroll_loop (f, b, i, j, bb_filename);
|
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_PREUNROLL");
|
|
cuc_optimize (func);
|
|
|
add_latches (func);
|
add_latches (func);
|
if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
|
if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
|
set_io (func);
|
|
add_memory_dep (func, func->memory_order);
|
add_memory_dep (func, func->memory_order);
|
if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
|
if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
|
add_data_dep (func);
|
add_data_dep (func);
|
if (cuc_debug >= 8) print_cuc_bb (func, "AFTER_DATA_DEP");
|
if (cuc_debug >= 8) print_cuc_bb (func, "AFTER_DATA_DEP");
|
schedule_memory (func, func->memory_order);
|
schedule_memory (func, func->memory_order);
|
Line 94... |
Line 124... |
timings->preroll = i;
|
timings->preroll = i;
|
timings->nshared = 0;
|
timings->nshared = 0;
|
return timings;
|
return timings;
|
}
|
}
|
|
|
|
/* Simple comparison function */
|
int tim_comp (cuc_timings *a, cuc_timings *b)
|
int tim_comp (cuc_timings *a, cuc_timings *b)
|
{
|
{
|
if (a->new_time < b->new_time) return -1;
|
if (a->new_time < b->new_time) return -1;
|
else if (a->new_time > b->new_time) return 1;
|
else if (a->new_time > b->new_time) return 1;
|
else return 0;
|
else return 0;
|
}
|
}
|
|
|
|
/* Analyses function; done when cuc command is entered in (sim) prompt */
|
cuc_func *analyse_function (char *module_name, long orig_time,
|
cuc_func *analyse_function (char *module_name, long orig_time,
|
unsigned long start_addr, unsigned long end_addr,
|
unsigned long start_addr, unsigned long end_addr,
|
int memory_order)
|
int memory_order)
|
{
|
{
|
cuc_timings timings;
|
cuc_timings timings;
|
Line 142... |
Line 174... |
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_BUILD_BB");
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_BUILD_BB");
|
reg_dep (func);
|
reg_dep (func);
|
|
|
log ("Detecting dependencies\n");
|
log ("Detecting dependencies\n");
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_REG_DEP");
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_REG_DEP");
|
optimize_cmovs (func);
|
cuc_optimize (func);
|
if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_CMOVS");
|
|
optimize_tree (func);
|
|
log ("Optimizing.\n");
|
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_OPT_TREE1");
|
|
remove_nops (func);
|
|
if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
|
|
remove_dead (func);
|
|
if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_DEAD1");
|
|
optimize_bb (func);
|
|
if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_BB");
|
|
remove_dead_bb (func);
|
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_DEAD_BB");
|
|
optimize_tree (func);
|
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_OPT_TREE");
|
|
log ("Common subexpression elimination.\n");
|
|
cse (func);
|
|
if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_CSE");
|
|
remove_dead (func);
|
|
if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD");
|
|
remove_trivial_regs (func);
|
|
set_io (func);
|
|
if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_TRIVIAL");
|
|
|
|
#if 0
|
#if 0
|
csm (func);
|
csm (func);
|
#endif
|
#endif
|
assert (saved = dup_func (func));
|
assert (saved = dup_func (func));
|
|
|
timings.preroll = timings.unroll = 1;
|
timings.preroll = timings.unroll = 1;
|
timings.nshared = 0;
|
timings.nshared = 0;
|
add_latches (func);
|
|
|
|
|
add_latches (func);
|
if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
|
if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
|
analyse_timings (func, &timings);
|
analyse_timings (func, &timings);
|
add_memory_dep (func, func->memory_order);
|
add_memory_dep (func, func->memory_order);
|
if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
|
if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
|
add_data_dep (func);
|
add_data_dep (func);
|