tree-optimization/91838 - fix FAIL of g++.dg/opt/pr91838.C
The following fixes the lack of simplification of a vector shift by an out-of-bounds shift value. For scalars this is done both by CCP and VRP but vectors are not handled there. This results in PR91838 differences in outcome dependent on whether a vector shift ISA is available and thus vector lowering does or does not expose scalar shifts here. The following adds a match.pd pattern to catch uniform out-of-bound shifts, simplifying them to zero when not sanitizing shift amounts. PR tree-optimization/91838 * gimple-match-head.cc: Include attribs.h and asan.h. * generic-match-head.cc: Likewise. * match.pd (([rl]shift @0 out-of-bounds) -> zero): New pattern.
This commit is contained in:
parent
a426b91b27
commit
d1c072a1c3
3 changed files with 14 additions and 0 deletions
|
@ -41,6 +41,8 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include "tree-eh.h"
|
||||
#include "langhooks.h"
|
||||
#include "tree-pass.h"
|
||||
#include "attribs.h"
|
||||
#include "asan.h"
|
||||
|
||||
/* Routine to determine if the types T1 and T2 are effectively
|
||||
the same for GENERIC. If T1 or T2 is not a type, the test
|
||||
|
|
|
@ -47,6 +47,8 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include "tm.h"
|
||||
#include "gimple-range.h"
|
||||
#include "langhooks.h"
|
||||
#include "attribs.h"
|
||||
#include "asan.h"
|
||||
|
||||
tree do_valueize (tree, tree (*)(tree), bool &);
|
||||
tree do_valueize (tree (*)(tree), tree);
|
||||
|
|
10
gcc/match.pd
10
gcc/match.pd
|
@ -1059,6 +1059,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
|
|||
&& tree_nop_conversion_p (type, TREE_TYPE (@1)))
|
||||
(lshift @0 @2)))
|
||||
|
||||
/* Shifts by precision or greater result in zero. */
|
||||
(for shift (lshift rshift)
|
||||
(simplify
|
||||
(shift @0 uniform_integer_cst_p@1)
|
||||
(if ((GIMPLE || !sanitize_flags_p (SANITIZE_SHIFT_EXPONENT))
|
||||
/* Use a signed compare to leave negative shift counts alone. */
|
||||
&& wi::ges_p (wi::to_wide (uniform_integer_cst_p (@1)),
|
||||
element_precision (type)))
|
||||
{ build_zero_cst (type); })))
|
||||
|
||||
/* Shifts by constants distribute over several binary operations,
|
||||
hence (X << C) + (Y << C) can be simplified to (X + Y) << C. */
|
||||
(for op (plus minus)
|
||||
|
|
Loading…
Add table
Reference in a new issue