Commit aac8b8ed by Roger Sayle

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

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
parent 8e77de24
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
......
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
/* 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;
}
}
...@@ -387,18 +387,20 @@ idx_analyze_ref (tree base, tree *index, void *data) ...@@ -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, ...@@ -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, ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment