On Sat, Dec 05, 2020 at 11:20:11AM +0100, Richard Biener wrote: > >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?
That would be the following then. Seems it works for that case. Ok for trunk if it passes bootstrap/regtest? 2020-12-05 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/96232 * match.pd (-(type)!A -> (type)A - 1): New optimization. * gcc.dg/tree-ssa/pr96232-1.c: New test. --- gcc/match.pd.jj 2020-12-02 11:20:24.765486816 +0100 +++ gcc/match.pd 2020-12-05 11:46:00.554518927 +0100 @@ -3812,6 +3812,16 @@ (define_operator_list COND_TERNARY (cnd (logical_inverted_value truth_valued_p@0) @1 @2) (cnd @0 @2 @1))) +/* -(type)!A -> (type)A - 1. */ +(simplify + (negate (convert?:s (logical_inverted_value:s @0))) + (if (INTEGRAL_TYPE_P (type) + && TREE_CODE (type) != BOOLEAN_TYPE + && TYPE_PRECISION (type) > 1 + && TREE_CODE (@0) == SSA_NAME + && ssa_name_has_boolean_range (@0)) + (plus (convert:type @0) { build_all_ones_cst (type); }))) + /* A + (B vcmp C ? 1 : 0) -> A - (B vcmp C ? -1 : 0), since vector comparisons return all -1 or all 0 results. */ /* ??? We could instead convert all instances of the vec_cond to negate, --- gcc/testsuite/gcc.dg/tree-ssa/pr96232-1.c.jj 2020-12-05 11:37:27.804332875 +0100 +++ gcc/testsuite/gcc.dg/tree-ssa/pr96232-1.c 2020-12-05 11:37:27.804332875 +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