Commit da76b253 by Richard Biener Committed by Richard Biener

re PR tree-optimization/82697 (Wrong optimization with aliasing and "if")

2017-10-24  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/82697
	* tree-ssa-phiopt.c (cond_store_replacement): Use alias-set
	zero for conditional load and unconditional store.

	* gcc.dg/torture/pr82697.c: New testcase.

From-SVN: r254047
parent eab01c18
2017-10-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/82697
* tree-ssa-phiopt.c (cond_store_replacement): Use alias-set
zero for conditional load and unconditional store.
2017-10-24 H.J. Lu <hongjiu.lu@intel.com> 2017-10-24 H.J. Lu <hongjiu.lu@intel.com>
* doc/install.texi: Document bootstrap-cet. * doc/install.texi: Document bootstrap-cet.
2017-10-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/82697
* gcc.dg/torture/pr82697.c: New testcase.
2017-10-24 Mukesh Kapoor <mukesh.kapoor@oracle.com> 2017-10-24 Mukesh Kapoor <mukesh.kapoor@oracle.com>
Paolo Carlini <paolo.carlini@oracle.com> Paolo Carlini <paolo.carlini@oracle.com>
......
/* { dg-do run } */
__attribute__((noinline,noclone))
void test(int *pi, long *pl, int f)
{
*pl = 0;
*pi = 1;
if (f)
*pl = 2;
}
int main()
{
void *p = __builtin_malloc(sizeof (long));
test(p, p, 0);
if (*(int *)p != 1)
__builtin_abort ();
return 0;
}
...@@ -1912,9 +1912,24 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb, ...@@ -1912,9 +1912,24 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb,
gsi_remove (&gsi, true); gsi_remove (&gsi, true);
release_defs (assign); release_defs (assign);
/* Make both store and load use alias-set zero as we have to
deal with the case of the store being a conditional change
of the dynamic type. */
lhs = unshare_expr (lhs);
tree *basep = &lhs;
while (handled_component_p (*basep))
basep = &TREE_OPERAND (*basep, 0);
if (TREE_CODE (*basep) == MEM_REF
|| TREE_CODE (*basep) == TARGET_MEM_REF)
TREE_OPERAND (*basep, 1)
= fold_convert (ptr_type_node, TREE_OPERAND (*basep, 1));
else
*basep = build2 (MEM_REF, TREE_TYPE (*basep),
build_fold_addr_expr (*basep),
build_zero_cst (ptr_type_node));
/* 2) Insert a load from the memory of the store to the temporary /* 2) Insert a load from the memory of the store to the temporary
on the edge which did not contain the store. */ on the edge which did not contain the store. */
lhs = unshare_expr (lhs);
name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore"); name = make_temp_ssa_name (TREE_TYPE (lhs), NULL, "cstore");
new_stmt = gimple_build_assign (name, lhs); new_stmt = gimple_build_assign (name, lhs);
gimple_set_location (new_stmt, locus); gimple_set_location (new_stmt, locus);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment