+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>
* tree-chkp.c (chkp_call_returns_bounds_p): Return true
Note that these rtx constants are known to be CONST_INT, and
therefore imply integer comparisons.
The one_cmpl case is more complicated, as we want to handle
- only x < 0 ? ~x : x or x >= 0 ? ~x : x but not
- x <= 0 ? ~x : x or x > 0 ? ~x : x, as the latter two
- have different result for x == 0. */
+ only x < 0 ? ~x : x or x >= 0 ? x : ~x to one_cmpl_abs (x)
+ and x < 0 ? x : ~x or x >= 0 ? ~x : x to ~one_cmpl_abs (x),
+ but not other cases (x > -1 is equivalent of x >= 0). */
if (c == constm1_rtx && GET_CODE (cond) == GT)
- {
- if (one_cmpl && negate)
- return FALSE;
- }
+ ;
else if (c == const1_rtx && GET_CODE (cond) == LT)
{
- if (one_cmpl && !negate)
+ if (one_cmpl)
return FALSE;
}
else if (c == CONST0_RTX (GET_MODE (b)))
{
- if (one_cmpl)
- switch (GET_CODE (cond))
- {
- case GT:
- 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;
- }
+ if (one_cmpl
+ && GET_CODE (cond) != GE
+ && GET_CODE (cond) != LT)
+ return FALSE;
}
else
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>
PR c++/68348
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
main ()
{
abort ();
if (f4 (5) != -6 || f4 (-5) != -5 || f4 (0) != 0)
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;
}
--- /dev/null
+/* PR rtl-optimization/68670 */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftracer" } */
+
+#include "../gcc.c-torture/execute/pr68376-1.c"
--- /dev/null
+/* PR rtl-optimization/68670 */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftracer" } */
+
+#include "../gcc.c-torture/execute/pr68376-2.c"