This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Prevent loops from being optimized away


On Thu, Mar 31, 2016 at 9:54 PM, Segher Boessenkool
<segher@kernel.crashing.org> wrote:
> Sometimes people write loops that they do not want optimized away, even
> when the compiler can replace those loops by a simple expression (or
> nothing).  For such people, this patch adds a compiler option.


The Linux kernel has a nice workaround for this case, at least for the
divide case.

Thanks,
ANdrew

>
> Bootstrapped on powerpc64-linux; regression check still in progress
> (with Init(1) to actually test anything).
>
>
> Segher
>
>
> 2016-04-01  Segher Boessenkool  <segher@kernel.crashing.org>
>
>         * loop-init.c: Include some more stuff that really doesn't belong
>         here, oh well.
>         (loop_optimizer_init): Add empty asm statements in all gimple loops,
>         if asked to.
>         * common.opt: Add new option.
>
> ---
>  gcc/common.opt  |  4 ++++
>  gcc/loop-init.c | 15 +++++++++++++++
>  2 files changed, 19 insertions(+)
>
> diff --git a/gcc/loop-init.c b/gcc/loop-init.c
> index 8634591..7c5dc24 100644
> --- a/gcc/loop-init.c
> +++ b/gcc/loop-init.c
> @@ -24,6 +24,8 @@ along with GCC; see the file COPYING3.  If not see
>  #include "target.h"
>  #include "rtl.h"
>  #include "tree.h"
> +#include "gimple.h"
> +#include "gimple-iterator.h"
>  #include "cfghooks.h"
>  #include "df.h"
>  #include "regs.h"
> @@ -91,6 +93,19 @@ loop_optimizer_init (unsigned flags)
>
>        /* Find the loops.  */
>        current_loops = flow_loops_find (NULL);
> +
> +      if (flag_never_gonna_give_you_up && current_ir_type () == IR_GIMPLE)
> +       {
> +         struct loop *loop;
> +         FOR_EACH_LOOP (loop, 0)
> +           if (loop->latch)
> +             {
> +               gasm *p = gimple_build_asm_vec ("", 0, 0, 0, 0);
> +               gimple_asm_set_volatile (p, true);
> +               gimple_stmt_iterator bsi = gsi_after_labels (loop->latch);
> +               gsi_insert_before (&bsi, p, GSI_SAME_STMT);
> +             }
> +       }
>      }
>    else
>      {
> diff --git a/gcc/common.opt b/gcc/common.opt
> index 0f3bb4e..b7c0a6a 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -2002,6 +2002,10 @@ frerun-loop-opt
>  Common Ignore
>  Does nothing.  Preserved for backward compatibility.
>
> +frickroll-all-loops
> +Common Report Var(flag_never_gonna_give_you_up) Init(0) Optimization
> +You know the rules, and so do I.
> +
>  frounding-math
>  Common Report Var(flag_rounding_math) Optimization SetByCombined
>  Disable optimizations that assume default FP rounding behavior.
> --
> 1.9.3
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]