Commit d6dea10a by Richard Biener Committed by Richard Biener

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
parent 8bb2ee59
2019-08-21 Richard Biener <rguenther@suse.de> 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>
PR target/91498 PR target/91498
PR target/91503 PR target/91503
* config/i386/i386-features.c * config/i386/i386-features.c
......
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.
......
/* { 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 } } } */
...@@ -2315,6 +2315,32 @@ ccp_folder::fold_stmt (gimple_stmt_iterator *gsi) ...@@ -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
......
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