OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [tree-ssa-loop.c] - Diff between revs 154 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 154 Rev 816
/* Loop optimizations over tree-ssa.
/* Loop optimizations over tree-ssa.
   Copyright (C) 2003, 2005, 2007 Free Software Foundation, Inc.
   Copyright (C) 2003, 2005, 2007 Free Software Foundation, Inc.
 
 
This file is part of GCC.
This file is part of GCC.
 
 
GCC is free software; you can redistribute it and/or modify it
GCC is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
Free Software Foundation; either version 3, or (at your option) any
later version.
later version.
 
 
GCC is distributed in the hope that it will be useful, but WITHOUT
GCC is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
<http://www.gnu.org/licenses/>.  */
 
 
#include "config.h"
#include "config.h"
#include "system.h"
#include "system.h"
#include "coretypes.h"
#include "coretypes.h"
#include "tm.h"
#include "tm.h"
#include "tree.h"
#include "tree.h"
#include "rtl.h"
#include "rtl.h"
#include "tm_p.h"
#include "tm_p.h"
#include "hard-reg-set.h"
#include "hard-reg-set.h"
#include "basic-block.h"
#include "basic-block.h"
#include "output.h"
#include "output.h"
#include "diagnostic.h"
#include "diagnostic.h"
#include "tree-flow.h"
#include "tree-flow.h"
#include "tree-dump.h"
#include "tree-dump.h"
#include "tree-pass.h"
#include "tree-pass.h"
#include "timevar.h"
#include "timevar.h"
#include "cfgloop.h"
#include "cfgloop.h"
#include "flags.h"
#include "flags.h"
#include "tree-inline.h"
#include "tree-inline.h"
#include "tree-scalar-evolution.h"
#include "tree-scalar-evolution.h"
 
 
/* The loop tree currently optimized.  */
/* The loop tree currently optimized.  */
 
 
struct loops *current_loops = NULL;
struct loops *current_loops = NULL;
 
 
/* Initializes the loop structures.  */
/* Initializes the loop structures.  */
 
 
static struct loops *
static struct loops *
tree_loop_optimizer_init (void)
tree_loop_optimizer_init (void)
{
{
  struct loops *loops;
  struct loops *loops;
 
 
  loops = loop_optimizer_init (LOOPS_NORMAL
  loops = loop_optimizer_init (LOOPS_NORMAL
                               | LOOPS_HAVE_MARKED_SINGLE_EXITS);
                               | LOOPS_HAVE_MARKED_SINGLE_EXITS);
 
 
  if (!loops)
  if (!loops)
    return NULL;
    return NULL;
 
 
  rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
  rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
 
 
  return loops;
  return loops;
}
}
 
 
/* The loop superpass.  */
/* The loop superpass.  */
 
 
static bool
static bool
gate_tree_loop (void)
gate_tree_loop (void)
{
{
  return flag_tree_loop_optimize != 0;
  return flag_tree_loop_optimize != 0;
}
}
 
 
struct tree_opt_pass pass_tree_loop =
struct tree_opt_pass pass_tree_loop =
{
{
  "loop",                               /* name */
  "loop",                               /* name */
  gate_tree_loop,                       /* gate */
  gate_tree_loop,                       /* gate */
  NULL,                                 /* execute */
  NULL,                                 /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LOOP,                         /* tv_id */
  TV_TREE_LOOP,                         /* tv_id */
  PROP_cfg,                             /* properties_required */
  PROP_cfg,                             /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  TODO_ggc_collect,                     /* todo_flags_start */
  TODO_ggc_collect,                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_ssa | TODO_ggc_collect,  /* todo_flags_finish */
  TODO_dump_func | TODO_verify_ssa | TODO_ggc_collect,  /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Loop optimizer initialization.  */
/* Loop optimizer initialization.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_init (void)
tree_ssa_loop_init (void)
{
{
  current_loops = tree_loop_optimizer_init ();
  current_loops = tree_loop_optimizer_init ();
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  scev_initialize (current_loops);
  scev_initialize (current_loops);
  return 0;
  return 0;
}
}
 
 
struct tree_opt_pass pass_tree_loop_init =
struct tree_opt_pass pass_tree_loop_init =
{
{
  "loopinit",                           /* name */
  "loopinit",                           /* name */
  NULL,                                 /* gate */
  NULL,                                 /* gate */
  tree_ssa_loop_init,                   /* execute */
  tree_ssa_loop_init,                   /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LOOP_INIT,                    /* tv_id */
  TV_TREE_LOOP_INIT,                    /* tv_id */
  PROP_cfg,                             /* properties_required */
  PROP_cfg,                             /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Loop invariant motion pass.  */
/* Loop invariant motion pass.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_im (void)
tree_ssa_loop_im (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  tree_ssa_lim (current_loops);
  tree_ssa_lim (current_loops);
  return 0;
  return 0;
}
}
 
 
static bool
static bool
gate_tree_ssa_loop_im (void)
gate_tree_ssa_loop_im (void)
{
{
  return flag_tree_loop_im != 0;
  return flag_tree_loop_im != 0;
}
}
 
 
struct tree_opt_pass pass_lim =
struct tree_opt_pass pass_lim =
{
{
  "lim",                                /* name */
  "lim",                                /* name */
  gate_tree_ssa_loop_im,                /* gate */
  gate_tree_ssa_loop_im,                /* gate */
  tree_ssa_loop_im,                     /* execute */
  tree_ssa_loop_im,                     /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_LIM,                               /* tv_id */
  TV_LIM,                               /* tv_id */
  PROP_cfg,                             /* properties_required */
  PROP_cfg,                             /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Loop unswitching pass.  */
/* Loop unswitching pass.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_unswitch (void)
tree_ssa_loop_unswitch (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  return tree_ssa_unswitch_loops (current_loops);
  return tree_ssa_unswitch_loops (current_loops);
}
}
 
 
static bool
static bool
gate_tree_ssa_loop_unswitch (void)
gate_tree_ssa_loop_unswitch (void)
{
{
  return flag_unswitch_loops != 0;
  return flag_unswitch_loops != 0;
}
}
 
 
struct tree_opt_pass pass_tree_unswitch =
struct tree_opt_pass pass_tree_unswitch =
{
{
  "unswitch",                           /* name */
  "unswitch",                           /* name */
  gate_tree_ssa_loop_unswitch,          /* gate */
  gate_tree_ssa_loop_unswitch,          /* gate */
  tree_ssa_loop_unswitch,               /* execute */
  tree_ssa_loop_unswitch,               /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LOOP_UNSWITCH,                /* tv_id */
  TV_TREE_LOOP_UNSWITCH,                /* tv_id */
  PROP_cfg,                             /* properties_required */
  PROP_cfg,                             /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Loop autovectorization.  */
/* Loop autovectorization.  */
 
 
static unsigned int
static unsigned int
tree_vectorize (void)
tree_vectorize (void)
{
{
  vectorize_loops (current_loops);
  vectorize_loops (current_loops);
  return 0;
  return 0;
}
}
 
 
static bool
static bool
gate_tree_vectorize (void)
gate_tree_vectorize (void)
{
{
  return flag_tree_vectorize && current_loops;
  return flag_tree_vectorize && current_loops;
}
}
 
 
struct tree_opt_pass pass_vectorize =
struct tree_opt_pass pass_vectorize =
{
{
  "vect",                               /* name */
  "vect",                               /* name */
  gate_tree_vectorize,                  /* gate */
  gate_tree_vectorize,                  /* gate */
  tree_vectorize,                       /* execute */
  tree_vectorize,                       /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                    /* static_pass_number */
  0,                                    /* static_pass_number */
  TV_TREE_VECTORIZATION,                /* tv_id */
  TV_TREE_VECTORIZATION,                /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                    /* properties_provided */
  0,                                    /* properties_provided */
  0,                                    /* properties_destroyed */
  0,                                    /* properties_destroyed */
  TODO_verify_loops,                    /* todo_flags_start */
  TODO_verify_loops,                    /* todo_flags_start */
  TODO_dump_func | TODO_update_ssa,     /* todo_flags_finish */
  TODO_dump_func | TODO_update_ssa,     /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Loop nest optimizations.  */
/* Loop nest optimizations.  */
 
 
static unsigned int
static unsigned int
tree_linear_transform (void)
tree_linear_transform (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  linear_transform_loops (current_loops);
  linear_transform_loops (current_loops);
  return 0;
  return 0;
}
}
 
 
static bool
static bool
gate_tree_linear_transform (void)
gate_tree_linear_transform (void)
{
{
  return flag_tree_loop_linear != 0;
  return flag_tree_loop_linear != 0;
}
}
 
 
struct tree_opt_pass pass_linear_transform =
struct tree_opt_pass pass_linear_transform =
{
{
  "ltrans",                             /* name */
  "ltrans",                             /* name */
  gate_tree_linear_transform,           /* gate */
  gate_tree_linear_transform,           /* gate */
  tree_linear_transform,                /* execute */
  tree_linear_transform,                /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LINEAR_TRANSFORM,             /* tv_id */
  TV_TREE_LINEAR_TRANSFORM,             /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Canonical induction variable creation pass.  */
/* Canonical induction variable creation pass.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_ivcanon (void)
tree_ssa_loop_ivcanon (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  return canonicalize_induction_variables (current_loops);
  return canonicalize_induction_variables (current_loops);
}
}
 
 
static bool
static bool
gate_tree_ssa_loop_ivcanon (void)
gate_tree_ssa_loop_ivcanon (void)
{
{
  return flag_tree_loop_ivcanon != 0;
  return flag_tree_loop_ivcanon != 0;
}
}
 
 
struct tree_opt_pass pass_iv_canon =
struct tree_opt_pass pass_iv_canon =
{
{
  "ivcanon",                            /* name */
  "ivcanon",                            /* name */
  gate_tree_ssa_loop_ivcanon,           /* gate */
  gate_tree_ssa_loop_ivcanon,           /* gate */
  tree_ssa_loop_ivcanon,                /* execute */
  tree_ssa_loop_ivcanon,                /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LOOP_IVCANON,                 /* tv_id */
  TV_TREE_LOOP_IVCANON,                 /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Propagation of constants using scev.  */
/* Propagation of constants using scev.  */
 
 
static bool
static bool
gate_scev_const_prop (void)
gate_scev_const_prop (void)
{
{
  return true;
  return true;
}
}
 
 
struct tree_opt_pass pass_scev_cprop =
struct tree_opt_pass pass_scev_cprop =
{
{
  "sccp",                               /* name */
  "sccp",                               /* name */
  gate_scev_const_prop,                 /* gate */
  gate_scev_const_prop,                 /* gate */
  scev_const_prop,                      /* execute */
  scev_const_prop,                      /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_SCEV_CONST,                        /* tv_id */
  TV_SCEV_CONST,                        /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_cleanup_cfg
  TODO_dump_func | TODO_cleanup_cfg
    | TODO_update_ssa_only_virtuals,
    | TODO_update_ssa_only_virtuals,
                                        /* todo_flags_finish */
                                        /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Remove empty loops.  */
/* Remove empty loops.  */
 
 
static unsigned int
static unsigned int
tree_ssa_empty_loop (void)
tree_ssa_empty_loop (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  return remove_empty_loops (current_loops);
  return remove_empty_loops (current_loops);
}
}
 
 
struct tree_opt_pass pass_empty_loop =
struct tree_opt_pass pass_empty_loop =
{
{
  "empty",                              /* name */
  "empty",                              /* name */
  NULL,                                 /* gate */
  NULL,                                 /* gate */
  tree_ssa_empty_loop,                  /* execute */
  tree_ssa_empty_loop,                  /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_COMPLETE_UNROLL,                   /* tv_id */
  TV_COMPLETE_UNROLL,                   /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Record bounds on numbers of iterations of loops.  */
/* Record bounds on numbers of iterations of loops.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_bounds (void)
tree_ssa_loop_bounds (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  estimate_numbers_of_iterations (current_loops);
  estimate_numbers_of_iterations (current_loops);
  scev_reset ();
  scev_reset ();
  return 0;
  return 0;
}
}
 
 
struct tree_opt_pass pass_record_bounds =
struct tree_opt_pass pass_record_bounds =
{
{
  NULL,                                 /* name */
  NULL,                                 /* name */
  NULL,                                 /* gate */
  NULL,                                 /* gate */
  tree_ssa_loop_bounds,                 /* execute */
  tree_ssa_loop_bounds,                 /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LOOP_BOUNDS,                  /* tv_id */
  TV_TREE_LOOP_BOUNDS,                  /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_finish */
  0,                                     /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Complete unrolling of loops.  */
/* Complete unrolling of loops.  */
 
 
static unsigned int
static unsigned int
tree_complete_unroll (void)
tree_complete_unroll (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  return tree_unroll_loops_completely (current_loops,
  return tree_unroll_loops_completely (current_loops,
                                       flag_unroll_loops
                                       flag_unroll_loops
                                        || flag_peel_loops
                                        || flag_peel_loops
                                        || optimize >= 3);
                                        || optimize >= 3);
}
}
 
 
static bool
static bool
gate_tree_complete_unroll (void)
gate_tree_complete_unroll (void)
{
{
  return true;
  return true;
}
}
 
 
struct tree_opt_pass pass_complete_unroll =
struct tree_opt_pass pass_complete_unroll =
{
{
  "cunroll",                            /* name */
  "cunroll",                            /* name */
  gate_tree_complete_unroll,            /* gate */
  gate_tree_complete_unroll,            /* gate */
  tree_complete_unroll,                 /* execute */
  tree_complete_unroll,                 /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_COMPLETE_UNROLL,                   /* tv_id */
  TV_COMPLETE_UNROLL,                   /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Prefetching.  */
/* Prefetching.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_prefetch (void)
tree_ssa_loop_prefetch (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  return tree_ssa_prefetch_arrays (current_loops);
  return tree_ssa_prefetch_arrays (current_loops);
}
}
 
 
static bool
static bool
gate_tree_ssa_loop_prefetch (void)
gate_tree_ssa_loop_prefetch (void)
{
{
  return flag_prefetch_loop_arrays != 0;
  return flag_prefetch_loop_arrays != 0;
}
}
 
 
struct tree_opt_pass pass_loop_prefetch =
struct tree_opt_pass pass_loop_prefetch =
{
{
  "prefetch",                           /* name */
  "prefetch",                           /* name */
  gate_tree_ssa_loop_prefetch,          /* gate */
  gate_tree_ssa_loop_prefetch,          /* gate */
  tree_ssa_loop_prefetch,               /* execute */
  tree_ssa_loop_prefetch,               /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_PREFETCH,                     /* tv_id */
  TV_TREE_PREFETCH,                     /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  TODO_dump_func | TODO_verify_loops,   /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Induction variable optimizations.  */
/* Induction variable optimizations.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_ivopts (void)
tree_ssa_loop_ivopts (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  tree_ssa_iv_optimize (current_loops);
  tree_ssa_iv_optimize (current_loops);
  return 0;
  return 0;
}
}
 
 
static bool
static bool
gate_tree_ssa_loop_ivopts (void)
gate_tree_ssa_loop_ivopts (void)
{
{
  return flag_ivopts != 0;
  return flag_ivopts != 0;
}
}
 
 
struct tree_opt_pass pass_iv_optimize =
struct tree_opt_pass pass_iv_optimize =
{
{
  "ivopts",                             /* name */
  "ivopts",                             /* name */
  gate_tree_ssa_loop_ivopts,            /* gate */
  gate_tree_ssa_loop_ivopts,            /* gate */
  tree_ssa_loop_ivopts,                 /* execute */
  tree_ssa_loop_ivopts,                 /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LOOP_IVOPTS,                  /* tv_id */
  TV_TREE_LOOP_IVOPTS,                  /* tv_id */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  PROP_cfg | PROP_ssa,                  /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_dump_func
  TODO_dump_func
  | TODO_verify_loops
  | TODO_verify_loops
  | TODO_update_ssa,                    /* todo_flags_finish */
  | TODO_update_ssa,                    /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 
/* Loop optimizer finalization.  */
/* Loop optimizer finalization.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_done (void)
tree_ssa_loop_done (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  free_numbers_of_iterations_estimates (current_loops);
  free_numbers_of_iterations_estimates (current_loops);
  scev_finalize ();
  scev_finalize ();
  loop_optimizer_finalize (current_loops);
  loop_optimizer_finalize (current_loops);
  current_loops = NULL;
  current_loops = NULL;
  return 0;
  return 0;
}
}
 
 
struct tree_opt_pass pass_tree_loop_done =
struct tree_opt_pass pass_tree_loop_done =
{
{
  "loopdone",                           /* name */
  "loopdone",                           /* name */
  NULL,                                 /* gate */
  NULL,                                 /* gate */
  tree_ssa_loop_done,                   /* execute */
  tree_ssa_loop_done,                   /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_LOOP_FINI,                    /* tv_id */
  TV_TREE_LOOP_FINI,                    /* tv_id */
  PROP_cfg,                             /* properties_required */
  PROP_cfg,                             /* properties_required */
  0,                                     /* properties_provided */
  0,                                     /* properties_provided */
  0,                                     /* properties_destroyed */
  0,                                     /* properties_destroyed */
  0,                                     /* todo_flags_start */
  0,                                     /* todo_flags_start */
  TODO_cleanup_cfg | TODO_dump_func,    /* todo_flags_finish */
  TODO_cleanup_cfg | TODO_dump_func,    /* todo_flags_finish */
  0                                      /* letter */
  0                                      /* letter */
};
};
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.