On Wed, Jan 17, 2024 at 01:45:18PM +0100, Jan Hubicka wrote: > Hi, > 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>
2 spaces before < rather than 1. > > PR tree-optimization/110852 > > gcc/ChangeLog: > > * predict.cc (expr_expected_value_1): > (get_predictor_value): > * predict.def (PRED_COMBINED_VALUE_PREDICTIONS): > (PRED_COMBINED_VALUE_PREDICTIONS_PHI): > > gcc/testsuite/ChangeLog: > > * gcc.dg/predict-18.c: Please fill in what has changed, both for predict-18.c and predict.{cc,def} changes. > @@ -2613,24 +2658,40 @@ expr_expected_value_1 (tree type, tree op0, enum > tree_code code, > if (!nop1) > nop1 = op1; > } > + /* We already checked if folding one of arguments to constant is good > + enough. Consequently failing to fold both means that we will not > + succeed determinging the value. */ s/determinging/determining/ Otherwise LGTM. Jakub