This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: c/8224: Incorrect joining of signed and unsigned division
- From: Glen Nakamura <glen at imodulo dot com>
- To: gcc-gnats at gcc dot gnu dot org, gcc-bugs at gcc dot gnu dot org,mikulas at artax dot karlin dot mff dot cuni dot cz
- Date: Sat, 15 Mar 2003 21:50:10 +0000
- Subject: Re: c/8224: Incorrect joining of signed and unsigned division
I'm testing the following patch as a fix to PR c/8224:
* fold-const.c (extract_muldiv_1): Don't pass through type conversions
when signedness changes for division or modulus.
diff -Nru3p gcc-3.3.orig/gcc/fold-const.c gcc-3.3/gcc/fold-const.c
--- gcc-3.3.orig/gcc/fold-const.c 2003-02-16 08:25:20.000000000 +0000
+++ gcc-3.3/gcc/fold-const.c 2003-02-16 08:25:20.000000000 +0000
@@ -4117,7 +4117,12 @@ extract_muldiv_1 (t, c, code, wide_type)
/* ... or its type is larger than ctype,
then we cannot pass through this truncation. */
|| (GET_MODE_SIZE (TYPE_MODE (ctype))
- < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))))
+ < GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
+ /* ... or signedness changes for division or modulus,
+ then we cannot pass through this conversion. */
+ || (code != MULT_EXPR
+ && (TREE_UNSIGNED (ctype)
+ != TREE_UNSIGNED (TREE_TYPE (op0))))))
break;
/* Pass the constant down and see if we can make a simplification. If