On Sun, Jun 10, 2012 at 4:16 PM, Marc Glisse <marc.gli...@inria.fr> wrote:
> Hello,
>
> currently, tree-ssa-ifcombine handles pairs of imbricated "if"s that share
> the same then branch, or the same else branch. There is no particular reason
> why it couldn't also handle the case where the then branch of one is the
> else branch of the other, which is what I do here.
>
> Any comments?

The general idea looks good, but I think the patch is too invasive.  As far
as I can see the only callers with a non-zero 'inv' argument come from
ifcombine_ifnotorif and ifcombine_ifnotandif (and both with inv == 2).
I would rather see a more localized patch that makes use of
invert_tree_comparison to perform the inversion on the call arguments
of maybe_fold_and/or_comparisons.

Is there any reason that would not work?

At least

+  if (inv & 1)
+    lcompcode2 = COMPCODE_TRUE - lcompcode2;

looks as if it were not semantically correct - you cannot simply invert
floating-point comparisons (see the restrictions invert_tree_comparison
has).

Thanks,
Richard.

>
> 2012-06-10  Marc Glisse  <marc.gli...@inria.fr>
>
> gcc/
>        PR tree-optimization/51938
>        * fold-const.c (combine_comparisons): Extra argument. Handle inverted
>        conditions.
>        (fold_truth_andor_1): Update call to combine_comparisons.
>        * gimple-fold.c (swap12): New function.
>        (and_comparisons_1): Extra argument. Handle inverted conditions.
>        (and_var_with_comparison_1): Update call to and_comparisons_1.
>        (maybe_fold_and_comparisons): Extra argument. Update call to
>        and_comparisons_1.
>        (or_comparisons_1): Extra argument. Handle inverted conditions.
>        (or_var_with_comparison_1): Update call to or_comparisons_1.
>        (maybe_fold_or_comparisons): Extra argument. Update call to
>        or_comparisons_1.
>        * tree-ssa-ifcombine.c (ifcombine_ifnotandif): New function.
>        (ifcombine_ifnotorif): New function.
>        (tree_ssa_ifcombine_bb): Call them.
>        (ifcombine_iforif): Update call to maybe_fold_or_comparisons.
>        (ifcombine_ifandif): Update call to maybe_fold_and_comparisons.
>        * tree-ssa-reassoc.c (eliminate_redundant_comparison): Update calls
> to
>        maybe_fold_or_comparisons and maybe_fold_and_comparisons.
>        * tree-if-conv.c (fold_or_predicates): Update call to
>        maybe_fold_or_comparisons.
>        * gimple.h (maybe_fold_and_comparisons): Match gimple-fold.c
> prototype.
>        (maybe_fold_or_comparisons): Likewise.
>        * tree.h (combine_comparisons): Match fold-const.c prototype.
>
> gcc/testsuite/
>        PR tree-optimization/51938
>        * gcc.dg/tree-ssa/ssa-ifcombine-8.c: New testcase.
>        * gcc.dg/tree-ssa/ssa-ifcombine-9.c: New testcase.
>
>
>
> --
> Marc Glisse

Reply via email to