re PR rtl-optimization/51023 (likely integer wrong code bug)
PR rtl-optimization/51023 * combine.c (simplify_comparison) <case SIGN_EXTEND>: Don't use val_signbit_known_clear_p for signed comparison narrowing optimization. Don't check for non-VOIDmode, use HWI_COMPUTABLE_MODE_P macro. <case ZERO_EXTEND>: Don't check for non-VOIDmode. Optimize even when const_op is equal to GET_MODE_MASK (mode), don't optimize if const_op is negative. * gcc.c-torture/execute/pr51023.c: New test. From-SVN: r181257
This commit is contained in:
parent
4da80bfb5d
commit
03989f5595
@ -1,3 +1,14 @@
|
||||
2011-11-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/51023
|
||||
* combine.c (simplify_comparison) <case SIGN_EXTEND>: Don't use
|
||||
val_signbit_known_clear_p for signed comparison narrowing
|
||||
optimization. Don't check for non-VOIDmode, use
|
||||
HWI_COMPUTABLE_MODE_P macro.
|
||||
<case ZERO_EXTEND>: Don't check for non-VOIDmode.
|
||||
Optimize even when const_op is equal to GET_MODE_MASK (mode),
|
||||
don't optimize if const_op is negative.
|
||||
|
||||
2011-11-10 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/51042
|
||||
|
@ -11397,9 +11397,10 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
|
||||
later on, and then we wouldn't know whether to sign- or
|
||||
zero-extend. */
|
||||
mode = GET_MODE (XEXP (op0, 0));
|
||||
if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
|
||||
if (GET_MODE_CLASS (mode) == MODE_INT
|
||||
&& ! unsigned_comparison_p
|
||||
&& val_signbit_known_clear_p (mode, const_op)
|
||||
&& HWI_COMPUTABLE_MODE_P (mode)
|
||||
&& trunc_int_for_mode (const_op, mode) == const_op
|
||||
&& have_insn_for (COMPARE, mode))
|
||||
{
|
||||
op0 = XEXP (op0, 0);
|
||||
@ -11477,10 +11478,11 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
|
||||
|
||||
case ZERO_EXTEND:
|
||||
mode = GET_MODE (XEXP (op0, 0));
|
||||
if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
|
||||
if (GET_MODE_CLASS (mode) == MODE_INT
|
||||
&& (unsigned_comparison_p || equality_comparison_p)
|
||||
&& HWI_COMPUTABLE_MODE_P (mode)
|
||||
&& ((unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode))
|
||||
&& (unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (mode)
|
||||
&& const_op >= 0
|
||||
&& have_insn_for (COMPARE, mode))
|
||||
{
|
||||
op0 = XEXP (op0, 0);
|
||||
|
@ -1,3 +1,8 @@
|
||||
2011-11-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/51023
|
||||
* gcc.c-torture/execute/pr51023.c: New test.
|
||||
|
||||
2011-11-10 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/51042
|
||||
|
18
gcc/testsuite/gcc.c-torture/execute/pr51023.c
Normal file
18
gcc/testsuite/gcc.c-torture/execute/pr51023.c
Normal file
@ -0,0 +1,18 @@
|
||||
/* PR rtl-optimization/51023 */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
short int
|
||||
foo (long int x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
long int a = 0x4272AL;
|
||||
if (foo (a) == a)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user