mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-30 23:35:00 +08:00
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.
This commit is contained in:
parent
d65eb8a6bb
commit
5c95bf945c
@ -14563,7 +14563,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 true;
|
||||
|
||||
op1 = gimple_assign_rhs1 (stmt);
|
||||
|
16
gcc/testsuite/gcc.dg/pr112733.c
Normal file
16
gcc/testsuite/gcc.dg/pr112733.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user