This is the mail archive of the
`gcc-patches@gcc.gnu.org`
mailing list for the GCC project.

Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|

Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |

Other format: | [Raw text] |

*From*: Teresa Johnson <tejohnson at google dot com>*To*: Jan Hubicka <hubicka at ucw dot cz>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>*Cc*: David Li <davidxl at google dot com>*Date*: Tue, 1 Oct 2013 15:48:09 -0700*Subject*: [PATCH] Improve probability/profile distribution in ORIF expansion*Authentication-results*: sourceware.org; auth=none

This patch fixes an issue where expansion of an ORIF expression arbitrarily applied the probability that the entire condition was true to just the first condition. When the ORIF true probability was 100%, this resulted in the second condition's jump being given a count of zero (since the first condition's jump got 100% of the count), leading to incorrect function splitting when it had a non-zero probability in reality. Since there currently isn't better information about which condition resulted in the ORIF being true, apply a 50-50 probability that it is the first vs. second condition that caused the entire expression to be true, so that neither condition's true label ends up as a 0-count bb. Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for trunk? 2013-10-01 Teresa Johnson <tejohnson@google.com> * dojump.c (do_jump_1): Divide probability between both conditions of a TRUTH_ORIF_EXPR. Index: dojump.c =================================================================== --- dojump.c (revision 203077) +++ dojump.c (working copy) @@ -325,18 +325,27 @@ do_jump_1 (enum tree_code code, tree op0, tree op1 break; case TRUTH_ORIF_EXPR: - if (if_true_label == NULL_RTX) - { - drop_through_label = gen_label_rtx (); - do_jump (op0, NULL_RTX, drop_through_label, prob); - do_jump (op1, if_false_label, NULL_RTX, prob); - } - else - { - do_jump (op0, NULL_RTX, if_true_label, prob); - do_jump (op1, if_false_label, if_true_label, prob); - } - break; + { + /* Spread the probability evenly between the two conditions. So + the first condition has half the total probability of being true. + The second condition has the other half of the total probability, + so its jump has a probability of half the total, relative to + the probability we reached it (i.e. the first condition was false). */ + int op0_prob = prob / 2; + int op1_prob = GCOV_COMPUTE_SCALE ((prob / 2), inv (op0_prob)); + if (if_true_label == NULL_RTX) + { + drop_through_label = gen_label_rtx (); + do_jump (op0, NULL_RTX, drop_through_label, op0_prob); + do_jump (op1, if_false_label, NULL_RTX, op1_prob); + } + else + { + do_jump (op0, NULL_RTX, if_true_label, op0_prob); + do_jump (op1, if_false_label, if_true_label, op1_prob); + } + break; + } default: gcc_unreachable (); -- Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413

**Follow-Ups**:**Re: [PATCH] Improve probability/profile distribution in ORIF expansion***From:*Jan Hubicka

Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|

Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |