[PATCH] phiopt: Improve conditional_replacement for x ? 0 : -1 [PR796232]

Richard Biener rguenther@suse.de
Sat Dec 5 10:20:11 GMT 2020


On December 5, 2020 10:10:25 AM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>As mentioned in the PR, for boolean x we currently optimize
>in phiopt x ? 0 : -1 into -(int)!x but it can be optimized as
>(int) x - 1 which is one less operation both in GIMPLE and in x86
>assembly.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
>And/or, shall we have a match.pd optimization to turn that -(type)!x
>for BOOLEAN_TYPE (or other 1 bit unsigned precision values) into
>(type) - 1.

I think that would make sense. Does that then cover the phiopt case directly? 

>2020-12-05  Jakub Jelinek  <jakub@redhat.com>
>
>	PR tree-optimization/96232
>	* tree-ssa-phiopt.c (conditional_replacement): Optimize
>	x ? 0 : -1 as (int) x - 1 rather than -(int)!x.
>
>	* gcc.dg/tree-ssa/pr96232-1.c: New test.
>
>--- gcc/tree-ssa-phiopt.c.jj	2020-11-04 11:58:58.670252748 +0100
>+++ gcc/tree-ssa-phiopt.c	2020-12-04 17:27:53.472837921 +0100
>@@ -827,10 +827,24 @@ conditional_replacement (basic_block con
> 
>   if (neg)
>     {
>-      cond = fold_convert_loc (gimple_location (stmt),
>-                               TREE_TYPE (result), cond);
>-      cond = fold_build1_loc (gimple_location (stmt),
>-                              NEGATE_EXPR, TREE_TYPE (cond), cond);
>+      if (TREE_CODE (cond) == TRUTH_NOT_EXPR
>+	  && INTEGRAL_TYPE_P (TREE_TYPE (nonzero_arg)))
>+	{
>+	  /* x ? 0 : -1 is better optimized as (int) x - 1 than
>+	     -(int)!x.  */
>+	  cond = fold_convert_loc (gimple_location (stmt),
>+				   TREE_TYPE (result),
>+				   TREE_OPERAND (cond, 0));
>+	  cond = fold_build2_loc (gimple_location (stmt), PLUS_EXPR,
>+				  TREE_TYPE (result), cond, nonzero_arg);
>+	}
>+      else
>+	{
>+	  cond = fold_convert_loc (gimple_location (stmt),
>+				   TREE_TYPE (result), cond);
>+	  cond = fold_build1_loc (gimple_location (stmt),
>+				  NEGATE_EXPR, TREE_TYPE (cond), cond);
>+	}
>     }
>   else if (shift)
>     {
>--- gcc/testsuite/gcc.dg/tree-ssa/pr96232-1.c.jj	2020-12-04
>17:32:40.607615276 +0100
>+++ gcc/testsuite/gcc.dg/tree-ssa/pr96232-1.c	2020-12-04
>17:33:09.914286354 +0100
>@@ -0,0 +1,11 @@
>+/* PR tree-optimization/96232 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2 -fdump-tree-optimized" } */
>+/* { dg-final { scan-tree-dump " \\+ -1;" "optimized" } } */
>+/* { dg-final { scan-tree-dump-not "~x_\[0-9]*\\\(D\\\)" "optimized" }
>} */
>+
>+int
>+foo (_Bool x)
>+{
>+  return x ? 0 : -1;
>+}
>
>	Jakub



More information about the Gcc-patches mailing list