Add -Wdisabled-optimization to loop prefetching pass (PR tree-optimization/79803).
2017-03-03 Martin Liska <mliska@suse.cz> 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 <mliska@suse.cz> PR tree-optimization/79803 * gcc.dg/tree-ssa/pr79803.c: New test. From-SVN: r245869
This commit is contained in:
parent
ec7f796e87
commit
d78a1c01db
|
@ -1,3 +1,11 @@
|
|||
2017-03-03 Martin Liska <mliska@suse.cz>
|
||||
|
||||
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 <mliska@suse.cz>
|
||||
|
||||
PR rtl-optimization/79574
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2017-03-03 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR tree-optimization/79803
|
||||
* gcc.dg/tree-ssa/pr79803.c: New test.
|
||||
|
||||
2017-03-03 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR rtl-optimization/79574
|
||||
|
|
|
@ -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 <setjmp.h>
|
||||
|
||||
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;
|
||||
}
|
|
@ -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,
|
||||
"%<l1-cache-size%> parameter is not a power of two %d",
|
||||
PREFETCH_BLOCK);
|
||||
warned = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return tree_ssa_prefetch_arrays ();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue