+2019-03-04 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/89487
+ * tree-loop-distribution.c (has_nonaddressable_dataref_p): New.
+ (create_rdg_vertices): Compute has_nonaddressable_dataref_p.
+ (distribute_loop): Don't do runtime alias check if there is non-
+ addressable data reference.
+ * tree-ssa-loop-ivopts.c (may_be_nonaddressable_p): Check if VAR_DECL
+ is a register variable.
+
2019-03-02 Jakub Jelinek <jakub@redhat.com>
PR target/89506
+2018-03-04 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/89487
+ * gcc/testsuite/gcc.dg/tree-ssa/pr89487.c: New test.
+
2019-03-03 Harald Anlauf <anlauf@gmx.de>
PR fortran/77583
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-loop-distribution" } */
+
+void
+caml_interprete (void)
+{
+ register int *pc asm("%r15");
+ register int *sp asm("%r14");
+ int i;
+
+ for (i = 0; i < 3; ++i)
+ *--sp = pc[i];
+}
/* Vector of data references in the loop to be distributed. */
static vec<data_reference_p> datarefs_vec;
+/* If there is nonaddressable data reference in above vector. */
+static bool has_nonaddressable_dataref_p;
+
/* Store index of data reference in aux field. */
#define DR_INDEX(dr) ((uintptr_t) (dr)->aux)
else
RDGV_HAS_MEM_WRITE (v) = true;
RDGV_DATAREFS (v).safe_push (dr);
+ has_nonaddressable_dataref_p |= may_be_nonaddressable_p (dr->ref);
}
}
return true;
}
datarefs_vec.create (20);
+ has_nonaddressable_dataref_p = false;
rdg = build_rdg (loop, cd);
if (!rdg)
{
if (partitions.length () > 1)
{
/* Don't support loop nest distribution under runtime alias check
- since it's not likely to enable many vectorization opportunities. */
- if (loop->inner)
+ since it's not likely to enable many vectorization opportunities.
+ Also if loop has any data reference which may be not addressable
+ since alias check needs to take, compare address of the object. */
+ if (loop->inner || has_nonaddressable_dataref_p)
merge_dep_scc_partitions (rdg, &partitions, false);
else
{
{
switch (TREE_CODE (expr))
{
+ case VAR_DECL:
+ /* Check if it's a register variable. */
+ return DECL_HARD_REGISTER (expr);
+
case TARGET_MEM_REF:
/* TARGET_MEM_REFs are translated directly to valid MEMs on the
target, thus they are always addressable. */