On Thu, Oct 6, 2011 at 11:28 AM, Kai Tietz <[email protected]> wrote:
> Hello,
>
> Sorry attached non-updated change. Here with proper attached patch.
> This patch improves in fold_truth_andor the generation of branch-conditions
> for targets having LOGICAL_OP_NON_SHORT_CIRCUIT set. If right-hand side
> operation of a TRUTH_(OR|AND)IF_EXPR is simple operand, has no side-effects,
> and doesn't trap, then try to convert expression to a TRUTH_(AND|OR)_EXPR, if
> left-hand operand is a simple operand, and has no side-effects.
>
> ChangeLog
>
> 2011-10-06 Kai Tietz <[email protected]>
>
> * fold-const.c (fold_truth_andor): Convert TRUTH_(AND|OR)IF_EXPR
> to TRUTH_OR_EXPR, if suitable.
>
> Bootstrapped and tested for all languages (including Ada and Obj-C++) on host
> x86_64-unknown-linux-gnu. Ok for apply?
>
> Regards,
> Kai
>
>
> ndex: fold-const.c
> ===================================================================
> --- fold-const.c (revision 179592)
> +++ fold-const.c (working copy)
> @@ -8387,6 +8387,33 @@
> if ((tem = fold_truthop (loc, code, type, arg0, arg1)) != 0)
> return tem;
>
> + if ((code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
> + && !TREE_SIDE_EFFECTS (arg1)
> + && simple_operand_p (arg1)
> + && LOGICAL_OP_NON_SHORT_CIRCUIT
Why only for LOGICAL_OP_NON_SHORT_CIRCUIT? It doesn't make
a difference for !LOGICAL_OP_NON_SHORT_CIRCUIT targets, but ...
> + && !FLOAT_TYPE_P (TREE_TYPE (arg1))
? I hope we don't have &&|| float.
> + && ((TREE_CODE_CLASS (TREE_CODE (arg1)) != tcc_comparison
> + && TREE_CODE (arg1) != TRUTH_NOT_EXPR)
> + || !FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0)))))
? simple_operand_p would have rejected both ! and comparisons.
I miss a test for side-effects on arg0 (and probably simple_operand_p there,
as well).
> + {
> + if (TREE_CODE (arg0) == code
> + && !TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1))
> + && simple_operand_p (TREE_OPERAND (arg0, 1)))
Err ... so why do you recurse here (and associate)? Even with different
predicates than above ...
And similar transforms seem to happen in fold_truthop - did you
investigate why it didn't trigger there.
And I'm missing a testcase.
Richard.
> + {
> + tem = build2_loc (loc,
> + (code == TRUTH_ANDIF_EXPR ? TRUTH_AND_EXPR
> + : TRUTH_OR_EXPR),
> + type, TREE_OPERAND (arg0, 1), arg1);
> + return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
> + }
> + if (!TREE_SIDE_EFFECTS (arg0)
> + && simple_operand_p (arg0))
> + return build2_loc (loc,
> + (code == TRUTH_ANDIF_EXPR ? TRUTH_AND_EXPR
> + : TRUTH_OR_EXPR),
> + type, arg0, arg1);
> + }
> +
> return NULL_TREE;
> }
>
>