From: Martin Liska Date: Fri, 3 Mar 2017 11:53:56 +0000 (+0100) Subject: Add -Wdisabled-optimization to loop prefetching pass (PR tree-optimization/79803). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d78a1c01dbb859cb406ffdea3bc2ced2963cae9a;p=gcc.git Add -Wdisabled-optimization to loop prefetching pass (PR tree-optimization/79803). 2017-03-03 Martin Liska PR tree-optimization/79803 * tree-ssa-loop-prefetch.c (tree_ssa_prefetch_arrays): Remove assert. (pass_loop_prefetch::execute): Disabled optimization if an assumption about L1 cache size is not met. 2017-03-03 Martin Liska PR tree-optimization/79803 * gcc.dg/tree-ssa/pr79803.c: New test. From-SVN: r245869 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1617bc1a154..68a03df81c9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-03-03 Martin Liska + + PR tree-optimization/79803 + * tree-ssa-loop-prefetch.c (tree_ssa_prefetch_arrays): Remove + assert. + (pass_loop_prefetch::execute): Disabled optimization if an + assumption about L1 cache size is not met. + 2017-03-03 Martin Liska PR rtl-optimization/79574 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6f59a450b1d..a1586282379 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-03 Martin Liska + + PR tree-optimization/79803 + * gcc.dg/tree-ssa/pr79803.c: New test. + 2017-03-03 Martin Liska PR rtl-optimization/79574 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr79803.c b/gcc/testsuite/gcc.dg/tree-ssa/pr79803.c new file mode 100644 index 00000000000..51b245d4d5b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr79803.c @@ -0,0 +1,60 @@ +/* { dg-do compile { target { x86_64-*-* } } } */ +/* { dg-options "-march=opteron-sse3 -Ofast --param l1-cache-line-size=3 -Wdisabled-optimization" } */ +/* { dg-require-effective-target indirect_jumps } */ + +#include + +extern void abort (void); + +jmp_buf buf; + +void raise0(void) +{ + __builtin_longjmp (buf, 1); +} + +int execute(int cmd) /* { dg-warning "'l1-cache-size' parameter is not a power of two 3" } */ +{ + int last = 0; + + if (__builtin_setjmp (buf) == 0) + while (1) + { + last = 1; + raise0 (); + } + + if (last == 0) + return 0; + else + return cmd; +} + +int execute2(int cmd, int cmd2) +{ + int last = 0; + + if (__builtin_setjmp (buf) == 0) + while (1) + { + last = 1; + raise0 (); + } + + if (last == 0) + return 0; + else + return cmd; +} + + +int main(void) +{ + if (execute (1) == 0) + abort (); + + if (execute2 (1, 2) == 0) + abort (); + + return 0; +} diff --git a/gcc/tree-ssa-loop-prefetch.c b/gcc/tree-ssa-loop-prefetch.c index 54cd9421998..a1372074e9f 100644 --- a/gcc/tree-ssa-loop-prefetch.c +++ b/gcc/tree-ssa-loop-prefetch.c @@ -47,6 +47,7 @@ along with GCC; see the file COPYING3. If not see #include "langhooks.h" #include "tree-inline.h" #include "tree-data-ref.h" +#include "diagnostic-core.h" /* This pass inserts prefetch instructions to optimize cache usage during accesses to arrays in loops. It processes loops sequentially and: @@ -1977,10 +1978,6 @@ tree_ssa_prefetch_arrays (void) set_builtin_decl (BUILT_IN_PREFETCH, decl, false); } - /* We assume that size of cache line is a power of two, so verify this - here. */ - gcc_assert ((PREFETCH_BLOCK & (PREFETCH_BLOCK - 1)) == 0); - FOR_EACH_LOOP (loop, LI_FROM_INNERMOST) { if (dump_file && (dump_flags & TDF_DETAILS)) @@ -2038,6 +2035,21 @@ pass_loop_prefetch::execute (function *fun) if (number_of_loops (fun) <= 1) return 0; + bool warned_p = false; + if ((PREFETCH_BLOCK & (PREFETCH_BLOCK - 1)) != 0) + { + static bool warned = false; + + if (!warned) + { + warning (OPT_Wdisabled_optimization, + "% parameter is not a power of two %d", + PREFETCH_BLOCK); + warned = true; + } + return 0; + } + return tree_ssa_prefetch_arrays (); }