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:
Martin Liska 2017-03-03 12:53:56 +01:00 committed by Martin Liska
parent ec7f796e87
commit d78a1c01db
4 changed files with 89 additions and 4 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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 ();
}