-2016-05-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+2017-05-04 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/80622
+ * tree-sra.c (comes_initialized_p): New function.
+ (build_accesses_from_assign): Only set write lazily when
+ comes_initialized_p is false.
+ (analyze_access_subtree): Use comes_initialized_p.
+ (propagate_subaccesses_across_link): Assert !comes_initialized_p
+ instead of testing for PARM_DECL.
+
+2017-05-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.md (prefetch); Adjust predicate and
constraint on operand 0 to allow more general addressing modes.
-2016-05-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+2017-05-04 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/80622
+ * gcc.dg/tree-ssa/pr80622.c: New test.
+
+2017-05-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/aarch64/prfm_imm_offset_1.c: New test.
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O" } */
+
+struct S { int d; char e; int f; char g; } a;
+char c;
+
+int
+main ()
+{
+ struct S b[][1] = {3, 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3,
+ 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3, 0,
+ 3, 4, 3, 4, 7, 7, 3, 5, 0, 3, 4, 7, 7, 3, 5, 0, 3,
+ 4, 3, 4, 7, 7, 3, 5, 0, 3, 4, 7, 7, 3, 5, 0, 3, 4};
+ a = b[4][0];
+ c = b[4][0].e;
+ if (a.g != 4)
+ __builtin_abort ();
+ return 0;
+}
return false;
}
+/* Return true if the nature of BASE is such that it contains data even if
+ there is no write to it in the function. */
+
+static bool
+comes_initialized_p (tree base)
+{
+ return TREE_CODE (base) == PARM_DECL || constant_decl_p (base);
+}
+
/* Scan expressions occurring in STMT, create access structures for all accesses
to candidates for scalarization and remove those candidates which occur in
statements or expressions that prevent them from being split apart. Return
link->racc = racc;
add_link_to_rhs (racc, link);
/* Let's delay marking the areas as written until propagation of accesses
- across link. */
- lacc->write = false;
+ across link, unless the nature of rhs tells us that its data comes
+ from elsewhere. */
+ if (!comes_initialized_p (racc->base))
+ lacc->write = false;
}
return lacc || racc;
if (!hole || root->grp_total_scalarization)
root->grp_covered = 1;
- else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL
- || constant_decl_p (root->base))
+ else if (root->grp_write || comes_initialized_p (root->base))
root->grp_unscalarized_data = 1; /* not covered and written to */
return sth_created;
}
/* IF the LHS is still not marked as being written to, we only need to do so
if the RHS at this level actually was. */
- if (!lacc->grp_write &&
- (racc->grp_write || TREE_CODE (racc->base) == PARM_DECL))
+ if (!lacc->grp_write)
{
- lacc->grp_write = true;
- ret = true;
+ gcc_checking_assert (!comes_initialized_p (racc->base));
+ if (racc->grp_write)
+ {
+ lacc->grp_write = true;
+ ret = true;
+ }
}
if (is_gimple_reg_type (lacc->type)