diff options
author | Kewen Lin <linkw@gcc.gnu.org> | 2019-06-18 05:08:02 +0000 |
---|---|---|
committer | Kewen Lin <linkw@gcc.gnu.org> | 2019-06-18 05:08:02 +0000 |
commit | 74b5fcf733823b353b331c0ca30e8b71ba98c9cf (patch) | |
tree | b9ed33a1d95fac033d35268b37e4cf0e4bcf2ca1 /gcc/config | |
parent | 702eb490a864239256203b7fad53e397d3e7fa54 (diff) | |
download | gcc-74b5fcf733823b353b331c0ca30e8b71ba98c9cf.zip gcc-74b5fcf733823b353b331c0ca30e8b71ba98c9cf.tar.gz gcc-74b5fcf733823b353b331c0ca30e8b71ba98c9cf.tar.bz2 |
Add predict_doloop_p target hook
Add one target hook predict_doloop_p, it return true if we can predict it
is possible to use a low-overhead loop, it can help ivopts to make some
better decisions.
PR middle-end/80791
* target.def (predict_doloop_p): New hook.
* targhooks.h (default_predict_doloop_p): New declaration.
* targhooks.c (default_predict_doloop_p): New function.
* doc/tm.texi.in (TARGET_PREDICT_DOLOOP_P): New hook.
* doc/tm.texi: Regenerate.
* config/rs6000/rs6000.c (rs6000_predict_doloop_p): New function.
(TARGET_PREDICT_DOLOOP_P): New macro.
* tree-ssa-loop-ivopts.c (generic_predict_doloop_p): New function.
From-SVN: r272405
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 657720c..07e00a9 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1909,6 +1909,9 @@ static const struct attribute_spec rs6000_attribute_table[] = #undef TARGET_CAN_USE_DOLOOP_P #define TARGET_CAN_USE_DOLOOP_P can_use_doloop_if_innermost +#undef TARGET_PREDICT_DOLOOP_P +#define TARGET_PREDICT_DOLOOP_P rs6000_predict_doloop_p + #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV rs6000_atomic_assign_expand_fenv @@ -39417,7 +39420,27 @@ rs6000_mangle_decl_assembler_name (tree decl, tree id) return id; } - +/* Predict whether the given loop in gimple will be transformed in the RTL + doloop_optimize pass. */ + +static bool +rs6000_predict_doloop_p (struct loop *loop) +{ + gcc_assert (loop); + + /* On rs6000, targetm.can_use_doloop_p is actually + can_use_doloop_if_innermost. Just ensure the loop is innermost. */ + if (loop->inner != NULL) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Predict doloop failure due to" + " loop nesting.\n"); + return false; + } + + return true; +} + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-rs6000.h" |