https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110852

--- Comment #15 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jan Hubicka <hubi...@gcc.gnu.org>:

https://gcc.gnu.org/g:b00be6f1576993369522c16dba992bec9adab9b2

commit r14-8187-gb00be6f1576993369522c16dba992bec9adab9b2
Author: Jan Hubicka <j...@suse.cz>
Date:   Wed Jan 17 15:19:32 2024 +0100

    Fix merging of value predictors

    expr_expected_value is doing some guesswork when it is merging two or more
    independent value predictions either in PHI node or in binary operation.
    Since we do not know how the predictions interact with each other, we can
    not really merge the values precisely.

    The previous logic merged the prediciton and picked the later predictor
    (since predict.def is sorted by reliability). This however leads to
troubles
    with __builtin_expect_with_probability since it is special cased as a
predictor
    with custom probabilities.  If this predictor is downgraded to something
else,
    we ICE since we have prediction given by predictor that is not expected
    to have customprobability.

    This patch fixies it by inventing new predictors
PRED_COMBINED_VALUE_PREDICTIONS
    and PRED_COMBINED_VALUE_PREDICTIONS_PHI which also allows custom values but
    are considered less reliable then __builtin_expect_with_probability (they
    are combined by ds theory rather then by first match).  This is less likely
    going to lead to very stupid decisions if combining does not work as
expected.

    I also updated the code to be bit more careful about merging values and do
not
    downgrade the precision when unnecesary (as tested by new testcases).

    Bootstrapped/regtested x86_64-linux, will commit it tomorrow if there are
    no complains.

    2024-01-17  Jan Hubicka  <j...@suse.cz>
                Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/110852

    gcc/ChangeLog:

            * predict.cc (expr_expected_value_1): Fix profile merging of PHI
and
            binary operations
            (get_predictor_value): Handle PRED_COMBINED_VALUE_PREDICTIONS and
            PRED_COMBINED_VALUE_PREDICTIONS_PHI
            * predict.def (PRED_COMBINED_VALUE_PREDICTIONS): New predictor.
            (PRED_COMBINED_VALUE_PREDICTIONS_PHI): New predictor.

    gcc/testsuite/ChangeLog:

            * gcc.dg/predict-18.c: Update template to expect combined value
predictor.
            * gcc.dg/predict-23.c: New test.
            * gcc.dg/tree-ssa/predict-1.c: New test.
            * gcc.dg/tree-ssa/predict-2.c: New test.
            * gcc.dg/tree-ssa/predict-3.c: New test.

Reply via email to