diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2013-08-24 00:16:08 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2013-08-23 22:16:08 +0000 |
commit | 0cadbfaa89805ce4d1b93bed04c10d7c7bf1f6e2 (patch) | |
tree | fd1a5007e3c6c876ebf4f1982aa74584d82afc0d /gcc/builtins.c | |
parent | 4500f676e138a5ea3337ebd47745d8b49ba775b5 (diff) | |
download | gcc-0cadbfaa89805ce4d1b93bed04c10d7c7bf1f6e2.zip gcc-0cadbfaa89805ce4d1b93bed04c10d7c7bf1f6e2.tar.gz gcc-0cadbfaa89805ce4d1b93bed04c10d7c7bf1f6e2.tar.bz2 |
re PR other/57324 (Undefined behavior issues found with clang's -fsanitize=undefined)
2013-08-24 Marc Glisse <marc.glisse@inria.fr>
PR other/57324
* hwint.h (HOST_WIDE_INT_UC, HOST_WIDE_INT_1U, HOST_WIDE_INT_M1,
HOST_WIDE_INT_M1U): New macros.
* fold-const.c (sign_bit_p, build_range_check, fold_unary_loc,
fold_binary_loc, fold_ternary_loc): Use the new macros. Use an
unsigned -1 for lshift.
* cse.c (cse_insn): Likewise.
* double-int.c (rshift_double, lshift_double): Likewise.
* builtins.c (fold_builtin_bitop): Likewise.
* combine.c (force_to_mode): Likewise.
* tree.c (integer_pow2p, tree_log2, tree_floor_log2): Likewise.
* simplify-rtx.c (simplify_const_unary_operation,
simplify_const_binary_operation): Likewise.
* tree-stdarg.c (va_list_counter_bump, va_list_ptr_read,
check_va_list_escapes): Likewise.
* rtlanal.c (nonzero_bits1): Likewise.
* expmed.c (expand_smod_pow2): Likewise.
* tree-ssa-structalias.c (UNKNOWN_OFFSET): Use HOST_WIDE_INT_MIN.
From-SVN: r201953
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index f6f61c7..d8baad1 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -8133,14 +8133,13 @@ fold_builtin_bitop (tree fndecl, tree arg) { hi = TREE_INT_CST_HIGH (arg); if (width < HOST_BITS_PER_DOUBLE_INT) - hi &= ~((unsigned HOST_WIDE_INT) (-1) - << (width - HOST_BITS_PER_WIDE_INT)); + hi &= ~(HOST_WIDE_INT_M1U << (width - HOST_BITS_PER_WIDE_INT)); } else { hi = 0; if (width < HOST_BITS_PER_WIDE_INT) - lo &= ~((unsigned HOST_WIDE_INT) (-1) << width); + lo &= ~(HOST_WIDE_INT_M1U << width); } switch (DECL_FUNCTION_CODE (fndecl)) @@ -8179,13 +8178,13 @@ fold_builtin_bitop (tree fndecl, tree arg) && (hi & ((unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1))) != 0) { - hi = ~hi & ~((unsigned HOST_WIDE_INT) (-1) + hi = ~hi & ~(HOST_WIDE_INT_M1U << (width - HOST_BITS_PER_WIDE_INT - 1)); lo = ~lo; } else if (width <= HOST_BITS_PER_WIDE_INT && (lo & ((unsigned HOST_WIDE_INT) 1 << (width - 1))) != 0) - lo = ~lo & ~((unsigned HOST_WIDE_INT) (-1) << (width - 1)); + lo = ~lo & ~(HOST_WIDE_INT_M1U << (width - 1)); if (hi != 0) result = width - floor_log2 (hi) - 2 - HOST_BITS_PER_WIDE_INT; else if (lo != 0) |