re PR middle-end/36548 (remainder gives the wrong result for wrapping case with unsigned types)
2008-08-22 Richard Guenther <rguenther@suse.de> PR middle-end/36548 PR middle-end/37125 * fold-const.c (extract_muldiv_1): Optimize (X * C1) % C2 only if the multiplication does not overflow. * gcc.c-torture/execute/pr37125.c: New testcase. From-SVN: r139450
This commit is contained in:
parent
da2f5d14df
commit
beeab17c6e
4 changed files with 48 additions and 1 deletions
|
@ -1,3 +1,10 @@
|
|||
2008-08-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/36548
|
||||
PR middle-end/37125
|
||||
* fold-const.c (extract_muldiv_1): Optimize (X * C1) % C2 only
|
||||
if the multiplication does not overflow.
|
||||
|
||||
2008-08-21 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* c-ppoutput.c (init_pp_output): Initialize src_line to 1.
|
||||
|
|
|
@ -5930,9 +5930,20 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
|
|||
(C * 8) % 4 since we know that's zero. */
|
||||
if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
|
||||
|| code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
|
||||
/* If the multiplication can overflow we cannot optimize this.
|
||||
??? Until we can properly mark individual operations as
|
||||
not overflowing we need to treat sizetype special here as
|
||||
stor-layout relies on this opimization to make
|
||||
DECL_FIELD_BIT_OFFSET always a constant. */
|
||||
&& (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
|
||||
|| (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
|
||||
&& TYPE_IS_SIZETYPE (TREE_TYPE (t))))
|
||||
&& TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
|
||||
&& integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
|
||||
return omit_one_operand (type, integer_zero_node, op0);
|
||||
{
|
||||
*strict_overflow_p = true;
|
||||
return omit_one_operand (type, integer_zero_node, op0);
|
||||
}
|
||||
|
||||
/* ... fall through ... */
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2008-08-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/36548
|
||||
PR middle-end/37125
|
||||
* gcc.c-torture/execute/pr37125.c: New testcase.
|
||||
|
||||
2008-08-22 Daniel Kraft <d@domob.eu>
|
||||
|
||||
* gfortran.dg/used_before_typed_4.f90: New test.
|
||||
|
|
23
gcc/testsuite/gcc.c-torture/execute/pr37125.c
Normal file
23
gcc/testsuite/gcc.c-torture/execute/pr37125.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
extern void abort (void);
|
||||
|
||||
static inline unsigned int
|
||||
mod_rhs(int rhs)
|
||||
{
|
||||
if (rhs == 0) return 1;
|
||||
return rhs;
|
||||
}
|
||||
|
||||
void func_44 (unsigned int p_45);
|
||||
void func_44 (unsigned int p_45)
|
||||
{
|
||||
if (!((p_45 * -9) % mod_rhs (-9))) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
func_44 (2);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue