Commit 03989f55 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 4da80bfb
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> 2011-11-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51042 PR tree-optimization/51042
...@@ -11397,9 +11397,10 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1) ...@@ -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 later on, and then we wouldn't know whether to sign- or
zero-extend. */ zero-extend. */
mode = GET_MODE (XEXP (op0, 0)); 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 && ! 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)) && have_insn_for (COMPARE, mode))
{ {
op0 = XEXP (op0, 0); op0 = XEXP (op0, 0);
...@@ -11477,10 +11478,11 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1) ...@@ -11477,10 +11478,11 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
case ZERO_EXTEND: case ZERO_EXTEND:
mode = GET_MODE (XEXP (op0, 0)); 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) && (unsigned_comparison_p || equality_comparison_p)
&& HWI_COMPUTABLE_MODE_P (mode) && 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)) && have_insn_for (COMPARE, mode))
{ {
op0 = XEXP (op0, 0); op0 = XEXP (op0, 0);
......
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> 2011-11-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51042 PR tree-optimization/51042
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment