re PR middle-end/39867 (Wrong result of conditional operator exp < 2 ? 2U : (unsigned int) exp)
2009-04-24 Paolo Bonzini <bonzini@gnu.org> PR middle-end/39867 * fold-const.c (fold_cond_expr_with_comparison): When folding > and >= to MAX, make sure the MAX uses the same type as the comparison's operands. testsuite: 2009-04-24 Paolo Bonzini <bonzini@gnu.org> PR middle-end/39867 * gcc.dg/pr39867.c: New. From-SVN: r146702
This commit is contained in:
parent
fab1077d26
commit
35c53992fd
|
@ -1,3 +1,10 @@
|
|||
2009-04-24 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
PR middle-end/39867
|
||||
* fold-const.c (fold_cond_expr_with_comparison): When folding
|
||||
> and >= to MAX, make sure the MAX uses the same type as the
|
||||
comparison's operands.
|
||||
|
||||
2009-04-23 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
|
||||
|
||||
* config/spu/spu-builtins.h: Delete file.
|
||||
|
|
|
@ -5293,31 +5293,34 @@ fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
|
|||
break;
|
||||
|
||||
case GT_EXPR:
|
||||
/* If C1 is C2 - 1, this is max(A, C2). */
|
||||
/* If C1 is C2 - 1, this is max(A, C2), but use ARG00's type for
|
||||
MAX_EXPR, to preserve the signedness of the comparison. */
|
||||
if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
|
||||
OEP_ONLY_CONST)
|
||||
&& operand_equal_p (arg01,
|
||||
const_binop (MINUS_EXPR, arg2,
|
||||
build_int_cst (type, 1), 0),
|
||||
OEP_ONLY_CONST))
|
||||
return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
|
||||
type,
|
||||
fold_convert (type, arg1),
|
||||
arg2));
|
||||
return pedantic_non_lvalue (fold_convert (type,
|
||||
fold_build2 (MAX_EXPR, TREE_TYPE (arg00),
|
||||
arg00,
|
||||
fold_convert (TREE_TYPE (arg00),
|
||||
arg2))));
|
||||
break;
|
||||
|
||||
case GE_EXPR:
|
||||
/* If C1 is C2 + 1, this is max(A, C2). */
|
||||
/* If C1 is C2 + 1, this is max(A, C2), with the same care as above. */
|
||||
if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
|
||||
OEP_ONLY_CONST)
|
||||
&& operand_equal_p (arg01,
|
||||
const_binop (PLUS_EXPR, arg2,
|
||||
build_int_cst (type, 1), 0),
|
||||
OEP_ONLY_CONST))
|
||||
return pedantic_non_lvalue (fold_build2 (MAX_EXPR,
|
||||
type,
|
||||
fold_convert (type, arg1),
|
||||
arg2));
|
||||
return pedantic_non_lvalue (fold_convert (type,
|
||||
fold_build2 (MAX_EXPR, TREE_TYPE (arg00),
|
||||
arg00,
|
||||
fold_convert (TREE_TYPE (arg00),
|
||||
arg2))));
|
||||
break;
|
||||
case NE_EXPR:
|
||||
break;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2009-04-24 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
PR middle-end/39867
|
||||
* gcc.dg/pr39867.c: New.
|
||||
|
||||
2009-04-23 Dodji Seketeli <dodji@redhat.com>
|
||||
|
||||
PR c++/38228
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
/* { dg-do link } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int exp = -1;
|
||||
/* Wrong folding of the LHS to an unsigned MAX leads to 4294967295 != 2. */
|
||||
if ((exp < 2 ? 2U : (unsigned int) exp) != 2)
|
||||
link_error ();
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue