On 11/13/18 8:42 PM, Jason Merrill wrote: > On Tue, Nov 13, 2018 at 9:20 AM Martin Liška <mli...@suse.cz> wrote: >> >> On 11/13/18 5:43 AM, Jason Merrill wrote: >>> [[likely]] and [[unlikely]] are equivalent to the GNU hot/cold attributes, >>> except that they can be applied to arbitrary statements as well as labels; >>> this is most likely to be useful for marking if/else branches as likely or >>> unlikely. Conveniently, PREDICT_EXPR fits the bill nicely as a >>> representation. >>> >>> I also had to fix marking case labels as hot/cold, which didn't work before. >>> Which then required me to force __attribute ((fallthrough)) to apply to the >>> statement rather than the label. >>> >>> Tested x86_64-pc-linux-gnu. Does this seem like a sane implementation >>> approach to people with more experience with PREDICT_EXPR? >> >> Hi. >> >> In general it makes sense to implement it the same way. Question is how much >> should the hold/cold attribute should be close to __builtin_expect. >> >> Let me present few examples and differences that I see: >> >> 1) ./xgcc -B. -O2 -fdump-tree-profile_estimate=/dev/stdout /tmp/test1.C >> >> ;; Function foo (_Z3foov, funcdef_no=0, decl_uid=2301, cgraph_uid=1, >> symbol_order=3) >> >> Predictions for bb 2 >> first match heuristics: 90.00% >> combined heuristics: 90.00% >> __builtin_expect heuristics of edge 2->3: 90.00% >> >> As seen here __builtin_expect is stronger as it's first match heuristics and >> has probability == 90%. >> >> ;; Function bar (_Z3barv, funcdef_no=1, decl_uid=2303, cgraph_uid=2, >> symbol_order=4) >> >> Predictions for bb 2 >> DS theory heuristics: 74.48% >> combined heuristics: 74.48% >> opcode values nonequal (on trees) heuristics of edge 2->3: 34.00% >> hot label heuristics of edge 2->3: 85.00% >> >> Here we combine hot label prediction with the opcode one, resulting in quite >> poor result 75%. >> So maybe cold/hot prediction cal also happen first match. > > Makes sense.
Good, let me prepare patch for it. > >> 2) ./xgcc -B. -O2 -fdump-tree-profile_estimate=/dev/stdout /tmp/test2.C >> ... >> foo () >> { >> ... >> switch (_3) <default: <L3> [3.33%], case 3: <L0> [3.33%], case 42: <L1> >> [3.33%], case 333: <L2> [90.00%]> >> >> while: >> >> bar () >> { >> switch (a.1_1) <default: <L3> [25.00%], case 3: <L0> [25.00%], case 42: >> <L1> [25.00%], case 333: <L2> [25.00%]> >> ... >> >> Note that support for __builtin_expect was enhanced in this stage1. I can >> definitely cover also situations when one uses >> hot/cold for labels. So definitely place for improvement. > > Hmm, the gimplifier should be adding a PREDICT_EXPR for the case label > now, is it just ignored currently? Yes, for switch multi-branches yes. I'll prepare patch for it, should be quite straightforward. > >> 3) last example where one can use the attribute for function decl, resulting >> in: >> __attribute__((hot, noinline)) >> foo () >> { >> .. >> >> Hope it's desired? If so I would cover that with a test-case in test-suite. > > [[likely]] and [[unlikely]] don't apply to functions; I suppose I > should diagnose that. Yes. > >> Jason can you please point to C++ specification of the attributes? > > http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0479r5.html > >> Would you please consider an error diagnostics for situations written in >> test4.C? > > A warning seems appropriate. You think the front end is the right > place for that? Probably yes. Note that middle-end can optimize about dead branches and so that theoretically one can end up with a branching where e.g. both branches are [[likely]]. I wouldn't bother users with these. Martin > > Jason >