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:
Jakub Jelinek 2011-11-10 16:36:48 +01:00 committed by Jakub Jelinek
parent 4da80bfb5d
commit 03989f5595
4 changed files with 40 additions and 4 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View 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;
}