re PR tree-optimization/28887 (rejects valid code (bitfields and loops) with -O1 -fprefetch-loop-arrays)

2006-09-17  Zdenek Dvorak <dvorakz@suse.cz>

	PR tree-optimization/28887
	* tree-ssa-loop-prefetch.c (analyze_ref): Strip nonaddressable
	component parts from the reference.
	(gather_memory_references_ref): Record the reference without the
	nonaddressable component parts.

	* gcc.dg/prefetch-loop-arrays-1.c: New test case.

From-SVN: r117012
This commit is contained in:
Roger Sayle 2006-09-18 01:54:33 +00:00
parent 8e77de24de
commit aac8b8ed8a
4 changed files with 57 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2006-09-17 Zdenek Dvorak <dvorakz@suse.cz>
PR tree-optimization/28887
* tree-ssa-loop-prefetch.c (analyze_ref): Strip nonaddressable
component parts from the reference.
(gather_memory_references_ref): Record the reference without the
nonaddressable component parts.
2006-09-17 Steven Bosscher <steven@gcc.gnu.org> 2006-09-17 Steven Bosscher <steven@gcc.gnu.org>
PR c/25993 PR c/25993

View File

@ -1,3 +1,8 @@
2006-09-17 Roger Sayle <roger@eyesopen.com>
PR tree-optimization/28887
* gcc.dg/prefetch-loop-arrays-1.c: New test case.
2006-09-16 Steven Bosscher <steven@gcc.gnu.org> 2006-09-16 Steven Bosscher <steven@gcc.gnu.org>
PR c/25993 PR c/25993

View File

@ -0,0 +1,36 @@
/* PR tree-optimization/28887 */
/* { dg-do compile } */
/* { dg-options "-O2 -fprefetch-loop-arrays -w" } */
/* { dg-options "-O2 -fprefetch-loop-arrays -march=i686 -msse -w" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
typedef unsigned long size_t;
struct re_pattern_buffer
{
size_t re_nsub;
};
typedef enum
{
start_memory,
} re_opcode_t;
typedef union
{
struct
{
unsigned matched_something:1;
} bits;
} byte_register_info_type;
void byte_re_match_2_internal (struct re_pattern_buffer *bufp)
{
int mcnt;
size_t num_regs = bufp->re_nsub + 1;
byte_register_info_type *reg_info;
for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
{
((reg_info[mcnt]).bits.matched_something) = 0;
}
}

View File

@ -387,18 +387,20 @@ idx_analyze_ref (tree base, tree *index, void *data)
return true; return true;
} }
/* Tries to express REF in shape &BASE + STEP * iter + DELTA, where DELTA and /* Tries to express REF_P in shape &BASE + STEP * iter + DELTA, where DELTA and
STEP are integer constants and iter is number of iterations of LOOP. The STEP are integer constants and iter is number of iterations of LOOP. The
reference occurs in statement STMT. */ reference occurs in statement STMT. Strips nonaddressable component
references from REF_P. */
static bool static bool
analyze_ref (struct loop *loop, tree ref, tree *base, analyze_ref (struct loop *loop, tree *ref_p, tree *base,
HOST_WIDE_INT *step, HOST_WIDE_INT *delta, HOST_WIDE_INT *step, HOST_WIDE_INT *delta,
tree stmt) tree stmt)
{ {
struct ar_data ar_data; struct ar_data ar_data;
tree off; tree off;
HOST_WIDE_INT bit_offset; HOST_WIDE_INT bit_offset;
tree ref = *ref_p;
*step = 0; *step = 0;
*delta = 0; *delta = 0;
@ -408,6 +410,8 @@ analyze_ref (struct loop *loop, tree ref, tree *base,
&& DECL_NONADDRESSABLE_P (TREE_OPERAND (ref, 1))) && DECL_NONADDRESSABLE_P (TREE_OPERAND (ref, 1)))
ref = TREE_OPERAND (ref, 0); ref = TREE_OPERAND (ref, 0);
*ref_p = ref;
for (; TREE_CODE (ref) == COMPONENT_REF; ref = TREE_OPERAND (ref, 0)) for (; TREE_CODE (ref) == COMPONENT_REF; ref = TREE_OPERAND (ref, 0))
{ {
off = DECL_FIELD_BIT_OFFSET (TREE_OPERAND (ref, 1)); off = DECL_FIELD_BIT_OFFSET (TREE_OPERAND (ref, 1));
@ -436,7 +440,7 @@ gather_memory_references_ref (struct loop *loop, struct mem_ref_group **refs,
HOST_WIDE_INT step, delta; HOST_WIDE_INT step, delta;
struct mem_ref_group *agrp; struct mem_ref_group *agrp;
if (!analyze_ref (loop, ref, &base, &step, &delta, stmt)) if (!analyze_ref (loop, &ref, &base, &step, &delta, stmt))
return; return;
/* Now we know that REF = &BASE + STEP * iter + DELTA, where DELTA and STEP /* Now we know that REF = &BASE + STEP * iter + DELTA, where DELTA and STEP