[patch tree-optimization]: Improve handling of conditional-branches on targets with high branch costs
Kai Tietz
ktietz70@googlemail.com
Mon Oct 10 15:15:00 GMT 2011
2011/10/10 Richard Guenther <richard.guenther@gmail.com>:
> On Mon, Oct 10, 2011 at 4:06 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>> 2011/10/10 Richard Guenther <richard.guenther@gmail.com>:
>>> On Mon, Oct 10, 2011 at 2:29 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>>> Recent patch had a thinko on rhs of inner lhs check for TRUTH-IF. It
>>>> has to be checked that the LHS code is same as outer CODE, as
>>>> otherwise we wouldn't apply different TRUTH-IF only on inner RHS of
>>>> LHS, which is of course wrong.
>>>>
>>>> Index: gcc/gcc/fold-const.c
>>>> ===================================================================
>>>> --- gcc.orig/gcc/fold-const.c
>>>> +++ gcc/gcc/fold-const.c
>>>> @@ -111,14 +111,13 @@ static tree decode_field_reference (loca
>>>> tree *, tree *);
>>>> static int all_ones_mask_p (const_tree, int);
>>>> static tree sign_bit_p (tree, const_tree);
>>>> -static int simple_operand_p (const_tree);
>>>> +static int simple_operand_p (tree);
>>>> static tree range_binop (enum tree_code, tree, tree, int, tree, int);
>>>> static tree range_predecessor (tree);
>>>> static tree range_successor (tree);
>>>> static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
>>>> static tree fold_cond_expr_with_comparison (location_t, tree, tree,
>>>> tree, tree);
>>>> static tree unextend (tree, int, int, tree);
>>>> -static tree fold_truthop (location_t, enum tree_code, tree, tree, tree);
>>>> static tree optimize_minmax_comparison (location_t, enum tree_code,
>>>> tree, tree, tree);
>>>> static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
>>>> @@ -3500,7 +3499,7 @@ optimize_bit_field_compare (location_t l
>>>> return lhs;
>>>> }
>>>>
>>>> -/* Subroutine for fold_truthop: decode a field reference.
>>>> +/* Subroutine for fold_truth_andor_1: decode a field reference.
>>>>
>>>> If EXP is a comparison reference, we return the innermost reference.
>>>>
>>>> @@ -3668,17 +3667,43 @@ sign_bit_p (tree exp, const_tree val)
>>>> return NULL_TREE;
>>>> }
>>>>
>>>> -/* Subroutine for fold_truthop: determine if an operand is simple enough
>>>> +/* Subroutine for fold_truth_andor_1: determine if an operand is simple enough
>>>> to be evaluated unconditionally. */
>>>>
>>>> static int
>>>> -simple_operand_p (const_tree exp)
>>>> +simple_operand_p (tree exp)
>>>> {
>>>> + enum tree_code code;
>>>> /* Strip any conversions that don't change the machine mode. */
>>>> STRIP_NOPS (exp);
>>>>
>>>> + code = TREE_CODE (exp);
>>>> +
>>>> + /* Handle some trivials */
>>>> + if (TREE_CODE_CLASS (code) == tcc_comparison)
>>>> + return (tree_could_trap_p (exp)
>>>> + && simple_operand_p (TREE_OPERAND (exp, 0))
>>>> + && simple_operand_p (TREE_OPERAND (exp, 1)));
>>>
>>> And that's still wrong.
>>>
>>> Stopped reading here.
>>>
>>> Richard.
>>
>> Oh, there is a not missing. I didn't spot that, sorry.
>>
>> To the point why we need to handle comparisons within simple_operand_p.
>>
>> If we reject comparisons and logical not here, we won't have any
>> branching optimization anymore, as this the patch moves into
>> fold_truthandor.
>>
>> The result with rejecting in simple_operand_p compares and logic-not
>> provides for the following example:
>
> But you change what simple_operand_p accepts and thus change what
> fold_truthop accepts as operands to its simplifications.
>
> Richard.
Well, not really. I assume you mean fold_truth_andor_1 (aka fold_truthop).
It checks for
...
if (TREE_CODE_CLASS (lcode) != tcc_comparison
|| TREE_CODE_CLASS (rcode) != tcc_comparison)
return 0;
...
before checking for simple_operand_p. So there is actual no change.
It might be of some interest here to add in a different patch support
for logic-not, but well, this is would be material for a different
patch.
So, it won't operate on anything else then comparisons as before.
Kai
More information about the Gcc-patches
mailing list