Commit 9dd920ab by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/68376 (wrong code at -O1 and above on x86_64-linux-gnu)

	PR rtl-optimization/68376
	PR rtl-optimization/68670
	* ifcvt.c (noce_try_abs): For one_cmpl allow < 0, >= 0
	or > -1 conditions regardless of negate, and disallow
	all other conditions.

	* gcc.c-torture/execute/pr68376-2.c (f5, f6, f7, f8): New
	tests.
	(main): Call them.
	* gcc.dg/pr68670-1.c: New test.
	* gcc.dg/pr68670-2.c: New test.

From-SVN: r231526
parent 64a948e9
2015-12-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/68376
PR rtl-optimization/68670
* ifcvt.c (noce_try_abs): For one_cmpl allow < 0, >= 0
or > -1 conditions regardless of negate, and disallow
all other conditions.
2015-12-10 Ilya Enkovich <enkovich.gnu@gmail.com> 2015-12-10 Ilya Enkovich <enkovich.gnu@gmail.com>
* tree-chkp.c (chkp_call_returns_bounds_p): Return true * tree-chkp.c (chkp_call_returns_bounds_p): Return true
...@@ -2601,45 +2601,22 @@ noce_try_abs (struct noce_if_info *if_info) ...@@ -2601,45 +2601,22 @@ noce_try_abs (struct noce_if_info *if_info)
Note that these rtx constants are known to be CONST_INT, and Note that these rtx constants are known to be CONST_INT, and
therefore imply integer comparisons. therefore imply integer comparisons.
The one_cmpl case is more complicated, as we want to handle The one_cmpl case is more complicated, as we want to handle
only x < 0 ? ~x : x or x >= 0 ? ~x : x but not only x < 0 ? ~x : x or x >= 0 ? x : ~x to one_cmpl_abs (x)
x <= 0 ? ~x : x or x > 0 ? ~x : x, as the latter two and x < 0 ? x : ~x or x >= 0 ? ~x : x to ~one_cmpl_abs (x),
have different result for x == 0. */ but not other cases (x > -1 is equivalent of x >= 0). */
if (c == constm1_rtx && GET_CODE (cond) == GT) if (c == constm1_rtx && GET_CODE (cond) == GT)
{ ;
if (one_cmpl && negate)
return FALSE;
}
else if (c == const1_rtx && GET_CODE (cond) == LT) else if (c == const1_rtx && GET_CODE (cond) == LT)
{ {
if (one_cmpl && !negate) if (one_cmpl)
return FALSE; return FALSE;
} }
else if (c == CONST0_RTX (GET_MODE (b))) else if (c == CONST0_RTX (GET_MODE (b)))
{ {
if (one_cmpl) if (one_cmpl
switch (GET_CODE (cond)) && GET_CODE (cond) != GE
{ && GET_CODE (cond) != LT)
case GT: return FALSE;
if (!negate)
return FALSE;
break;
case GE:
/* >= 0 is the same case as above > -1. */
if (negate)
return FALSE;
break;
case LT:
if (negate)
return FALSE;
break;
case LE:
/* <= 0 is the same case as above < 1. */
if (!negate)
return FALSE;
break;
default:
return FALSE;
}
} }
else else
return FALSE; return FALSE;
......
2015-12-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/68376
PR rtl-optimization/68670
* gcc.c-torture/execute/pr68376-2.c (f5, f6, f7, f8): New
tests.
(main): Call them.
* gcc.dg/pr68670-1.c: New test.
* gcc.dg/pr68670-2.c: New test.
2015-12-10 Marek Polacek <polacek@redhat.com> 2015-12-10 Marek Polacek <polacek@redhat.com>
PR c++/68348 PR c++/68348
......
...@@ -26,6 +26,30 @@ f4 (int x) ...@@ -26,6 +26,30 @@ f4 (int x)
return x <= 0 ? x : ~x; return x <= 0 ? x : ~x;
} }
__attribute__((noinline, noclone)) int
f5 (int x)
{
return x >= 0 ? ~x : x;
}
__attribute__((noinline, noclone)) int
f6 (int x)
{
return x >= 0 ? x : ~x;
}
__attribute__((noinline, noclone)) int
f7 (int x)
{
return x > 0 ? ~x : x;
}
__attribute__((noinline, noclone)) int
f8 (int x)
{
return x > 0 ? x : ~x;
}
int int
main () main ()
{ {
...@@ -37,5 +61,13 @@ main () ...@@ -37,5 +61,13 @@ main ()
abort (); abort ();
if (f4 (5) != -6 || f4 (-5) != -5 || f4 (0) != 0) if (f4 (5) != -6 || f4 (-5) != -5 || f4 (0) != 0)
abort (); abort ();
if (f5 (5) != -6 || f5 (-5) != -5 || f5 (0) != -1)
abort ();
if (f6 (5) != 5 || f6 (-5) != 4 || f6 (0) != 0)
abort ();
if (f7 (5) != -6 || f7 (-5) != -5 || f7 (0) != 0)
abort ();
if (f8 (5) != 5 || f8 (-5) != 4 || f8 (0) != -1)
abort ();
return 0; return 0;
} }
/* PR rtl-optimization/68670 */
/* { dg-do run } */
/* { dg-options "-O2 -ftracer" } */
#include "../gcc.c-torture/execute/pr68376-1.c"
/* PR rtl-optimization/68670 */
/* { dg-do run } */
/* { dg-options "-O2 -ftracer" } */
#include "../gcc.c-torture/execute/pr68376-2.c"
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