diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index c4e181d3594a20b63f77f37733ddbc7c9d43f53d..7ebcac3066668d6c5b5709c8825e59638174e1d2 100644 --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -14258,7 +14258,7 @@ multiple_of_p (tree type, const_tree top, const_tree bottom, bool nowrap) && TREE_CODE (op2) == INTEGER_CST && integer_pow2p (bottom) && wi::multiple_of_p (wi::to_widest (op2), - wi::to_widest (bottom), UNSIGNED)) + wi::to_widest (bottom), SIGNED)) return 1; op1 = gimple_assign_rhs1 (stmt); diff --git a/gcc/testsuite/gcc.dg/pr112733.c b/gcc/testsuite/gcc.dg/pr112733.c new file mode 100644 index 0000000000000000000000000000000000000000..d6f99f76077515eb8c8cbbcbf9169b247526cd10 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112733.c @@ -0,0 +1,16 @@ +/* PR middle-end/112733 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +signed char a, c; +short b; + +void +foo (void) +{ + signed char *e = &a; + c = foo != 0; + *e &= c; + for (; b; --b) + *e &= -128; +}