Skip to content
Snippets Groups Projects
Commit 8c0ea932 authored by Jakub Jelinek's avatar Jakub Jelinek
Browse files

fold-const: Fix up multiple_of_p [PR112733]

We ICE on the following testcase when wi::multiple_of_p is called on
widest_int 1 and -128 with UNSIGNED.  I still need to work on the
actual wide-int.cc issue, the latest patch attached to the PR regressed
bitint-{38,39}.c, so will need to debug that, but there is a clear bug
on the fold-const.cc side as well - widest_int is a signed representation
by definition, using UNSIGNED with it certainly doesn't match what was
intended, because -128 as the second operand effectively means unsigned
131072 bit 0xfffff............ffff80 integer, not the signed char -128
that appeared in the source.

In the INTEGER_CST case a few lines above this we already use
    case INTEGER_CST:
      if (TREE_CODE (bottom) != INTEGER_CST || integer_zerop (bottom))
        return false;
      return wi::multiple_of_p (wi::to_widest (top), wi::to_widest (bottom),
                                SIGNED);
so I think using SIGNED with widest_int is best there (compared to the
other choices in the PR).

2023-11-29  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/112733
	* fold-const.cc (multiple_of_p): Pass SIGNED rather than
	UNSIGNED for wi::multiple_of_p on widest_int arguments.

	* gcc.dg/pr112733.c: New test.

(cherry picked from commit 5c95bf94)
parent 2316fe27
No related branches found
No related tags found
No related merge requests found
...@@ -14258,7 +14258,7 @@ multiple_of_p (tree type, const_tree top, const_tree bottom, bool nowrap) ...@@ -14258,7 +14258,7 @@ multiple_of_p (tree type, const_tree top, const_tree bottom, bool nowrap)
&& TREE_CODE (op2) == INTEGER_CST && TREE_CODE (op2) == INTEGER_CST
&& integer_pow2p (bottom) && integer_pow2p (bottom)
&& wi::multiple_of_p (wi::to_widest (op2), && wi::multiple_of_p (wi::to_widest (op2),
wi::to_widest (bottom), UNSIGNED)) wi::to_widest (bottom), SIGNED))
return 1; return 1;
   
op1 = gimple_assign_rhs1 (stmt); op1 = gimple_assign_rhs1 (stmt);
......
/* 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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment