re PR tree-optimization/91482 (__builtin_assume_aligned should not break write combining)

2019-08-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/91482
	* tree-ssa-ccp.c (ccp_folder::fold_stmt): Remove useless
	BUILT_IN_ASSUME_ALIGNED calls.

	* gcc.dg/tree-ssa/pr91482.c: New testcase.

From-SVN: r274796
This commit is contained in:
Richard Biener 2019-08-21 11:45:34 +00:00 committed by Richard Biener
parent 8bb2ee5939
commit d6dea10acf
4 changed files with 50 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2019-08-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/91482
* tree-ssa-ccp.c (ccp_folder::fold_stmt): Remove useless
BUILT_IN_ASSUME_ALIGNED calls.
2019-08-21 Richard Biener <rguenther@suse.de> 2019-08-21 Richard Biener <rguenther@suse.de>
PR target/91498 PR target/91498

View File

@ -1,3 +1,8 @@
2019-08-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/91482
* gcc.dg/tree-ssa/pr91482.c: New testcase.
2019-08-21 Eric Botcazou <ebotcazou@adacore.com> 2019-08-21 Eric Botcazou <ebotcazou@adacore.com>
* c-c++-common/dump-ada-spec-15.c: New test. * c-c++-common/dump-ada-spec-15.c: New test.

View File

@ -0,0 +1,13 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-ccp1 -fdump-tree-store-merging" } */
void write64 (void *p)
{
unsigned *p1 = (unsigned *) __builtin_assume_aligned (p, 8);
*p1++ = 0;
unsigned *p2 = (unsigned *) __builtin_assume_aligned (p1, 4);
*p2++ = 1;
}
/* { dg-final { scan-tree-dump-times "__builtin_assume_aligned" 1 "ccp1" } } */
/* { dg-final { scan-tree-dump "New sequence of 1 stores to replace old one of 2 stores" "store-merging" { target lp64 } } } */

View File

@ -2315,6 +2315,32 @@ ccp_folder::fold_stmt (gimple_stmt_iterator *gsi)
} }
} }
/* If there's no extra info from an assume_aligned call,
drop it so it doesn't act as otherwise useless dataflow
barrier. */
if (gimple_call_builtin_p (stmt, BUILT_IN_ASSUME_ALIGNED))
{
tree ptr = gimple_call_arg (stmt, 0);
ccp_prop_value_t ptrval = get_value_for_expr (ptr, true);
if (ptrval.lattice_val == CONSTANT
&& TREE_CODE (ptrval.value) == INTEGER_CST
&& ptrval.mask != 0)
{
ccp_prop_value_t val
= bit_value_assume_aligned (stmt, NULL_TREE, ptrval, false);
unsigned int ptralign = least_bit_hwi (ptrval.mask.to_uhwi ());
unsigned int align = least_bit_hwi (val.mask.to_uhwi ());
if (ptralign == align
&& ((TREE_INT_CST_LOW (ptrval.value) & (align - 1))
== (TREE_INT_CST_LOW (val.value) & (align - 1))))
{
bool res = update_call_from_tree (gsi, ptr);
gcc_assert (res);
return true;
}
}
}
/* Propagate into the call arguments. Compared to replace_uses_in /* Propagate into the call arguments. Compared to replace_uses_in
this can use the argument slot types for type verification this can use the argument slot types for type verification
instead of the current argument type. We also can safely instead of the current argument type. We also can safely