+2010-12-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/46969
+ * tree-parloops.c (struct reduction_info): Add reduc_version.
+ (reduction_info_hash): Return reduc_version field.
+ (reduction_phi): Set reduc_version to gimple_uid (phi).
+ (build_new_reduction): Set reduc_version to SSA_NAME_VERSION of
+ phi result.
+ (set_reduc_phi_uids): New function.
+ (gather_scalar_reductions): Call it at the end through htab_traverse.
+
2010-12-18 Nicola Pero <nicola.pero@meta-innovation.com>
* c-parser.c (c_parser_objc_try_catch_finally_statement): Call
--- /dev/null
+/* PR tree-optimization/46969 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-parallelize-loops=2 -fcompare-debug" } */
+
+extern void abort (void);
+#define F(name) \
+int \
+name (unsigned char *x) \
+{ \
+ int i; \
+ unsigned int c, d, e; \
+ if (x != 0) \
+ { \
+ for (i = 0, d = 0, e = 0xFFFFFFFF; \
+ i < 64; \
+ i += (int) sizeof(unsigned int)) \
+ { \
+ c = *((unsigned int *)(&x[i])); \
+ d = d | c; \
+ e = e & c; \
+ } \
+ if (!((d == e) && ((d >> 8) == (e & 0x00FFFFFF)))) \
+ abort (); \
+ } \
+ return 0; \
+}
+F (foo0) F (foo1)
+F (foo2) F (foo3)
+F (foo4) F (foo5)
+F (foo6) F (foo7)
+F (foo8) F (foo9)
gimple reduc_stmt; /* reduction statement. */
gimple reduc_phi; /* The phi node defining the reduction. */
enum tree_code reduction_code;/* code for the reduction operation. */
+ unsigned reduc_version; /* SSA_NAME_VERSION of original reduc_phi
+ result. */
gimple keep_res; /* The PHI_RESULT of this phi is the resulting value
of the reduction variable when existing the loop. */
tree initial_value; /* The initial value of the reduction var before entering the loop. */
{
const struct reduction_info *a = (const struct reduction_info *) aa;
- return htab_hash_pointer (a->reduc_phi);
+ return a->reduc_version;
}
static struct reduction_info *
return NULL;
tmpred.reduc_phi = phi;
+ tmpred.reduc_version = gimple_uid (phi);
red = (struct reduction_info *) htab_find (reduction_list, &tmpred);
return red;
new_reduction->reduc_stmt = reduc_stmt;
new_reduction->reduc_phi = phi;
+ new_reduction->reduc_version = SSA_NAME_VERSION (gimple_phi_result (phi));
new_reduction->reduction_code = gimple_assign_rhs_code (reduc_stmt);
slot = htab_find_slot (reduction_list, new_reduction, INSERT);
*slot = new_reduction;
}
+/* Callback for htab_traverse. Sets gimple_uid of reduc_phi stmts. */
+
+static int
+set_reduc_phi_uids (void **slot, void *data ATTRIBUTE_UNUSED)
+{
+ struct reduction_info *const red = (struct reduction_info *) *slot;
+ gimple_set_uid (red->reduc_phi, red->reduc_version);
+ return 1;
+}
+
/* Detect all reductions in the LOOP, insert them into REDUCTION_LIST. */
static void
build_new_reduction (reduction_list, reduc_stmt, phi);
}
}
- destroy_loop_vec_info (simple_loop_info, true);
+ destroy_loop_vec_info (simple_loop_info, true);
+
+ /* As gimple_uid is used by the vectorizer in between vect_analyze_loop_form
+ and destroy_loop_vec_info, we can set gimple_uid of reduc_phi stmts
+ only now. */
+ htab_traverse (reduction_list, set_reduc_phi_uids, NULL);
}
/* Try to initialize NITER for code generation part. */