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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [tree-ssa-loop.c] - Diff between revs 280 and 338

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

Rev 280 Rev 338
/* Loop optimizations over tree-ssa.
/* Loop optimizations over tree-ssa.
   Copyright (C) 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
   Copyright (C) 2003, 2005, 2006, 2007, 2008 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"
#include "toplev.h"
#include "toplev.h"
#include "tree-vectorizer.h"
#include "tree-vectorizer.h"
 
 
/* 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 gimple_opt_pass pass_tree_loop =
struct gimple_opt_pass pass_tree_loop =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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 */
 }
 }
};
};
 
 
/* Loop optimizer initialization.  */
/* Loop optimizer initialization.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_init (void)
tree_ssa_loop_init (void)
{
{
  loop_optimizer_init (LOOPS_NORMAL
  loop_optimizer_init (LOOPS_NORMAL
                       | LOOPS_HAVE_RECORDED_EXITS);
                       | LOOPS_HAVE_RECORDED_EXITS);
  rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
  rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
 
 
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  scev_initialize ();
  scev_initialize ();
  return 0;
  return 0;
}
}
 
 
struct gimple_opt_pass pass_tree_loop_init =
struct gimple_opt_pass pass_tree_loop_init =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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 */
 }
 }
};
};
 
 
/* 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 (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  tree_ssa_lim ();
  tree_ssa_lim ();
  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 gimple_opt_pass pass_lim =
struct gimple_opt_pass pass_lim =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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 */
 }
 }
};
};
 
 
/* Loop unswitching pass.  */
/* Loop unswitching pass.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_unswitch (void)
tree_ssa_loop_unswitch (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  return tree_ssa_unswitch_loops ();
  return tree_ssa_unswitch_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 gimple_opt_pass pass_tree_unswitch =
struct gimple_opt_pass pass_tree_unswitch =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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_ggc_collect | TODO_dump_func
  TODO_ggc_collect | TODO_dump_func
    | TODO_verify_loops                 /* todo_flags_finish */
    | TODO_verify_loops                 /* todo_flags_finish */
 }
 }
};
};
 
 
/* Predictive commoning.  */
/* Predictive commoning.  */
 
 
static unsigned
static unsigned
run_tree_predictive_commoning (void)
run_tree_predictive_commoning (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  tree_predictive_commoning ();
  tree_predictive_commoning ();
  return 0;
  return 0;
}
}
 
 
static bool
static bool
gate_tree_predictive_commoning (void)
gate_tree_predictive_commoning (void)
{
{
  return flag_predictive_commoning != 0;
  return flag_predictive_commoning != 0;
}
}
 
 
struct gimple_opt_pass pass_predcom =
struct gimple_opt_pass pass_predcom =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "pcom",                               /* name */
  "pcom",                               /* name */
  gate_tree_predictive_commoning,       /* gate */
  gate_tree_predictive_commoning,       /* gate */
  run_tree_predictive_commoning,        /* execute */
  run_tree_predictive_commoning,        /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_PREDCOM,                           /* tv_id */
  TV_PREDCOM,                           /* 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_dump_func | TODO_verify_loops
    | TODO_update_ssa_only_virtuals     /* todo_flags_finish */
    | TODO_update_ssa_only_virtuals     /* todo_flags_finish */
 }
 }
};
};
 
 
/* Loop autovectorization.  */
/* Loop autovectorization.  */
 
 
static unsigned int
static unsigned int
tree_vectorize (void)
tree_vectorize (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  return vectorize_loops ();
  return vectorize_loops ();
}
}
 
 
static bool
static bool
gate_tree_vectorize (void)
gate_tree_vectorize (void)
{
{
  return flag_tree_vectorize;
  return flag_tree_vectorize;
}
}
 
 
struct gimple_opt_pass pass_vectorize =
struct gimple_opt_pass pass_vectorize =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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_dump_func | TODO_update_ssa
    | TODO_ggc_collect                  /* todo_flags_finish */
    | TODO_ggc_collect                  /* todo_flags_finish */
 }
 }
};
};
 
 
/* Loop nest optimizations.  */
/* Loop nest optimizations.  */
 
 
static unsigned int
static unsigned int
tree_linear_transform (void)
tree_linear_transform (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  linear_transform_loops ();
  linear_transform_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 gimple_opt_pass pass_linear_transform =
struct gimple_opt_pass pass_linear_transform =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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_dump_func | TODO_verify_loops
    | TODO_update_ssa_only_virtuals
    | TODO_update_ssa_only_virtuals
    | TODO_ggc_collect                  /* todo_flags_finish */
    | TODO_ggc_collect                  /* todo_flags_finish */
 }
 }
};
};
 
 
/* GRAPHITE optimizations.  */
/* GRAPHITE optimizations.  */
 
 
static unsigned int
static unsigned int
graphite_transforms (void)
graphite_transforms (void)
{
{
  if (!current_loops)
  if (!current_loops)
    return 0;
    return 0;
 
 
  graphite_transform_loops ();
  graphite_transform_loops ();
 
 
  return 0;
  return 0;
}
}
 
 
static bool
static bool
gate_graphite_transforms (void)
gate_graphite_transforms (void)
{
{
  /* Enable -fgraphite pass if any one of the graphite optimization flags
  /* Enable -fgraphite pass if any one of the graphite optimization flags
     is turned on.  */
     is turned on.  */
  if (flag_loop_block || flag_loop_interchange || flag_loop_strip_mine
  if (flag_loop_block || flag_loop_interchange || flag_loop_strip_mine
      || flag_graphite_identity || flag_loop_parallelize_all)
      || flag_graphite_identity || flag_loop_parallelize_all)
    flag_graphite = 1;
    flag_graphite = 1;
 
 
  return flag_graphite != 0;
  return flag_graphite != 0;
}
}
 
 
struct gimple_opt_pass pass_graphite_transforms =
struct gimple_opt_pass pass_graphite_transforms =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "graphite",                           /* name */
  "graphite",                           /* name */
  gate_graphite_transforms,             /* gate */
  gate_graphite_transforms,             /* gate */
  graphite_transforms,                  /* execute */
  graphite_transforms,                  /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_GRAPHITE_TRANSFORMS,               /* tv_id */
  TV_GRAPHITE_TRANSFORMS,               /* 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_verify_loops                     /* todo_flags_finish */
  TODO_verify_loops                     /* todo_flags_finish */
 }
 }
};
};
 
 
/* Check the correctness of the data dependence analyzers.  */
/* Check the correctness of the data dependence analyzers.  */
 
 
static unsigned int
static unsigned int
check_data_deps (void)
check_data_deps (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  tree_check_data_deps ();
  tree_check_data_deps ();
  return 0;
  return 0;
}
}
 
 
static bool
static bool
gate_check_data_deps (void)
gate_check_data_deps (void)
{
{
  return flag_check_data_deps != 0;
  return flag_check_data_deps != 0;
}
}
 
 
struct gimple_opt_pass pass_check_data_deps =
struct gimple_opt_pass pass_check_data_deps =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "ckdd",                               /* name */
  "ckdd",                               /* name */
  gate_check_data_deps,                 /* gate */
  gate_check_data_deps,                 /* gate */
  check_data_deps,                      /* execute */
  check_data_deps,                      /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_CHECK_DATA_DEPS,                   /* tv_id */
  TV_CHECK_DATA_DEPS,                   /* 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_flags_finish */
  TODO_dump_func                        /* todo_flags_finish */
 }
 }
};
};
 
 
/* 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 (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  return canonicalize_induction_variables ();
  return canonicalize_induction_variables ();
}
}
 
 
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 gimple_opt_pass pass_iv_canon =
struct gimple_opt_pass pass_iv_canon =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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 */
 }
 }
};
};
 
 
/* 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 flag_tree_scev_cprop;
  return flag_tree_scev_cprop;
}
}
 
 
struct gimple_opt_pass pass_scev_cprop =
struct gimple_opt_pass pass_scev_cprop =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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 */
 }
 }
};
};
 
 
/* 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 (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  estimate_numbers_of_iterations ();
  estimate_numbers_of_iterations ();
  scev_reset ();
  scev_reset ();
  return 0;
  return 0;
}
}
 
 
struct gimple_opt_pass pass_record_bounds =
struct gimple_opt_pass pass_record_bounds =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "*record_bounds",                     /* name */
  "*record_bounds",                     /* 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 */
 }
 }
};
};
 
 
/* Complete unrolling of loops.  */
/* Complete unrolling of loops.  */
 
 
static unsigned int
static unsigned int
tree_complete_unroll (void)
tree_complete_unroll (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  return tree_unroll_loops_completely (flag_unroll_loops
  return tree_unroll_loops_completely (flag_unroll_loops
                                       || flag_peel_loops
                                       || flag_peel_loops
                                       || optimize >= 3, true);
                                       || optimize >= 3, true);
}
}
 
 
static bool
static bool
gate_tree_complete_unroll (void)
gate_tree_complete_unroll (void)
{
{
  return true;
  return true;
}
}
 
 
struct gimple_opt_pass pass_complete_unroll =
struct gimple_opt_pass pass_complete_unroll =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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_dump_func | TODO_verify_loops
    | TODO_ggc_collect                  /* todo_flags_finish */
    | TODO_ggc_collect                  /* todo_flags_finish */
 }
 }
};
};
 
 
/* Complete unrolling of inner loops.  */
/* Complete unrolling of inner loops.  */
 
 
static unsigned int
static unsigned int
tree_complete_unroll_inner (void)
tree_complete_unroll_inner (void)
{
{
  unsigned ret = 0;
  unsigned ret = 0;
 
 
  loop_optimizer_init (LOOPS_NORMAL
  loop_optimizer_init (LOOPS_NORMAL
                       | LOOPS_HAVE_RECORDED_EXITS);
                       | LOOPS_HAVE_RECORDED_EXITS);
  if (number_of_loops () > 1)
  if (number_of_loops () > 1)
    {
    {
      scev_initialize ();
      scev_initialize ();
      ret = tree_unroll_loops_completely (optimize >= 3, false);
      ret = tree_unroll_loops_completely (optimize >= 3, false);
      free_numbers_of_iterations_estimates ();
      free_numbers_of_iterations_estimates ();
      scev_finalize ();
      scev_finalize ();
    }
    }
  loop_optimizer_finalize ();
  loop_optimizer_finalize ();
 
 
  return ret;
  return ret;
}
}
 
 
static bool
static bool
gate_tree_complete_unroll_inner (void)
gate_tree_complete_unroll_inner (void)
{
{
  return optimize >= 2;
  return optimize >= 2;
}
}
 
 
struct gimple_opt_pass pass_complete_unrolli =
struct gimple_opt_pass pass_complete_unrolli =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "cunrolli",                           /* name */
  "cunrolli",                           /* name */
  gate_tree_complete_unroll_inner,      /* gate */
  gate_tree_complete_unroll_inner,      /* gate */
  tree_complete_unroll_inner,           /* execute */
  tree_complete_unroll_inner,           /* 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_dump_func | TODO_verify_loops
    | TODO_ggc_collect                  /* todo_flags_finish */
    | TODO_ggc_collect                  /* todo_flags_finish */
 }
 }
};
};
 
 
/* Parallelization.  */
/* Parallelization.  */
 
 
static bool
static bool
gate_tree_parallelize_loops (void)
gate_tree_parallelize_loops (void)
{
{
  return flag_tree_parallelize_loops > 1;
  return flag_tree_parallelize_loops > 1;
}
}
 
 
static unsigned
static unsigned
tree_parallelize_loops (void)
tree_parallelize_loops (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  if (parallelize_loops ())
  if (parallelize_loops ())
    return TODO_cleanup_cfg | TODO_rebuild_alias;
    return TODO_cleanup_cfg | TODO_rebuild_alias;
  return 0;
  return 0;
}
}
 
 
struct gimple_opt_pass pass_parallelize_loops =
struct gimple_opt_pass pass_parallelize_loops =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "parloops",                           /* name */
  "parloops",                           /* name */
  gate_tree_parallelize_loops,          /* gate */
  gate_tree_parallelize_loops,          /* gate */
  tree_parallelize_loops,               /* execute */
  tree_parallelize_loops,               /* execute */
  NULL,                                 /* sub */
  NULL,                                 /* sub */
  NULL,                                 /* next */
  NULL,                                 /* next */
  0,                                     /* static_pass_number */
  0,                                     /* static_pass_number */
  TV_TREE_PARALLELIZE_LOOPS,            /* tv_id */
  TV_TREE_PARALLELIZE_LOOPS,            /* 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 */
 }
 }
};
};
 
 
/* Prefetching.  */
/* Prefetching.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_prefetch (void)
tree_ssa_loop_prefetch (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  return tree_ssa_prefetch_arrays ();
  return tree_ssa_prefetch_arrays ();
}
}
 
 
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 gimple_opt_pass pass_loop_prefetch =
struct gimple_opt_pass pass_loop_prefetch =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "aprefetch",                          /* name */
  "aprefetch",                          /* 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 */
 }
 }
};
};
 
 
/* Induction variable optimizations.  */
/* Induction variable optimizations.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_ivopts (void)
tree_ssa_loop_ivopts (void)
{
{
  if (number_of_loops () <= 1)
  if (number_of_loops () <= 1)
    return 0;
    return 0;
 
 
  tree_ssa_iv_optimize ();
  tree_ssa_iv_optimize ();
  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 gimple_opt_pass pass_iv_optimize =
struct gimple_opt_pass pass_iv_optimize =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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_verify_loops
  TODO_dump_func | TODO_verify_loops
  | TODO_update_ssa | TODO_ggc_collect  /* todo_flags_finish */
  | TODO_update_ssa | TODO_ggc_collect  /* todo_flags_finish */
 }
 }
};
};
 
 
/* Loop optimizer finalization.  */
/* Loop optimizer finalization.  */
 
 
static unsigned int
static unsigned int
tree_ssa_loop_done (void)
tree_ssa_loop_done (void)
{
{
  free_numbers_of_iterations_estimates ();
  free_numbers_of_iterations_estimates ();
  scev_finalize ();
  scev_finalize ();
  loop_optimizer_finalize ();
  loop_optimizer_finalize ();
  return 0;
  return 0;
}
}
 
 
struct gimple_opt_pass pass_tree_loop_done =
struct gimple_opt_pass pass_tree_loop_done =
{
{
 {
 {
  GIMPLE_PASS,
  GIMPLE_PASS,
  "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 */
 }
 }
};
};
 
 

powered by: WebSVN 2.1.0

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