+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>
PR c/25993
--- /dev/null
+/* 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;
+ }
+}
+
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
- reference occurs in statement STMT. */
+ reference occurs in statement STMT. Strips nonaddressable component
+ references from REF_P. */
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,
tree stmt)
{
struct ar_data ar_data;
tree off;
HOST_WIDE_INT bit_offset;
+ tree ref = *ref_p;
*step = 0;
*delta = 0;
&& DECL_NONADDRESSABLE_P (TREE_OPERAND (ref, 1)))
ref = TREE_OPERAND (ref, 0);
+ *ref_p = ref;
+
for (; TREE_CODE (ref) == COMPONENT_REF; ref = TREE_OPERAND (ref, 0))
{
off = DECL_FIELD_BIT_OFFSET (TREE_OPERAND (ref, 1));
HOST_WIDE_INT step, delta;
struct mem_ref_group *agrp;
- if (!analyze_ref (loop, ref, &base, &step, &delta, stmt))
+ if (!analyze_ref (loop, &ref, &base, &step, &delta, stmt))
return;
/* Now we know that REF = &BASE + STEP * iter + DELTA, where DELTA and STEP