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:
parent
8e77de24de
commit
aac8b8ed8a
@ -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
|
||||||
|
@ -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
|
||||||
|
36
gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c
Normal file
36
gcc/testsuite/gcc.dg/prefetch-loop-arrays-1.c
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user