1 /* Profile counter container type.
2 Copyright (C) 2017-2018 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #ifndef GCC_PROFILE_COUNT_H
22 #define GCC_PROFILE_COUNT_H
27 /* Quality of the profile count. Because gengtype does not support enums
28 inside of classes, this is in global namespace. */
29 enum profile_quality
{
30 /* Uninitialized value. */
31 profile_uninitialized
,
32 /* Profile is based on static branch prediction heuristics and may
33 or may not match reality. It is local to function and can not be compared
34 inter-procedurally. Never used by probabilities (they are always local).
36 profile_guessed_local
,
37 /* Profile was read by feedback and was 0, we used local heuristics to guess
38 better. This is the case of functions not run in profile fedback.
39 Never used by probabilities. */
40 profile_guessed_global0
,
42 /* Same as profile_guessed_global0 but global count is adjusted 0. */
43 profile_guessed_global0adjusted
,
45 /* Profile is based on static branch prediction heuristics. It may or may
46 not reflect the reality but it can be compared interprocedurally
47 (for example, we inlined function w/o profile feedback into function
48 with feedback and propagated from that).
49 Never used by probablities. */
51 /* Profile was determined by autofdo. */
53 /* Profile was originally based on feedback but it was adjusted
54 by code duplicating optimization. It may not precisely reflect the
55 particular code path. */
57 /* Profile was read from profile feedback or determined by accurate static
62 extern const char *profile_quality_as_string (enum profile_quality
);
64 /* The base value for branch probability notes and edge probabilities. */
65 #define REG_BR_PROB_BASE 10000
67 #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
69 bool slow_safe_scale_64bit (uint64_t a
, uint64_t b
, uint64_t c
, uint64_t *res
);
71 /* Compute RES=(a*b + c/2)/c capping and return false if overflow happened. */
74 safe_scale_64bit (uint64_t a
, uint64_t b
, uint64_t c
, uint64_t *res
)
76 #if (GCC_VERSION >= 5000)
78 if (!__builtin_mul_overflow (a
, b
, &tmp
)
79 && !__builtin_add_overflow (tmp
, c
/2, &tmp
))
90 if (a
< ((uint64_t)1 << 31)
91 && b
< ((uint64_t)1 << 31)
92 && c
< ((uint64_t)1 << 31))
94 *res
= (a
* b
+ (c
/ 2)) / c
;
98 return slow_safe_scale_64bit (a
, b
, c
, res
);
101 /* Data type to hold probabilities. It implements fixed point arithmetics
102 with capping so probability is always in range [0,1] and scaling requiring
103 values greater than 1 needs to be represented otherwise.
105 In addition to actual value the quality of profile is tracked and propagated
106 through all operations. Special value UNINITIALIZED is used for probabilities
107 that has not been determined yet (for example bacause of
108 -fno-guess-branch-probability)
110 Typically probabilities are derived from profile feedback (via
111 probability_in_gcov_type), autoFDO or guessed statically and then propagated
112 thorough the compilation.
114 Named probabilities are available:
115 - never (0 probability)
117 - very_unlikely (1/2000 probability)
118 - unlikely (1/5 probablity)
119 - even (1/2 probability)
120 - likely (4/5 probability)
121 - very_likely (1999/2000 probability)
125 Named probabilities except for never/always are assumed to be statically
126 guessed and thus not necessarily accurate. The difference between never
127 and guessed_never is that the first one should be used only in case that
128 well behaving program will very likely not execute the "never" path.
129 For example if the path is going to abort () call or it exception handling.
131 Always and guessed_always probabilities are symmetric.
133 For legacy code we support conversion to/from REG_BR_PROB_BASE based fixpoint
134 integer arithmetics. Once the code is converted to branch probabilities,
135 these conversions will probably go away because they are lossy.
138 class GTY((user
)) profile_probability
140 static const int n_bits
= 29;
141 /* We can technically use ((uint32_t) 1 << (n_bits - 1)) - 2 but that
142 will lead to harder multiplication sequences. */
143 static const uint32_t max_probability
= (uint32_t) 1 << (n_bits
- 2);
144 static const uint32_t uninitialized_probability
145 = ((uint32_t) 1 << (n_bits
- 1)) - 1;
148 enum profile_quality m_quality
: 3;
150 friend class profile_count
;
153 /* Named probabilities. */
154 static profile_probability
never ()
156 profile_probability ret
;
158 ret
.m_quality
= profile_precise
;
161 static profile_probability
guessed_never ()
163 profile_probability ret
;
165 ret
.m_quality
= profile_guessed
;
168 static profile_probability
very_unlikely ()
170 /* Be consistent with PROB_VERY_UNLIKELY in predict.h. */
171 profile_probability r
172 = profile_probability::guessed_always ().apply_scale (1, 2000);
176 static profile_probability
unlikely ()
178 /* Be consistent with PROB_VERY_LIKELY in predict.h. */
179 profile_probability r
180 = profile_probability::guessed_always ().apply_scale (1, 5);
184 static profile_probability
even ()
186 return profile_probability::guessed_always ().apply_scale (1, 2);
188 static profile_probability
very_likely ()
190 return profile_probability::always () - very_unlikely ();
192 static profile_probability
likely ()
194 return profile_probability::always () - unlikely ();
196 static profile_probability
guessed_always ()
198 profile_probability ret
;
199 ret
.m_val
= max_probability
;
200 ret
.m_quality
= profile_guessed
;
203 static profile_probability
always ()
205 profile_probability ret
;
206 ret
.m_val
= max_probability
;
207 ret
.m_quality
= profile_precise
;
210 /* Probabilities which has not been initialized. Either because
211 initialization did not happen yet or because profile is unknown. */
212 static profile_probability
uninitialized ()
214 profile_probability c
;
215 c
.m_val
= uninitialized_probability
;
216 c
.m_quality
= profile_guessed
;
221 /* Return true if value has been initialized. */
222 bool initialized_p () const
224 return m_val
!= uninitialized_probability
;
226 /* Return true if value can be trusted. */
227 bool reliable_p () const
229 return m_quality
>= profile_adjusted
;
232 /* Conversion from and to REG_BR_PROB_BASE integer fixpoint arithmetics.
233 this is mostly to support legacy code and should go away. */
234 static profile_probability
from_reg_br_prob_base (int v
)
236 profile_probability ret
;
237 gcc_checking_assert (v
>= 0 && v
<= REG_BR_PROB_BASE
);
238 ret
.m_val
= RDIV (v
* (uint64_t) max_probability
, REG_BR_PROB_BASE
);
239 ret
.m_quality
= profile_guessed
;
242 int to_reg_br_prob_base () const
244 gcc_checking_assert (initialized_p ());
245 return RDIV (m_val
* (uint64_t) REG_BR_PROB_BASE
, max_probability
);
248 /* Conversion to and from RTL representation of profile probabilities. */
249 static profile_probability
from_reg_br_prob_note (int v
)
251 profile_probability ret
;
252 ret
.m_val
= ((unsigned int)v
) / 8;
253 ret
.m_quality
= (enum profile_quality
)(v
& 7);
256 int to_reg_br_prob_note () const
258 gcc_checking_assert (initialized_p ());
259 int ret
= m_val
* 8 + m_quality
;
260 gcc_checking_assert (profile_probability::from_reg_br_prob_note (ret
)
265 /* Return VAL1/VAL2. */
266 static profile_probability probability_in_gcov_type
267 (gcov_type val1
, gcov_type val2
)
269 profile_probability ret
;
270 gcc_checking_assert (val1
>= 0 && val2
> 0);
272 ret
.m_val
= max_probability
;
276 safe_scale_64bit (val1
, max_probability
, val2
, &tmp
);
277 gcc_checking_assert (tmp
<= max_probability
);
280 ret
.m_quality
= profile_precise
;
284 /* Basic operations. */
285 bool operator== (const profile_probability
&other
) const
287 return m_val
== other
.m_val
&& m_quality
== other
.m_quality
;
289 profile_probability
operator+ (const profile_probability
&other
) const
291 if (other
== profile_probability::never ())
293 if (*this == profile_probability::never ())
295 if (!initialized_p () || !other
.initialized_p ())
296 return profile_probability::uninitialized ();
298 profile_probability ret
;
299 ret
.m_val
= MIN ((uint32_t)(m_val
+ other
.m_val
), max_probability
);
300 ret
.m_quality
= MIN (m_quality
, other
.m_quality
);
303 profile_probability
&operator+= (const profile_probability
&other
)
305 if (other
== profile_probability::never ())
307 if (*this == profile_probability::never ())
312 if (!initialized_p () || !other
.initialized_p ())
313 return *this = profile_probability::uninitialized ();
316 m_val
= MIN ((uint32_t)(m_val
+ other
.m_val
), max_probability
);
317 m_quality
= MIN (m_quality
, other
.m_quality
);
321 profile_probability
operator- (const profile_probability
&other
) const
323 if (*this == profile_probability::never ()
324 || other
== profile_probability::never ())
326 if (!initialized_p () || !other
.initialized_p ())
327 return profile_probability::uninitialized ();
328 profile_probability ret
;
329 ret
.m_val
= m_val
>= other
.m_val
? m_val
- other
.m_val
: 0;
330 ret
.m_quality
= MIN (m_quality
, other
.m_quality
);
333 profile_probability
&operator-= (const profile_probability
&other
)
335 if (*this == profile_probability::never ()
336 || other
== profile_probability::never ())
338 if (!initialized_p () || !other
.initialized_p ())
339 return *this = profile_probability::uninitialized ();
342 m_val
= m_val
>= other
.m_val
? m_val
- other
.m_val
: 0;
343 m_quality
= MIN (m_quality
, other
.m_quality
);
347 profile_probability
operator* (const profile_probability
&other
) const
349 if (*this == profile_probability::never ()
350 || other
== profile_probability::never ())
351 return profile_probability::never ();
352 if (!initialized_p () || !other
.initialized_p ())
353 return profile_probability::uninitialized ();
354 profile_probability ret
;
355 ret
.m_val
= RDIV ((uint64_t)m_val
* other
.m_val
, max_probability
);
356 ret
.m_quality
= MIN (MIN (m_quality
, other
.m_quality
), profile_adjusted
);
359 profile_probability
&operator*= (const profile_probability
&other
)
361 if (*this == profile_probability::never ()
362 || other
== profile_probability::never ())
363 return *this = profile_probability::never ();
364 if (!initialized_p () || !other
.initialized_p ())
365 return *this = profile_probability::uninitialized ();
368 m_val
= RDIV ((uint64_t)m_val
* other
.m_val
, max_probability
);
369 m_quality
= MIN (MIN (m_quality
, other
.m_quality
), profile_adjusted
);
373 profile_probability
operator/ (const profile_probability
&other
) const
375 if (*this == profile_probability::never ())
376 return profile_probability::never ();
377 if (!initialized_p () || !other
.initialized_p ())
378 return profile_probability::uninitialized ();
379 profile_probability ret
;
380 /* If we get probability above 1, mark it as unreliable and return 1. */
381 if (m_val
>= other
.m_val
)
383 ret
.m_val
= max_probability
;
384 ret
.m_quality
= MIN (MIN (m_quality
, other
.m_quality
),
392 gcc_checking_assert (other
.m_val
);
393 ret
.m_val
= MIN (RDIV ((uint64_t)m_val
* max_probability
,
397 ret
.m_quality
= MIN (MIN (m_quality
, other
.m_quality
), profile_adjusted
);
400 profile_probability
&operator/= (const profile_probability
&other
)
402 if (*this == profile_probability::never ())
403 return *this = profile_probability::never ();
404 if (!initialized_p () || !other
.initialized_p ())
405 return *this = profile_probability::uninitialized ();
408 /* If we get probability above 1, mark it as unreliable
410 if (m_val
> other
.m_val
)
412 m_val
= max_probability
;
413 m_quality
= MIN (MIN (m_quality
, other
.m_quality
),
421 gcc_checking_assert (other
.m_val
);
422 m_val
= MIN (RDIV ((uint64_t)m_val
* max_probability
,
426 m_quality
= MIN (MIN (m_quality
, other
.m_quality
), profile_adjusted
);
431 /* Split *THIS (ORIG) probability into 2 probabilities, such that
432 the returned one (FIRST) is *THIS * CPROB and *THIS is
433 adjusted (SECOND) so that FIRST + FIRST.invert () * SECOND
434 == ORIG. This is useful e.g. when splitting a conditional
437 goto lab; // ORIG probability
440 goto lab; // FIRST = ORIG * CPROB probability
442 goto lab; // SECOND probability
443 such that the overall probability of jumping to lab remains
444 the same. CPROB gives the relative probability between the
446 profile_probability
split (const profile_probability
&cprob
)
448 profile_probability ret
= *this * cprob
;
449 /* The following is equivalent to:
450 *this = cprob.invert () * *this / ret.invert (); */
451 *this = (*this - ret
) / ret
.invert ();
455 gcov_type
apply (gcov_type val
) const
457 if (*this == profile_probability::uninitialized ())
459 return RDIV (val
* m_val
, max_probability
);
462 /* Return 1-*THIS. */
463 profile_probability
invert () const
465 return profile_probability::always() - *this;
468 /* Return THIS with quality dropped to GUESSED. */
469 profile_probability
guessed () const
471 profile_probability ret
= *this;
472 ret
.m_quality
= profile_guessed
;
476 /* Return THIS with quality dropped to AFDO. */
477 profile_probability
afdo () const
479 profile_probability ret
= *this;
480 ret
.m_quality
= profile_afdo
;
484 /* Return *THIS * NUM / DEN. */
485 profile_probability
apply_scale (int64_t num
, int64_t den
) const
487 if (*this == profile_probability::never ())
489 if (!initialized_p ())
490 return profile_probability::uninitialized ();
491 profile_probability ret
;
493 safe_scale_64bit (m_val
, num
, den
, &tmp
);
494 ret
.m_val
= MIN (tmp
, max_probability
);
495 ret
.m_quality
= MIN (m_quality
, profile_adjusted
);
499 /* Return true when the probability of edge is reliable.
501 The profile guessing code is good at predicting branch outcome (ie.
502 taken/not taken), that is predicted right slightly over 75% of time.
503 It is however notoriously poor on predicting the probability itself.
504 In general the profile appear a lot flatter (with probabilities closer
505 to 50%) than the reality so it is bad idea to use it to drive optimization
506 such as those disabling dynamic branch prediction for well predictable
509 There are two exceptions - edges leading to noreturn edges and edges
510 predicted by number of iterations heuristics are predicted well. This macro
511 should be able to distinguish those, but at the moment it simply check for
512 noreturn heuristic that is only one giving probability over 99% or bellow
513 1%. In future we might want to propagate reliability information across the
514 CFG if we find this information useful on multiple places. */
516 bool probably_reliable_p () const
518 if (m_quality
>= profile_adjusted
)
520 if (!initialized_p ())
522 return m_val
< max_probability
/ 100
523 || m_val
> max_probability
- max_probability
/ 100;
526 /* Return false if profile_probability is bogus. */
529 gcc_checking_assert (m_quality
!= profile_uninitialized
);
530 if (m_val
== uninitialized_probability
)
531 return m_quality
== profile_guessed
;
532 else if (m_quality
< profile_guessed
)
534 return m_val
<= max_probability
;
537 /* Comparsions are three-state and conservative. False is returned if
538 the inequality can not be decided. */
539 bool operator< (const profile_probability
&other
) const
541 return initialized_p () && other
.initialized_p () && m_val
< other
.m_val
;
543 bool operator> (const profile_probability
&other
) const
545 return initialized_p () && other
.initialized_p () && m_val
> other
.m_val
;
548 bool operator<= (const profile_probability
&other
) const
550 return initialized_p () && other
.initialized_p () && m_val
<= other
.m_val
;
552 bool operator>= (const profile_probability
&other
) const
554 return initialized_p () && other
.initialized_p () && m_val
>= other
.m_val
;
557 /* Output THIS to F. */
558 void dump (FILE *f
) const;
560 /* Print THIS to stderr. */
563 /* Return true if THIS is known to differ significantly from OTHER. */
564 bool differs_from_p (profile_probability other
) const;
565 /* Return if difference is greater than 50%. */
566 bool differs_lot_from_p (profile_probability other
) const;
567 /* COUNT1 times event happens with *THIS probability, COUNT2 times OTHER
568 happens with COUNT2 probablity. Return probablity that either *THIS or
570 profile_probability
combine_with_count (profile_count count1
,
571 profile_probability other
,
572 profile_count count2
) const;
574 /* LTO streaming support. */
575 static profile_probability
stream_in (struct lto_input_block
*);
576 void stream_out (struct output_block
*);
577 void stream_out (struct lto_output_stream
*);
580 /* Main data type to hold profile counters in GCC. Profile counts originate
581 either from profile feedback, static profile estimation or both. We do not
582 perform whole program profile propagation and thus profile estimation
583 counters are often local to function, while counters from profile feedback
584 (or special cases of profile estimation) can be used inter-procedurally.
586 There are 3 basic types
587 1) local counters which are result of intra-procedural static profile
589 2) ipa counters which are result of profile feedback or special case
590 of static profile estimation (such as in function main).
591 3) counters which counts as 0 inter-procedurally (beause given function
592 was never run in train feedback) but they hold local static profile
595 Counters of type 1 and 3 can not be mixed with counters of different type
596 within operation (because whole function should use one type of counter)
597 with exception that global zero mix in most operations where outcome is
600 To take local counter and use it inter-procedurally use ipa member function
601 which strips information irelevant at the inter-procedural level.
603 Counters are 61bit integers representing number of executions during the
604 train run or normalized frequency within the function.
606 As the profile is maintained during the compilation, many adjustments are
607 made. Not all transformations can be made precisely, most importantly
608 when code is being duplicated. It also may happen that part of CFG has
609 profile counts known while other do not - for example when LTO optimizing
610 partly profiled program or when profile was lost due to COMDAT merging.
612 For this reason profile_count tracks more information than
613 just unsigned integer and it is also ready for profile mismatches.
614 The API of this data type represent operations that are natural
615 on profile counts - sum, difference and operation with scales and
616 probabilities. All operations are safe by never getting negative counts
617 and they do end up in uninitialized scale if any of the parameters is
620 All comparsions that are three state and handling of probabilities. Thus
621 a < b is not equal to !(a >= b).
623 The following pre-defined counts are available:
625 profile_count::zero () for code that is known to execute zero times at
626 runtime (this can be detected statically i.e. for paths leading to
628 profile_count::one () for code that is known to execute once (such as
630 profile_count::uninitialized () for unknown execution count.
636 class GTY(()) profile_count
639 /* Use 62bit to hold basic block counters. Should be at least
640 64bit. Although a counter cannot be negative, we use a signed
641 type to hold various extra stages. */
643 static const int n_bits
= 61;
645 static const uint64_t max_count
= ((uint64_t) 1 << n_bits
) - 2;
646 static const uint64_t uninitialized_count
= ((uint64_t) 1 << n_bits
) - 1;
648 uint64_t m_val
: n_bits
;
649 enum profile_quality m_quality
: 3;
651 /* Return true if both values can meaningfully appear in single function
652 body. We have either all counters in function local or global, otherwise
653 operations between them are not really defined well. */
654 bool compatible_p (const profile_count other
) const
656 if (!initialized_p () || !other
.initialized_p ())
658 if (*this == profile_count::zero ()
659 || other
== profile_count::zero ())
661 return ipa_p () == other
.ipa_p ();
665 /* Used for counters which are expected to be never executed. */
666 static profile_count
zero ()
668 return from_gcov_type (0);
670 static profile_count
adjusted_zero ()
674 c
.m_quality
= profile_adjusted
;
677 static profile_count
guessed_zero ()
681 c
.m_quality
= profile_guessed
;
684 static profile_count
one ()
686 return from_gcov_type (1);
688 /* Value of counters which has not been initialized. Either because
689 initialization did not happen yet or because profile is unknown. */
690 static profile_count
uninitialized ()
693 c
.m_val
= uninitialized_count
;
694 c
.m_quality
= profile_guessed_local
;
698 /* Conversion to gcov_type is lossy. */
699 gcov_type
to_gcov_type () const
701 gcc_checking_assert (initialized_p ());
705 /* Return true if value has been initialized. */
706 bool initialized_p () const
708 return m_val
!= uninitialized_count
;
710 /* Return true if value can be trusted. */
711 bool reliable_p () const
713 return m_quality
>= profile_adjusted
;
715 /* Return true if vlaue can be operated inter-procedurally. */
718 return !initialized_p () || m_quality
>= profile_guessed_global0
;
720 /* Return true if quality of profile is precise. */
721 bool precise_p () const
723 return m_quality
== profile_precise
;
726 /* Get the quality of the count. */
727 enum profile_quality
quality () const { return m_quality
; }
729 /* When merging basic blocks, the two different profile counts are unified.
730 Return true if this can be done without losing info about profile.
731 The only case we care about here is when first BB contains something
732 that makes it terminate in a way not visible in CFG. */
733 bool ok_for_merging (profile_count other
) const
735 if (m_quality
< profile_adjusted
736 || other
.m_quality
< profile_adjusted
)
738 return !(other
< *this);
741 /* When merging two BBs with different counts, pick common count that looks
742 most representative. */
743 profile_count
merge (profile_count other
) const
745 if (*this == other
|| !other
.initialized_p ()
746 || m_quality
> other
.m_quality
)
748 if (other
.m_quality
> m_quality
754 /* Basic operations. */
755 bool operator== (const profile_count
&other
) const
757 return m_val
== other
.m_val
&& m_quality
== other
.m_quality
;
759 profile_count
operator+ (const profile_count
&other
) const
761 if (other
== profile_count::zero ())
763 if (*this == profile_count::zero ())
765 if (!initialized_p () || !other
.initialized_p ())
766 return profile_count::uninitialized ();
769 gcc_checking_assert (compatible_p (other
));
770 ret
.m_val
= m_val
+ other
.m_val
;
771 ret
.m_quality
= MIN (m_quality
, other
.m_quality
);
774 profile_count
&operator+= (const profile_count
&other
)
776 if (other
== profile_count::zero ())
778 if (*this == profile_count::zero ())
783 if (!initialized_p () || !other
.initialized_p ())
784 return *this = profile_count::uninitialized ();
787 gcc_checking_assert (compatible_p (other
));
788 m_val
+= other
.m_val
;
789 m_quality
= MIN (m_quality
, other
.m_quality
);
793 profile_count
operator- (const profile_count
&other
) const
795 if (*this == profile_count::zero () || other
== profile_count::zero ())
797 if (!initialized_p () || !other
.initialized_p ())
798 return profile_count::uninitialized ();
799 gcc_checking_assert (compatible_p (other
));
801 ret
.m_val
= m_val
>= other
.m_val
? m_val
- other
.m_val
: 0;
802 ret
.m_quality
= MIN (m_quality
, other
.m_quality
);
805 profile_count
&operator-= (const profile_count
&other
)
807 if (*this == profile_count::zero () || other
== profile_count::zero ())
809 if (!initialized_p () || !other
.initialized_p ())
810 return *this = profile_count::uninitialized ();
813 gcc_checking_assert (compatible_p (other
));
814 m_val
= m_val
>= other
.m_val
? m_val
- other
.m_val
: 0;
815 m_quality
= MIN (m_quality
, other
.m_quality
);
820 /* Return false if profile_count is bogus. */
823 gcc_checking_assert (m_quality
!= profile_uninitialized
);
824 return m_val
!= uninitialized_count
|| m_quality
== profile_guessed_local
;
827 /* Comparsions are three-state and conservative. False is returned if
828 the inequality can not be decided. */
829 bool operator< (const profile_count
&other
) const
831 if (!initialized_p () || !other
.initialized_p ())
833 if (*this == profile_count::zero ())
834 return !(other
== profile_count::zero ());
835 if (other
== profile_count::zero ())
837 gcc_checking_assert (compatible_p (other
));
838 return m_val
< other
.m_val
;
840 bool operator> (const profile_count
&other
) const
842 if (!initialized_p () || !other
.initialized_p ())
844 if (*this == profile_count::zero ())
846 if (other
== profile_count::zero ())
847 return !(*this == profile_count::zero ());
848 gcc_checking_assert (compatible_p (other
));
849 return initialized_p () && other
.initialized_p () && m_val
> other
.m_val
;
851 bool operator< (const gcov_type other
) const
853 gcc_checking_assert (ipa_p ());
854 gcc_checking_assert (other
>= 0);
855 return initialized_p () && m_val
< (uint64_t) other
;
857 bool operator> (const gcov_type other
) const
859 gcc_checking_assert (ipa_p ());
860 gcc_checking_assert (other
>= 0);
861 return initialized_p () && m_val
> (uint64_t) other
;
864 bool operator<= (const profile_count
&other
) const
866 if (!initialized_p () || !other
.initialized_p ())
868 if (*this == profile_count::zero ())
870 if (other
== profile_count::zero ())
871 return (*this == profile_count::zero ());
872 gcc_checking_assert (compatible_p (other
));
873 return m_val
<= other
.m_val
;
875 bool operator>= (const profile_count
&other
) const
877 if (!initialized_p () || !other
.initialized_p ())
879 if (other
== profile_count::zero ())
881 if (*this == profile_count::zero ())
882 return !(other
== profile_count::zero ());
883 gcc_checking_assert (compatible_p (other
));
884 return m_val
>= other
.m_val
;
886 bool operator<= (const gcov_type other
) const
888 gcc_checking_assert (ipa_p ());
889 gcc_checking_assert (other
>= 0);
890 return initialized_p () && m_val
<= (uint64_t) other
;
892 bool operator>= (const gcov_type other
) const
894 gcc_checking_assert (ipa_p ());
895 gcc_checking_assert (other
>= 0);
896 return initialized_p () && m_val
>= (uint64_t) other
;
898 /* Return true when value is not zero and can be used for scaling.
899 This is different from *this > 0 because that requires counter to
901 bool nonzero_p () const
903 return initialized_p () && m_val
!= 0;
906 /* Make counter forcingly nonzero. */
907 profile_count
force_nonzero () const
909 if (!initialized_p ())
911 profile_count ret
= *this;
915 ret
.m_quality
= MIN (m_quality
, profile_adjusted
);
920 profile_count
max (profile_count other
) const
922 if (!initialized_p ())
924 if (!other
.initialized_p ())
926 if (*this == profile_count::zero ())
928 if (other
== profile_count::zero ())
930 gcc_checking_assert (compatible_p (other
));
931 if (m_val
< other
.m_val
|| (m_val
== other
.m_val
932 && m_quality
< other
.m_quality
))
937 /* PROB is a probability in scale 0...REG_BR_PROB_BASE. Scale counter
939 profile_count
apply_probability (int prob
) const
941 gcc_checking_assert (prob
>= 0 && prob
<= REG_BR_PROB_BASE
);
944 if (!initialized_p ())
945 return profile_count::uninitialized ();
947 ret
.m_val
= RDIV (m_val
* prob
, REG_BR_PROB_BASE
);
948 ret
.m_quality
= MIN (m_quality
, profile_adjusted
);
952 /* Scale counter according to PROB. */
953 profile_count
apply_probability (profile_probability prob
) const
955 if (*this == profile_count::zero ())
957 if (prob
== profile_probability::never ())
958 return profile_count::zero ();
959 if (!initialized_p ())
960 return profile_count::uninitialized ();
963 safe_scale_64bit (m_val
, prob
.m_val
, profile_probability::max_probability
,
966 ret
.m_quality
= MIN (m_quality
, prob
.m_quality
);
969 /* Return *THIS * NUM / DEN. */
970 profile_count
apply_scale (int64_t num
, int64_t den
) const
974 if (!initialized_p ())
975 return profile_count::uninitialized ();
979 gcc_checking_assert (num
>= 0 && den
> 0);
980 safe_scale_64bit (m_val
, num
, den
, &tmp
);
981 ret
.m_val
= MIN (tmp
, max_count
);
982 ret
.m_quality
= MIN (m_quality
, profile_adjusted
);
985 profile_count
apply_scale (profile_count num
, profile_count den
) const
987 if (*this == profile_count::zero ())
989 if (num
== profile_count::zero ())
991 if (!initialized_p () || !num
.initialized_p () || !den
.initialized_p ())
992 return profile_count::uninitialized ();
995 gcc_checking_assert (den
.m_val
);
999 safe_scale_64bit (m_val
, num
.m_val
, den
.m_val
, &val
);
1000 ret
.m_val
= MIN (val
, max_count
);
1001 ret
.m_quality
= MIN (MIN (MIN (m_quality
, profile_adjusted
),
1002 num
.m_quality
), den
.m_quality
);
1003 if (num
.ipa_p () && !ret
.ipa_p ())
1004 ret
.m_quality
= MIN (num
.m_quality
, profile_guessed
);
1008 /* Return THIS with quality dropped to GUESSED_LOCAL. */
1009 profile_count
guessed_local () const
1011 profile_count ret
= *this;
1012 if (!initialized_p ())
1014 ret
.m_quality
= profile_guessed_local
;
1018 /* We know that profile is globally 0 but keep local profile if present. */
1019 profile_count
global0 () const
1021 profile_count ret
= *this;
1022 if (!initialized_p ())
1024 ret
.m_quality
= profile_guessed_global0
;
1028 /* We know that profile is globally adjusted 0 but keep local profile
1030 profile_count
global0adjusted () const
1032 profile_count ret
= *this;
1033 if (!initialized_p ())
1035 ret
.m_quality
= profile_guessed_global0adjusted
;
1039 /* Return THIS with quality dropped to GUESSED. */
1040 profile_count
guessed () const
1042 profile_count ret
= *this;
1043 ret
.m_quality
= MIN (ret
.m_quality
, profile_guessed
);
1047 /* Return variant of profile counte which is always safe to compare
1048 acorss functions. */
1049 profile_count
ipa () const
1051 if (m_quality
> profile_guessed_global0adjusted
)
1053 if (m_quality
== profile_guessed_global0
)
1054 return profile_count::zero ();
1055 if (m_quality
== profile_guessed_global0adjusted
)
1056 return profile_count::adjusted_zero ();
1057 return profile_count::uninitialized ();
1060 /* Return THIS with quality dropped to AFDO. */
1061 profile_count
afdo () const
1063 profile_count ret
= *this;
1064 ret
.m_quality
= profile_afdo
;
1068 /* Return probability of event with counter THIS within event with counter
1070 profile_probability
probability_in (const profile_count overall
) const
1072 if (*this == profile_count::zero ()
1073 && !(overall
== profile_count::zero ()))
1074 return profile_probability::never ();
1075 if (!initialized_p () || !overall
.initialized_p ()
1077 return profile_probability::uninitialized ();
1078 if (*this == overall
&& m_quality
== profile_precise
)
1079 return profile_probability::always ();
1080 profile_probability ret
;
1081 gcc_checking_assert (compatible_p (overall
));
1083 if (overall
.m_val
< m_val
)
1085 ret
.m_val
= profile_probability::max_probability
;
1086 ret
.m_quality
= profile_guessed
;
1090 ret
.m_val
= RDIV (m_val
* profile_probability::max_probability
,
1092 ret
.m_quality
= MIN (MAX (MIN (m_quality
, overall
.m_quality
),
1093 profile_guessed
), profile_adjusted
);
1097 int to_frequency (struct function
*fun
) const;
1098 int to_cgraph_frequency (profile_count entry_bb_count
) const;
1099 sreal
to_sreal_scale (profile_count in
, bool *known
= NULL
) const;
1101 /* Output THIS to F. */
1102 void dump (FILE *f
) const;
1104 /* Print THIS to stderr. */
1105 void debug () const;
1107 /* Return true if THIS is known to differ significantly from OTHER. */
1108 bool differs_from_p (profile_count other
) const;
1110 /* We want to scale profile across function boundary from NUM to DEN.
1111 Take care of the side case when NUM and DEN are zeros of incompatible
1113 static void adjust_for_ipa_scaling (profile_count
*num
, profile_count
*den
);
1115 /* THIS is a count of bb which is known to be executed IPA times.
1116 Combine this information into bb counter. This means returning IPA
1117 if it is nonzero, not changing anything if IPA is uninitialized
1118 and if IPA is zero, turning THIS into corresponding local profile with
1120 profile_count
combine_with_ipa_count (profile_count ipa
);
1122 /* The profiling runtime uses gcov_type, which is usually 64bit integer.
1123 Conversions back and forth are used to read the coverage and get it
1124 into internal representation. */
1125 static profile_count
from_gcov_type (gcov_type v
);
1127 /* LTO streaming support. */
1128 static profile_count
stream_in (struct lto_input_block
*);
1129 void stream_out (struct output_block
*);
1130 void stream_out (struct lto_output_stream
*);