diff options
author | Aldy Hernandez <aldyh@gcc.gnu.org> | 2018-04-13 09:24:58 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2018-04-13 09:24:58 +0000 |
commit | 0bcfd10047731bea91d5a7709d10d8e9177c3826 (patch) | |
tree | 8978339592768252ca6884ab48b743a0557ad877 | |
parent | bdb08d2be4187c11bcfc2ebdbf7f3b6af1c7e4c2 (diff) | |
download | gcc-0bcfd10047731bea91d5a7709d10d8e9177c3826.tar.gz |
Rewrite size_must_be_zero_p with irange infrastructure.
Rewrite size_must_be_zero_p with irange infrastructure. Previous
implementation did not get the bits in [7fff,ffff]. This fixes a
handful of regressions.
From-SVN: r259370
-rw-r--r-- | gcc/gimple-fold.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 521bd75fcd8..af957ce05a2 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -642,9 +642,25 @@ var_decl_component_p (tree var) static bool size_must_be_zero_p (tree size) { - return (integer_zerop (size) - || (TREE_CODE (size) == SSA_NAME - && irange (size).zero_p ())); + if (integer_zerop (size)) + return true; + + if (TREE_CODE (size) != SSA_NAME) + return false; + + tree type = TREE_TYPE (size); + int prec = TYPE_PRECISION (type); + + wide_int wone = wi::one (prec); + + /* Compute the value of SSIZE_MAX, the largest positive value that + can be stored in ssize_t, the signed counterpart of size_t. */ + wide_int ssize_max = wi::lshift (wi::one (prec), prec - 1) - 1; + + irange not_zero (type, wone, ssize_max); + irange size_range (size); + return (size_range.contains_p (0) + && size_range.intersect (not_zero).empty_p ()); } /* Fold function call to builtin mem{{,p}cpy,move}. Try to detect and |