+2019-06-04 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/90738
+ Revert
+ 2019-06-03 Richard Biener <rguenther@suse.de>
+
+ * tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Get original
+ full reference tree and record in ref->ref.
+ (vn_reference_lookup_3): Pass in original ref to
+ ao_ref_init_from_vn_reference.
+ (vn_reference_lookup): Likewise.
+ * tree-ssa-sccvn.h (ao_ref_init_from_vn_reference): Adjust prototype.
+ * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p):
+ Handle non-decl bases in the original reference.
+
2019-06-04 Martin Liska <mliska@suse.cz>
* ipa-icf.c (sem_item_optimizer::add_item_to_class): Count
+2019-06-04 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/90738
+ * gcc.dg/torture/pr90738.c: New testcase.
+
+ Revert
+ 2019-06-03 Richard Biener <rguenther@suse.de>
+
+ * gcc.dg/tree-ssa/alias-access-path-1.c: Scan fre1.
+
2019-06-04 Martin Liska <mliska@suse.cz>
* c-c++-common/goacc/acc-icf.c: Change scanned pattern.
--- /dev/null
+/* { dg-do run } */
+
+int __attribute__((noipa,noinline))
+foo (int i)
+{
+ int a[2];
+ a[1] = 1;
+ int j = a[1];
+ int *p = &a[0];
+ p[i] = 0;
+ return a[j];
+}
+
+int
+main()
+{
+ if (foo (1) != 0)
+ __builtin_abort ();
+ return 0;
+}
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-fre1 -fno-tree-sra" } */
-
+/* { dg-options "-O2 -fdump-tree-fre3 -fno-tree-sra" } */
struct foo
{
int val;
return barptr->val2;
}
-/* { dg-final { scan-tree-dump-times "return 123" 1 "fre1"} } */
+/* { dg-final { scan-tree-dump-times "return 123" 1 "fre3"} } */
}
if (TREE_CODE (ref1) == MEM_REF)
{
- if (!integer_zerop (TREE_OPERAND (ref1, 1))
- || TREE_CODE (TREE_OPERAND (ref1, 0)) != ADDR_EXPR)
+ if (!integer_zerop (TREE_OPERAND (ref1, 1)))
return false;
ref1 = TREE_OPERAND (TREE_OPERAND (ref1, 0), 0);
}
}
if (TREE_CODE (ref2) == MEM_REF)
{
- if (!integer_zerop (TREE_OPERAND (ref2, 1))
- || TREE_CODE (TREE_OPERAND (ref2, 0)) != ADDR_EXPR)
+ if (!integer_zerop (TREE_OPERAND (ref2, 1)))
return false;
ref2 = TREE_OPERAND (TREE_OPERAND (ref2, 0), 0);
}
bool
ao_ref_init_from_vn_reference (ao_ref *ref,
alias_set_type set, tree type,
- vec<vn_reference_op_s> ops, tree orig_ref)
+ vec<vn_reference_op_s> ops)
{
vn_reference_op_t op;
unsigned i;
if (base == NULL_TREE)
return false;
- ref->ref = orig_ref;
+ ref->ref = NULL_TREE;
ref->base = base;
ref->ref_alias_set = set;
if (base_alias_set != -1)
{
lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref,
get_alias_set (lhs),
- TREE_TYPE (lhs), lhs_ops,
- lhs);
+ TREE_TYPE (lhs), lhs_ops);
if (lhs_ref_ok
&& !refs_may_alias_p_1 (ref, &lhs_ref, true))
{
Otherwise preserve the full reference for advanced TBAA. */
if (!valuezied_anything
|| !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type,
- vr1.operands, op))
+ vr1.operands))
ao_ref_init (&r, op);
if (! tbaa_p)
r.ref_alias_set = r.base_alias_set = 0;
vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code,
tree, tree *, tree, unsigned int);
bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree,
- vec<vn_reference_op_s>, tree = NULL_TREE);
+ vec<vn_reference_op_s> );
vec<vn_reference_op_s> vn_reference_operands_for_lookup (tree);
tree vn_reference_lookup_pieces (tree, alias_set_type, tree,
vec<vn_reference_op_s> ,