GCC Middle and Back End API Reference
profile-count.h
Go to the documentation of this file.
1/* Profile counter container type.
2 Copyright (C) 2017-2026 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef GCC_PROFILE_COUNT_H
22#define GCC_PROFILE_COUNT_H
23
24struct function;
25struct profile_count;
26class sreal;
27
28/* Quality of the profile count. Because gengtype does not support enums
29 inside of classes, this is in global namespace. */
31 /* Uninitialized value. */
33
34 /* Profile is based on static branch prediction heuristics and may
35 or may not match reality. It is local to function and cannot be compared
36 inter-procedurally. Never used by probabilities (they are always local).
37 */
39
40 /* Same as GUESSED_GLOBAL0 but global count is afdo 0. */
42
43 /* Same as GUESSED_GLOBAL0 but global count is adjusted 0. */
45
46 /* Profile was read by feedback and was 0, we used local heuristics to guess
47 better. This is the case of functions not run in profile feedback.
48 Never used by probabilities. */
50
51 /* Profile is based on static branch prediction heuristics. It may or may
52 not reflect the reality but it can be compared interprocedurally
53 (for example, we inlined function w/o profile feedback into function
54 with feedback and propagated from that). */
56
57 /* Profile was determined by autofdo. */
59
60 /* Profile was originally based on feedback but it was adjusted
61 by code duplicating optimization. It may not precisely reflect the
62 particular code path. */
64
65 /* Profile was read from profile feedback or determined by accurate static
66 method. */
68};
69
70extern const char *profile_quality_as_string (enum profile_quality);
71extern bool parse_profile_quality (const char *value,
72 profile_quality *quality);
73
74/* The base value for branch probability notes and edge probabilities. */
75#define REG_BR_PROB_BASE 10000
76
77#define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
78
79bool slow_safe_scale_64bit (uint64_t a, uint64_t b, uint64_t c, uint64_t *res);
80
81/* Compute RES=(a*b + c/2)/c capping and return false if overflow happened. */
82
83inline bool
84safe_scale_64bit (uint64_t a, uint64_t b, uint64_t c, uint64_t *res)
85{
86#if (GCC_VERSION >= 5000)
87 uint64_t tmp;
88 if (!__builtin_mul_overflow (a, b, &tmp)
89 && !__builtin_add_overflow (tmp, c/2, &tmp))
90 {
91 *res = tmp / c;
92 return true;
93 }
94 if (c == 1)
95 {
96 *res = (uint64_t) -1;
97 return false;
98 }
99#else
100 if (a < ((uint64_t)1 << 31)
101 && b < ((uint64_t)1 << 31)
102 && c < ((uint64_t)1 << 31))
103 {
104 *res = (a * b + (c / 2)) / c;
105 return true;
106 }
107#endif
108 return slow_safe_scale_64bit (a, b, c, res);
109}
110
111/* Data type to hold probabilities. It implements fixed point arithmetics
112 with capping so probability is always in range [0,1] and scaling requiring
113 values greater than 1 needs to be represented otherwise.
114
115 In addition to actual value the quality of profile is tracked and propagated
116 through all operations. Special value UNINITIALIZED_PROFILE is used for probabilities
117 that has not been determined yet (for example because of
118 -fno-guess-branch-probability)
119
120 Typically probabilities are derived from profile feedback (via
121 probability_in_gcov_type), autoFDO or guessed statically and then propagated
122 thorough the compilation.
123
124 Named probabilities are available:
125 - never (0 probability)
126 - guessed_never
127 - very_unlikely (1/2000 probability)
128 - unlikely (1/5 probability)
129 - even (1/2 probability)
130 - likely (4/5 probability)
131 - very_likely (1999/2000 probability)
132 - guessed_always
133 - always
134
135 Named probabilities except for never/always are assumed to be statically
136 guessed and thus not necessarily accurate. The difference between never
137 and guessed_never is that the first one should be used only in case that
138 well behaving program will very likely not execute the "never" path.
139 For example if the path is going to abort () call or it exception handling.
140
141 Always and guessed_always probabilities are symmetric.
142
143 For legacy code we support conversion to/from REG_BR_PROB_BASE based fixpoint
144 integer arithmetics. Once the code is converted to branch probabilities,
145 these conversions will probably go away because they are lossy.
146*/
147
149{
150 static const int n_bits = 29;
151 /* We can technically use ((uint32_t) 1 << (n_bits - 1)) - 2 but that
152 will lead to harder multiplication sequences. */
153 static const uint32_t max_probability = (uint32_t) 1 << (n_bits - 2);
154 static const uint32_t uninitialized_probability
155 = ((uint32_t) 1 << (n_bits - 1)) - 1;
156 /* For probibilityes quality is either UNINITIALIZED (0)
157 or greater then GUESSED. To save bits we store it in
158 adjusted form which skips the invalid values. */
159 static const int min_quality = GUESSED;
160
161 uint32_t m_val : 29;
162 unsigned m_adjusted_quality : 3;
163
164 friend struct profile_count;
165
166 /* Set the quality of the probability. */
167 void
174
175public:
178
182
183 /* Named probabilities. */
185 {
187 ret.m_val = 0;
188 ret.set_quality (PRECISE);
189 return ret;
190 }
191
193 {
195 ret.m_val = 0;
196 ret.set_quality (GUESSED);
197 return ret;
198 }
199
201 {
202 /* Be consistent with PROB_VERY_UNLIKELY in predict.h. */
204 r.m_val--;
205 return r;
206 }
207
209 {
210 /* Be consistent with PROB_VERY_LIKELY in predict.h. */
212 r.m_val--;
213 return r;
214 }
215
217 {
218 return guessed_always () / 2;
219 }
220
222 {
223 return always () - very_unlikely ();
224 }
225
227 {
228 return always () - unlikely ();
229 }
230 /* Return true when value is not zero and can be used for scaling. */
231 bool nonzero_p () const
232 {
233 return initialized_p () && m_val != 0;
234 }
235
237 {
240 ret.set_quality (GUESSED);
241 return ret;
242 }
243
245 {
248 ret.set_quality (PRECISE);
249 return ret;
250 }
251
252 /* Probabilities which has not been initialized. Either because
253 initialization did not happen yet or because profile is unknown. */
255 {
258 c.set_quality (GUESSED);
259 return c;
260 }
261
262 /* Return true if value has been initialized. */
263 bool initialized_p () const
264 {
266 }
267
268 /* Return true if value can be trusted. */
269 bool reliable_p () const
270 {
271 return quality () >= ADJUSTED;
272 }
273
274 /* Conversion from and to REG_BR_PROB_BASE integer fixpoint arithmetics.
275 this is mostly to support legacy code and should go away. */
277 {
279 gcc_checking_assert (v >= 0 && v <= REG_BR_PROB_BASE);
280 ret.m_val = RDIV (v * (uint64_t) max_probability, REG_BR_PROB_BASE);
281 ret.set_quality (GUESSED);
282 return ret;
283 }
284
285 /* Return THIS with quality set to ADJUSTED. */
287 {
288 profile_probability ret = *this;
289 if (!initialized_p ())
290 return *this;
291 ret.set_quality (ADJUSTED);
292 return ret;
293 }
294
296 {
298 return RDIV (m_val * (uint64_t) REG_BR_PROB_BASE, max_probability);
299 }
300
301 /* Conversion to and from RTL representation of profile probabilities. */
303 {
305 ret.m_val = ((unsigned int)v) / 8;
306 ret.m_adjusted_quality = ((unsigned int)v) & 7;
307 return ret;
308 }
309
311 {
313 int ret = m_val * 8 + m_adjusted_quality;
315 return ret;
316 }
317
318 /* Return VAL1/VAL2. */
320 (gcov_type val1, gcov_type val2)
321 {
323 gcc_checking_assert (val1 >= 0 && val2 > 0);
324 if (val1 > val2)
326 else
327 {
328 uint64_t tmp;
329 safe_scale_64bit (val1, max_probability, val2, &tmp);
331 ret.m_val = tmp;
332 }
333 ret.set_quality (PRECISE);
334 return ret;
335 }
336
337 /* Basic operations. */
338 bool operator== (const profile_probability &other) const
339 {
340 return m_val == other.m_val && quality () == other.quality ();
341 }
342
344 {
345 if (other == never ())
346 return *this;
347 if (*this == never ())
348 return other;
349 if (!initialized_p () || !other.initialized_p ())
350 return uninitialized ();
351
353 ret.m_val = MIN ((uint32_t)(m_val + other.m_val), max_probability);
354 ret.set_quality (MIN (quality (), other.quality ()));
355 return ret;
356 }
357
359 {
360 if (other == never ())
361 return *this;
362 if (*this == never ())
363 {
364 *this = other;
365 return *this;
366 }
367 if (!initialized_p () || !other.initialized_p ())
368 return *this = uninitialized ();
369 else
370 {
371 m_val = MIN ((uint32_t)(m_val + other.m_val), max_probability);
372 set_quality (MIN (quality (), other.quality ()));
373 }
374 return *this;
375 }
376
378 {
379 if (*this == never ()
380 || other == never ())
381 return *this;
382 if (!initialized_p () || !other.initialized_p ())
383 return uninitialized ();
385 ret.m_val = m_val >= other.m_val ? m_val - other.m_val : 0;
386 ret.set_quality (MIN (quality (), other.quality ()));
387 return ret;
388 }
389
391 {
392 if (*this == never ()
393 || other == never ())
394 return *this;
395 if (!initialized_p () || !other.initialized_p ())
396 return *this = uninitialized ();
397 else
398 {
399 m_val = m_val >= other.m_val ? m_val - other.m_val : 0;
400 set_quality (MIN (quality (), other.quality ()));
401 }
402 return *this;
403 }
404
405 profile_probability operator* (const profile_probability &other) const
406 {
407 if (*this == never ()
408 || other == never ())
409 return never ();
410 if (!initialized_p () || !other.initialized_p ())
411 return uninitialized ();
413 ret.m_val = RDIV ((uint64_t)m_val * other.m_val, max_probability);
414 ret.set_quality (MIN (quality (), other.quality ()));
415 return ret;
416 }
417
419 {
420 if (*this == never ()
421 || other == never ())
422 return *this = never ();
423 if (!initialized_p () || !other.initialized_p ())
424 return *this = uninitialized ();
425 else
426 {
427 m_val = RDIV ((uint64_t)m_val * other.m_val, max_probability);
428 set_quality (MIN (MIN (quality (), other.quality ()), ADJUSTED));
429 }
430 return *this;
431 }
432
433 profile_probability operator/ (const profile_probability &other) const
434 {
435 if (*this == never ())
436 return never ();
437 if (!initialized_p () || !other.initialized_p ())
438 return uninitialized ();
440 /* If we get probability above 1, mark it as unreliable and return 1. */
441 if (m_val >= other.m_val)
442 {
444 ret.set_quality (MIN (MIN (quality (), other.quality ()),
445 GUESSED));
446 return ret;
447 }
448 else if (!m_val)
449 ret.m_val = 0;
450 else
451 {
452 gcc_checking_assert (other.m_val);
453 ret.m_val = RDIV ((uint64_t)m_val * max_probability, other.m_val);
454 }
455 ret.set_quality (MIN (MIN (quality (), other.quality ()), ADJUSTED));
456 return ret;
457 }
458
460 {
461 if (*this == never ())
462 return *this = never ();
463 if (!initialized_p () || !other.initialized_p ())
464 return *this = uninitialized ();
465 else
466 {
467 /* If we get probability above 1, mark it as unreliable
468 and return 1. */
469 if (m_val > other.m_val)
470 {
472 set_quality (MIN (MIN (quality (), other.quality ()),
473 GUESSED));
474 return *this;
475 }
476 else if (!m_val)
477 ;
478 else
479 {
480 gcc_checking_assert (other.m_val);
481 m_val = RDIV ((uint64_t)m_val * max_probability, other.m_val);
482 }
483 set_quality (MIN (MIN (quality (), other.quality ()), ADJUSTED));
484 }
485 return *this;
486 }
487
488 /* Split *THIS (ORIG) probability into 2 probabilities, such that
489 the returned one (FIRST) is *THIS * CPROB and *THIS is
490 adjusted (SECOND) so that FIRST + FIRST.invert () * SECOND
491 == ORIG. This is useful e.g. when splitting a conditional
492 branch like:
493 if (cond)
494 goto lab; // ORIG probability
495 into
496 if (cond1)
497 goto lab; // FIRST = ORIG * CPROB probability
498 if (cond2)
499 goto lab; // SECOND probability
500 such that the overall probability of jumping to lab remains
501 the same. CPROB gives the relative probability between the
502 branches. */
504 {
505 profile_probability ret = *this * cprob;
506 /* The following is equivalent to:
507 *this = cprob.invert () * *this / ret.invert ();
508 Avoid scaling when overall outcome is supposed to be always.
509 Without knowing that one is inverse of other, the result would be
510 conservative. */
511 if (!(*this == always ()))
512 *this = (*this - ret) / ret.invert ();
513 return ret;
514 }
515
516 /* Return VAL scaled by this probability. Round initialized probabilities
517 to the nearest integer, with halfway values away from zero. Treat an
518 uninitialized probability as one half and truncate toward zero. */
520 {
521 if (*this == uninitialized ())
522 return val / 2;
523
524 /* A unit probability leaves VAL unchanged. Return it directly because
525 the magnitude of the minimum gcov_type value is one greater than the
526 maximum gcov_type value. */
527 if (m_val == max_probability)
528 return val;
529
530 /* Convert to unsigned before negating so that the minimum gcov_type
531 value has a representable magnitude. Scale the magnitude with
532 overflow-safe arithmetic, then restore the sign. */
533 gcov_type_unsigned magnitude
534 = val < 0 ? -(gcov_type_unsigned) val : (gcov_type_unsigned) val;
535 uint64_t scaled;
536 bool scaled_p
537 = safe_scale_64bit (magnitude, m_val, max_probability, &scaled);
538 /* The scaled result fits in uint64_t. With the unit case handled above,
539 it also fits in the nonnegative range of gcov_type. */
540 gcc_checking_assert (scaled_p);
543
544 return val < 0 ? -(gcov_type) scaled : (gcov_type) scaled;
545 }
546
547 /* Return 1-*THIS. */
549 {
550 return always() - *this;
551 }
552
553 /* Return THIS with quality dropped to GUESSED. */
555 {
556 profile_probability ret = *this;
557 ret.set_quality (GUESSED);
558 return ret;
559 }
560
561 /* Return THIS with quality dropped to AFDO. */
563 {
564 profile_probability ret = *this;
565 ret.set_quality (AFDO);
566 return ret;
567 }
568
569 /* Return *THIS * NUM / DEN. */
570 profile_probability apply_scale (int64_t num, int64_t den) const
571 {
572 if (*this == never ())
573 return *this;
574 if (!initialized_p ())
575 return uninitialized ();
577 uint64_t tmp;
578 safe_scale_64bit (m_val, num, den, &tmp);
579 ret.m_val = MIN (tmp, max_probability);
580 ret.set_quality (MIN (quality (), ADJUSTED));
581 return ret;
582 }
583
584 /* Return *THIS * NUM / DEN. */
586 profile_probability den) const
587 {
588 if (*this == never ())
589 return *this;
590 if (num == never ())
591 return num;
592 if (!initialized_p () || !num.initialized_p () || !den.initialized_p ())
593 return uninitialized ();
594 if (num == den)
595 return *this;
597
599 ret.m_val = MIN (RDIV ((uint64_t)m_val * num.m_val, den.m_val),
601 ret.set_quality (MIN (MIN (MIN (quality (), ADJUSTED),
602 num.quality ()), den.quality ()));
603 return ret;
604 }
605
606 /* Return true when the probability of edge is reliable.
607
608 The profile guessing code is good at predicting branch outcome (i.e.
609 taken/not taken), that is predicted right slightly over 75% of time.
610 It is however notoriously poor on predicting the probability itself.
611 In general the profile appear a lot flatter (with probabilities closer
612 to 50%) than the reality so it is bad idea to use it to drive optimization
613 such as those disabling dynamic branch prediction for well predictable
614 branches.
615
616 There are two exceptions - edges leading to noreturn edges and edges
617 predicted by number of iterations heuristics are predicted well. This macro
618 should be able to distinguish those, but at the moment it simply check for
619 noreturn heuristic that is only one giving probability over 99% or below
620 1%. In future we might want to propagate reliability information across the
621 CFG if we find this information useful on multiple places. */
623 {
624 if (quality () >= ADJUSTED)
625 return true;
626 if (!initialized_p ())
627 return false;
628 return m_val < max_probability / 100
630 }
631
632 /* Return false if profile_probability is bogus. */
633 bool verify () const
634 {
637 return quality () == GUESSED;
638 else if (quality () < GUESSED)
639 return false;
640 return m_val <= max_probability;
641 }
642
643 /* Comparisons are three-state and conservative. False is returned if
644 the inequality cannot be decided. */
645 bool operator< (const profile_probability &other) const
646 {
647 return initialized_p () && other.initialized_p () && m_val < other.m_val;
648 }
649
650 bool operator> (const profile_probability &other) const
651 {
652 return initialized_p () && other.initialized_p () && m_val > other.m_val;
653 }
654
655 bool operator<= (const profile_probability &other) const
656 {
657 return initialized_p () && other.initialized_p () && m_val <= other.m_val;
658 }
659
660 bool operator>= (const profile_probability &other) const
661 {
662 return initialized_p () && other.initialized_p () && m_val >= other.m_val;
663 }
664
665 profile_probability operator* (int64_t num) const
666 {
667 return apply_scale (num, 1);
668 }
669
671 {
672 *this = apply_scale (num, 1);
673 return *this;
674 }
675
676 profile_probability operator/ (int64_t den) const
677 {
678 return apply_scale (1, den);
679 }
680
682 {
683 *this = apply_scale (1, den);
684 return *this;
685 }
686
687 /* Compute n-th power. */
688 profile_probability pow (int) const;
689
690 /* Compute sware root. */
691 profile_probability sqrt () const;
692
693 /* Get the value of the probability. */
694 uint32_t value () const { return m_val; }
695
696 /* Get the quality of the probability. */
703
704 /* Output THIS to F. */
705 void dump (FILE *f) const;
706
707 /* Output THIS to BUFFER. */
708 void dump (char *buffer) const;
709
710 /* Print THIS to stderr. */
711 void debug () const;
712
713 /* Return true if THIS is known to differ significantly from OTHER. */
714 bool differs_from_p (profile_probability other) const;
715
716 /* Return if difference is greater than 50%. */
717 bool differs_lot_from_p (profile_probability other) const;
718
719 /* COUNT1 times event happens with *THIS probability, COUNT2 times OTHER
720 happens with COUNT2 probability. Return probability that either *THIS or
721 OTHER happens. */
722 profile_probability combine_with_count (profile_count count1,
724 profile_count count2) const;
725
726 /* Return probability as sreal. */
727 sreal to_sreal () const;
728 /* LTO streaming support. */
729 static profile_probability stream_in (class lto_input_block *);
730 void stream_out (struct output_block *);
731 void stream_out (struct lto_output_stream *);
732};
733
734/* Main data type to hold profile counters in GCC. Profile counts originate
735 either from profile feedback, static profile estimation or both. We do not
736 perform whole program profile propagation and thus profile estimation
737 counters are often local to function, while counters from profile feedback
738 (or special cases of profile estimation) can be used inter-procedurally.
739
740 There are 3 basic types
741 1) local counters which are result of intra-procedural static profile
742 estimation.
743 2) ipa counters which are result of profile feedback or special case
744 of static profile estimation (such as in function main).
745 3) counters which counts as 0 inter-procedurally (because given function
746 was never run in train feedback) but they hold local static profile
747 estimate.
748
749 Counters of type 1 and 3 cannot be mixed with counters of different type
750 within operation (because whole function should use one type of counter)
751 with exception that global zero mix in most operations where outcome is
752 well defined.
753
754 To take local counter and use it inter-procedurally use ipa member function
755 which strips information irrelevant at the inter-procedural level.
756
757 Counters are 61bit integers representing number of executions during the
758 train run or normalized frequency within the function.
759
760 As the profile is maintained during the compilation, many adjustments are
761 made. Not all transformations can be made precisely, most importantly
762 when code is being duplicated. It also may happen that part of CFG has
763 profile counts known while other do not - for example when LTO optimizing
764 partly profiled program or when profile was lost due to COMDAT merging.
765
766 For this reason profile_count tracks more information than
767 just unsigned integer and it is also ready for profile mismatches.
768 The API of this data type represent operations that are natural
769 on profile counts - sum, difference and operation with scales and
770 probabilities. All operations are safe by never getting negative counts
771 and they do end up in uninitialized scale if any of the parameters is
772 uninitialized.
773
774 All comparisons that are three state and handling of probabilities. Thus
775 a < b is not equal to !(a >= b).
776
777 The following pre-defined counts are available:
778
779 profile_count::zero () for code that is known to execute zero times at
780 runtime (this can be detected statically i.e. for paths leading to
781 abort ();
782 profile_count::one () for code that is known to execute once (such as
783 main () function
784 profile_count::uninitialized () for unknown execution count.
785
786 */
787
789{
790public:
791 /* Use 60bit to hold basic block counters. Should be at least
792 64bit. Although a counter cannot be negative, we use a signed
793 type to hold various extra stages. */
794
795 static const int n_bits = 60;
796 static const uint64_t max_count = ((uint64_t) 1 << n_bits) - 2;
797private:
798 static const uint64_t uninitialized_count = ((uint64_t) 1 << n_bits) - 1;
799
800#if defined (__arm__) && (__GNUC__ >= 6 && __GNUC__ <= 8)
801 /* Work-around for PR88469. A bug in the gcc-6/7/8 PCS layout code
802 incorrectly detects the alignment of a structure where the only
803 64-bit aligned object is a bit-field. We force the alignment of
804 the entire field to mitigate this. */
805#define UINT64_BIT_FIELD_ALIGN __attribute__ ((aligned(8)))
806#else
807#define UINT64_BIT_FIELD_ALIGN
808#endif
810#undef UINT64_BIT_FIELD_ALIGN
812public:
813
814 /* Return true if both values can meaningfully appear in single function
815 body. We have either all counters in function local or global, otherwise
816 operations between them are not really defined well. */
817 bool compatible_p (const profile_count other) const
818 {
819 if (!initialized_p () || !other.initialized_p ())
820 return true;
821 if (*this == zero ()
822 || other == zero ())
823 return true;
824 /* Do not allow nonzero global profile together with local guesses
825 that are globally0. */
826 if (ipa ().nonzero_p ()
827 && !(other.ipa () == other))
828 return false;
829 if (other.ipa ().nonzero_p ()
830 && !(ipa () == *this))
831 return false;
832
833 return ipa_p () == other.ipa_p ();
834 }
835
836 /* Used for counters which are expected to be never executed. */
838 {
839 return from_gcov_type (0);
840 }
841
843 {
845 c.m_val = 0;
846 c.m_quality = ADJUSTED;
847 return c;
848 }
849
851 {
853 c.m_val = 0;
854 c.m_quality = AFDO;
855 return c;
856 }
857
859 {
861 c.m_val = 0;
862 c.m_quality = GUESSED;
863 return c;
864 }
865
867 {
868 return from_gcov_type (1);
869 }
870
871 /* Value of counters which has not been initialized. Either because
872 initialization did not happen yet or because profile is unknown. */
874 {
876 c.m_val = uninitialized_count;
877 c.m_quality = GUESSED_LOCAL;
878 return c;
879 }
880
881 /* Conversion to gcov_type is lossy. */
883 {
885 return m_val;
886 }
887
888 /* Return true if value has been initialized. */
889 bool initialized_p () const
890 {
891 return m_val != uninitialized_count;
892 }
893
894 /* Return true if value can be trusted. */
895 bool reliable_p () const
896 {
897 return m_quality >= ADJUSTED;
898 }
899
900 /* Return true if value can be operated inter-procedurally. */
901 bool ipa_p () const
902 {
904 }
905
906 /* Return true if quality of profile is precise. */
907 bool precise_p () const
908 {
909 return m_quality == PRECISE;
910 }
911
912 /* Get the value of the count. */
913 uint64_t value () const { return m_val; }
914
915 /* Get the quality of the count. */
916 enum profile_quality quality () const { return m_quality; }
917
918 /* When merging basic blocks, the two different profile counts are unified.
919 Return true if this can be done without losing info about profile.
920 The only case we care about here is when first BB contains something
921 that makes it terminate in a way not visible in CFG. */
922 bool ok_for_merging (profile_count other) const
923 {
924 if (m_quality < ADJUSTED
925 || other.m_quality < ADJUSTED)
926 return true;
927 return !(other < *this);
928 }
929
930 /* When merging two BBs with different counts, pick common count that looks
931 most representative. */
933 {
934 if (*this == other || !other.initialized_p ()
935 || m_quality > other.m_quality)
936 return *this;
937 if (other.m_quality > m_quality
938 || other > *this)
939 return other;
940 return *this;
941 }
942
943 /* Basic operations. */
944 bool operator== (const profile_count &other) const
945 {
946 return m_val == other.m_val && m_quality == other.m_quality;
947 }
948
950 {
951 if (other == zero ())
952 return *this;
953 if (*this == zero ())
954 return other;
955 if (!initialized_p () || !other.initialized_p ())
956 return uninitialized ();
957
958 profile_count ret;
960 uint64_t ret_val = m_val + other.m_val;
961 ret.m_val = MIN (ret_val, max_count);
962 ret.m_quality = MIN (m_quality, other.m_quality);
963 return ret;
964 }
965
967 {
968 if (other == zero ())
969 return *this;
970 if (*this == zero ())
971 {
972 *this = other;
973 return *this;
974 }
975 if (!initialized_p () || !other.initialized_p ())
976 return *this = uninitialized ();
977 else
978 {
980 uint64_t ret_val = m_val + other.m_val;
981 m_val = MIN (ret_val, max_count);
982 m_quality = MIN (m_quality, other.m_quality);
983 }
984 return *this;
985 }
986
988 {
989 if (*this == zero () || other == zero ())
990 return *this;
991 if (!initialized_p () || !other.initialized_p ())
992 return uninitialized ();
994 profile_count ret;
995 ret.m_val = m_val >= other.m_val ? m_val - other.m_val : 0;
996 ret.m_quality = MIN (m_quality, other.m_quality);
997 return ret;
998 }
999
1001 {
1002 if (*this == zero () || other == zero ())
1003 return *this;
1004 if (!initialized_p () || !other.initialized_p ())
1005 return *this = uninitialized ();
1006 else
1007 {
1009 m_val = m_val >= other.m_val ? m_val - other.m_val : 0;
1010 m_quality = MIN (m_quality, other.m_quality);
1011 }
1012 return *this;
1013 }
1014
1015 /* Return false if profile_count is bogus. */
1021
1022 /* Comparisons are three-state and conservative. False is returned if
1023 the inequality cannot be decided. */
1024 bool operator< (const profile_count &other) const
1025 {
1026 if (!initialized_p () || !other.initialized_p ())
1027 return false;
1028 if (*this == zero ())
1029 return !(other == zero ());
1030 if (other == zero ())
1031 return false;
1033 return m_val < other.m_val;
1034 }
1035
1036 bool operator> (const profile_count &other) const
1037 {
1038 if (!initialized_p () || !other.initialized_p ())
1039 return false;
1040 if (*this == zero ())
1041 return false;
1042 if (other == zero ())
1043 return !(*this == zero ());
1045 return initialized_p () && other.initialized_p () && m_val > other.m_val;
1046 }
1047
1048 bool operator< (const gcov_type other) const
1049 {
1051 gcc_checking_assert (other >= 0);
1052 return ipa ().initialized_p () && ipa ().m_val < (uint64_t) other;
1053 }
1054
1055 bool operator> (const gcov_type other) const
1056 {
1058 gcc_checking_assert (other >= 0);
1059 return ipa ().initialized_p () && ipa ().m_val > (uint64_t) other;
1060 }
1061
1062 bool operator<= (const profile_count &other) const
1063 {
1064 if (!initialized_p () || !other.initialized_p ())
1065 return false;
1066 if (*this == zero ())
1067 return true;
1068 if (other == zero ())
1069 return (*this == zero ());
1071 return m_val <= other.m_val;
1072 }
1073
1074 bool operator>= (const profile_count &other) const
1075 {
1076 if (!initialized_p () || !other.initialized_p ())
1077 return false;
1078 if (other == zero ())
1079 return true;
1080 if (*this == zero ())
1081 return (other == zero ());
1083 return m_val >= other.m_val;
1084 }
1085
1086 bool operator<= (const gcov_type other) const
1087 {
1089 gcc_checking_assert (other >= 0);
1090 return ipa ().initialized_p () && ipa ().m_val <= (uint64_t) other;
1091 }
1092
1093 bool operator>= (const gcov_type other) const
1094 {
1096 gcc_checking_assert (other >= 0);
1097 return ipa ().initialized_p () && ipa ().m_val >= (uint64_t) other;
1098 }
1099
1100 profile_count operator* (int64_t num) const
1101 {
1102 return apply_scale (num, 1);
1103 }
1104
1106 {
1107 *this = apply_scale (num, 1);
1108 return *this;
1109 }
1110
1111 profile_count operator* (const sreal &num) const;
1112 profile_count operator*= (const sreal &num);
1113
1114 profile_count operator/ (int64_t den) const
1115 {
1116 return apply_scale (1, den);
1117 }
1118
1120 {
1121 *this = apply_scale (1, den);
1122 return *this;
1123 }
1124
1125 /* Return true when value is not zero and can be used for scaling.
1126 This is different from *this > 0 because that requires counter to
1127 be IPA. */
1128 bool nonzero_p () const
1129 {
1130 return initialized_p () && m_val != 0;
1131 }
1132
1133 /* Make counter forcibly nonzero. */
1134 profile_count force_nonzero () const;
1135
1136
1137 /* Return maximum of A and B. If one of values is uninitialized return the
1138 other. */
1139
1140 static profile_count
1142 {
1143 if (!a.initialized_p ())
1144 return b;
1145 if (!b.initialized_p ())
1146 return a;
1147 profile_count ret;
1148 gcc_checking_assert (a.compatible_p (b));
1149 ret.m_val = MAX (a.m_val, b.m_val);
1150 ret.m_quality = MIN (a.m_quality, b.m_quality);
1151 return ret;
1152 }
1153
1154 /* PROB is a probability in scale 0...REG_BR_PROB_BASE. Scale counter
1155 accordingly. */
1157 {
1158 gcc_checking_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
1159 if (m_val == 0)
1160 return *this;
1161 if (!initialized_p ())
1162 return uninitialized ();
1163 profile_count ret;
1164 uint64_t tmp;
1166 ret.m_val = tmp;
1168 return ret;
1169 }
1170
1171 /* Scale counter according to PROB. */
1173 {
1174 if (*this == zero () || prob == profile_probability::always ())
1175 return *this;
1176 if (prob == profile_probability::never ())
1177 return zero ();
1178 if (!initialized_p () || !prob.initialized_p ())
1179 return uninitialized ();
1180 profile_count ret;
1181 uint64_t tmp;
1183 &tmp);
1184 ret.m_val = tmp;
1185 ret.m_quality = MIN (m_quality, prob.quality ());
1186 return ret;
1187 }
1188
1189 /* Return *THIS * NUM / DEN. */
1190 profile_count apply_scale (int64_t num, int64_t den) const
1191 {
1192 if (m_val == 0)
1193 return *this;
1194 if (!initialized_p ())
1195 return uninitialized ();
1196 profile_count ret;
1197 uint64_t tmp;
1198
1199 gcc_checking_assert (num >= 0 && den > 0);
1200 safe_scale_64bit (m_val, num, den, &tmp);
1201 ret.m_val = MIN (tmp, max_count);
1203 return ret;
1204 }
1205
1207 {
1208 if (*this == zero ())
1209 return *this;
1210 if (num == zero ())
1211 return num;
1212 if (!initialized_p () || !num.initialized_p () || !den.initialized_p ())
1213 return uninitialized ();
1214 if (num == den)
1215 return *this;
1217
1218 profile_count ret;
1219 uint64_t val;
1220 safe_scale_64bit (m_val, num.m_val, den.m_val, &val);
1221 ret.m_val = MIN (val, max_count);
1223 num.m_quality), den.m_quality);
1224 /* Be sure that ret is not local if num is global.
1225 Also ensure that ret is not global0 when num is global. */
1226 if (num.ipa_p ())
1227 {
1228 /* This is common case of AFDO scaling when we upgrade
1229 GLOBAL0_AFDO function to AFDO. Be sure that result
1230 is AFDO and not GUESSED (which is unnecessarily low). */
1231 if (num.m_quality == AFDO
1232 && (ret.m_quality != GUESSED
1233 && ret.m_quality != GUESSED_LOCAL))
1234 ret.m_quality = AFDO;
1235 else
1236 ret.m_quality = MAX (ret.m_quality,
1237 num == num.ipa () ? GUESSED : num.m_quality);
1238 }
1239 return ret;
1240 }
1241
1242 /* Return THIS with quality dropped to GUESSED_LOCAL. */
1244 {
1245 profile_count ret = *this;
1246 if (!initialized_p ())
1247 return *this;
1249 return ret;
1250 }
1251
1252 /* We know that profile is globally 0 but keep local profile if present. */
1254 {
1255 profile_count ret = *this;
1256 if (!initialized_p ())
1257 return *this;
1259 return ret;
1260 }
1261
1262 /* We know that profile is globally afdo 0 but keep local profile
1263 if present. */
1265 {
1266 profile_count ret = *this;
1267 if (!initialized_p ())
1268 return *this;
1270 return ret;
1271 }
1272
1273 /* We know that profile is globally adjusted 0 but keep local profile
1274 if present. */
1276 {
1277 profile_count ret = *this;
1278 if (!initialized_p ())
1279 return *this;
1281 return ret;
1282 }
1283
1284 /* Return THIS with quality dropped to GUESSED. */
1286 {
1287 profile_count ret = *this;
1288 ret.m_quality = MIN (ret.m_quality, GUESSED);
1289 return ret;
1290 }
1291
1292 /* Return THIS with quality GUESSED. */
1294 {
1295 profile_count ret = *this;
1297 ret.m_quality = GUESSED;
1298 return ret;
1299 }
1300
1301 /* Return variant of profile count which is always safe to compare
1302 across functions. */
1304 {
1306 return *this;
1308 return zero ();
1310 return adjusted_zero ();
1312 return afdo_zero ();
1313 return uninitialized ();
1314 }
1315
1316 /* Return THIS with quality dropped to AFDO. */
1318 {
1319 profile_count ret = *this;
1320 ret.m_quality = AFDO;
1321 return ret;
1322 }
1323
1324 /* Return probability of event with counter THIS within event with counter
1325 OVERALL. */
1327 {
1328 if (*this == zero ()
1329 && !(overall == zero ()))
1331 if (!initialized_p () || !overall.initialized_p ()
1332 || !overall.m_val)
1334 if (*this == overall && m_quality == PRECISE)
1338
1339 if (overall.m_val < m_val)
1340 {
1342 ret.set_quality (GUESSED);
1343 return ret;
1344 }
1345 else
1346 {
1347 gcc_checking_assert (overall.m_val);
1348 uint64_t tmp;
1350 overall.m_val, &tmp);
1352 ret.m_val = tmp;
1353 }
1354 ret.set_quality (MIN (MAX (MIN (m_quality, overall.m_quality),
1355 GUESSED), ADJUSTED));
1356 return ret;
1357 }
1358
1359 /* Return true if profile count is very large, so we risk overflows
1360 with loop transformations. */
1361 bool
1363 {
1364 if (!initialized_p ())
1365 return false;
1366 return m_val > max_count / 65536;
1367 }
1368
1369 int to_frequency (struct function *fun) const;
1370 int to_cgraph_frequency (profile_count entry_bb_count) const;
1371 sreal to_sreal_scale (profile_count in, bool *known = NULL) const;
1372
1373 /* Output THIS to F. */
1374 void dump (FILE *f, struct function *fun = NULL) const;
1375
1376 /* Print THIS to stderr. */
1377 void debug () const;
1378
1379 /* Return true if THIS is known to differ significantly from OTHER. */
1380 bool differs_from_p (profile_count other) const;
1381
1382 /* We want to scale profile across function boundary from NUM to DEN.
1383 Take care of the side case when NUM and DEN are zeros of incompatible
1384 kinds. */
1385 static void adjust_for_ipa_scaling (profile_count *num, profile_count *den);
1386
1387 /* THIS is a count of bb which is known to be executed IPA times.
1388 Combine this information into bb counter. This means returning IPA
1389 if it is nonzero, not changing anything if IPA is uninitialized
1390 and if IPA is zero, turning THIS into corresponding local profile with
1391 global0. */
1392 profile_count combine_with_ipa_count (profile_count ipa);
1393
1394 /* Same as combine_with_ipa_count but inside function with count IPA2. */
1395 profile_count combine_with_ipa_count_within
1396 (profile_count ipa, profile_count ipa2);
1397
1398 /* The profiling runtime uses gcov_type, which is usually 64bit integer.
1399 Conversions back and forth are used to read the coverage and get it
1400 into internal representation. */
1401 static profile_count from_gcov_type (gcov_type v,
1402 profile_quality quality = PRECISE);
1403
1404 /* LTO streaming support. */
1405 static profile_count stream_in (class lto_input_block *);
1406 void stream_out (struct output_block *);
1407 void stream_out (struct lto_output_stream *);
1408};
1409#endif
gcov_type apply_scale(gcov_type freq, gcov_type scale)
Definition basic-block.h:573
Definition lto-streamer.h:349
Definition profile-count.h:149
enum profile_quality quality() const
Definition profile-count.h:697
profile_probability sqrt() const
Definition profile-count.cc:499
profile_probability()
Definition profile-count.h:176
static const int n_bits
Definition profile-count.h:150
static profile_probability unlikely()
Definition profile-count.h:208
bool operator>(const profile_probability &other) const
Definition profile-count.h:650
static const int min_quality
Definition profile-count.h:159
profile_probability operator+(const profile_probability &other) const
Definition profile-count.h:343
bool reliable_p() const
Definition profile-count.h:269
friend struct profile_count
Definition profile-count.h:164
profile_probability apply_scale(int64_t num, int64_t den) const
Definition profile-count.h:570
profile_probability split(const profile_probability &cprob)
Definition profile-count.h:503
static const uint32_t max_probability
Definition profile-count.h:153
profile_probability & operator/=(const profile_probability &other)
Definition profile-count.h:459
profile_probability operator*(const profile_probability &other) const
Definition profile-count.h:405
void set_quality(profile_quality quality)
Definition profile-count.h:168
gcov_type apply(gcov_type val) const
Definition profile-count.h:519
profile_probability apply_scale(profile_probability num, profile_probability den) const
Definition profile-count.h:585
static profile_probability uninitialized()
Definition profile-count.h:254
static profile_probability very_unlikely()
Definition profile-count.h:200
profile_probability combine_with_count(profile_count count1, profile_probability other, profile_count count2) const
Definition profile-count.cc:467
uint32_t m_val
Definition profile-count.h:161
int to_reg_br_prob_base() const
Definition profile-count.h:295
static profile_probability guessed_never()
Definition profile-count.h:192
void debug() const
Definition profile-count.cc:213
void dump(FILE *f) const
Definition profile-count.cc:203
bool operator==(const profile_probability &other) const
Definition profile-count.h:338
bool initialized_p() const
Definition profile-count.h:263
profile_probability operator/(const profile_probability &other) const
Definition profile-count.h:433
profile_probability(uint32_t val, profile_quality quality)
Definition profile-count.h:179
profile_probability invert() const
Definition profile-count.h:548
sreal to_sreal() const
Definition profile-count.cc:490
static const uint32_t uninitialized_probability
Definition profile-count.h:155
uint32_t value() const
Definition profile-count.h:694
bool probably_reliable_p() const
Definition profile-count.h:622
static profile_probability from_reg_br_prob_base(int v)
Definition profile-count.h:276
bool differs_from_p(profile_probability other) const
Definition profile-count.cc:222
bool operator<(const profile_probability &other) const
Definition profile-count.h:645
bool operator<=(const profile_probability &other) const
Definition profile-count.h:655
int to_reg_br_prob_note() const
Definition profile-count.h:310
static profile_probability stream_in(class lto_input_block *)
Definition profile-count.cc:249
profile_probability afdo() const
Definition profile-count.h:562
profile_probability & operator+=(const profile_probability &other)
Definition profile-count.h:358
profile_probability adjusted() const
Definition profile-count.h:286
profile_probability operator-(const profile_probability &other) const
Definition profile-count.h:377
profile_probability pow(int) const
Definition profile-count.cc:529
profile_probability & operator*=(const profile_probability &other)
Definition profile-count.h:418
profile_probability guessed() const
Definition profile-count.h:554
profile_probability & operator-=(const profile_probability &other)
Definition profile-count.h:390
static profile_probability from_reg_br_prob_note(int v)
Definition profile-count.h:302
static profile_probability very_likely()
Definition profile-count.h:221
bool verify() const
Definition profile-count.h:633
static profile_probability probability_in_gcov_type(gcov_type val1, gcov_type val2)
Definition profile-count.h:320
static profile_probability likely()
Definition profile-count.h:226
static profile_probability guessed_always()
Definition profile-count.h:236
static profile_probability always()
Definition profile-count.h:244
unsigned m_adjusted_quality
Definition profile-count.h:162
bool nonzero_p() const
Definition profile-count.h:231
static profile_probability never()
Definition profile-count.h:184
static profile_probability even()
Definition profile-count.h:216
void stream_out(struct output_block *)
Definition profile-count.cc:260
bool operator>=(const profile_probability &other) const
Definition profile-count.h:660
bool differs_lot_from_p(profile_probability other) const
Definition profile-count.cc:238
Definition sreal.h:41
bool debug
Definition collect-utils.cc:34
uint64_t gcov_type_unsigned
Definition coretypes.h:47
#define GTY(x)
Definition coretypes.h:41
int64_t gcov_type
Definition coretypes.h:46
static bool operator==(cfa_reg &cfa, rtx reg)
Definition dwarf2cfi.cc:1164
double pow(double, double)
double sqrt(double)
bool operator<(const pattern_pos &e1, const pattern_pos &e2)
Definition genrecog.cc:3893
poly_int< N, C > r
Definition poly-int.h:774
Ca const poly_int< N, Cb > & b
Definition poly-int.h:771
Ca & a
Definition poly-int.h:770
profile_quality
Definition profile-count.h:30
@ ADJUSTED
Definition profile-count.h:63
@ GUESSED_LOCAL
Definition profile-count.h:38
@ UNINITIALIZED_PROFILE
Definition profile-count.h:32
@ GUESSED_GLOBAL0_AFDO
Definition profile-count.h:41
@ GUESSED_GLOBAL0_ADJUSTED
Definition profile-count.h:44
@ GUESSED_GLOBAL0
Definition profile-count.h:49
@ AFDO
Definition profile-count.h:58
@ PRECISE
Definition profile-count.h:67
@ GUESSED
Definition profile-count.h:55
#define RDIV(X, Y)
Definition profile-count.h:77
#define REG_BR_PROB_BASE
Definition profile-count.h:75
bool parse_profile_quality(const char *value, profile_quality *quality)
Definition profile-count.cc:64
#define UINT64_BIT_FIELD_ALIGN
Definition profile-count.h:807
bool slow_safe_scale_64bit(uint64_t a, uint64_t b, uint64_t c, uint64_t *res)
Definition profile-count.cc:278
const char * profile_quality_as_string(enum profile_quality)
Definition profile-count.cc:56
bool safe_scale_64bit(uint64_t a, uint64_t b, uint64_t c, uint64_t *res)
Definition profile-count.h:84
sreal & operator/=(sreal &a, const sreal &b)
Definition sreal.h:157
bool operator<=(const sreal &a, const sreal &b)
Definition sreal.h:177
sreal & operator*=(sreal &a, const sreal &b)
Definition sreal.h:162
bool operator>(const sreal &a, const sreal &b)
Definition sreal.h:172
sreal & operator-=(sreal &a, const sreal &b)
Definition sreal.h:152
sreal & operator+=(sreal &a, const sreal &b)
Definition sreal.h:147
bool operator>=(const sreal &a, const sreal &b)
Definition sreal.h:182
Definition function.h:249
Definition lto-streamer.h:669
Definition lto-streamer.h:745
Definition profile-count.h:789
profile_count combine_with_ipa_count(profile_count ipa)
Definition profile-count.cc:402
profile_count apply_probability(profile_probability prob) const
Definition profile-count.h:1172
uint64_t value() const
Definition profile-count.h:913
sreal to_sreal_scale(profile_count in, bool *known=NULL) const
Definition profile-count.cc:334
static const uint64_t uninitialized_count
Definition profile-count.h:798
profile_count force_nonzero() const
Definition profile-count.cc:578
gcov_type to_gcov_type() const
Definition profile-count.h:882
bool operator<(const profile_count &other) const
Definition profile-count.h:1024
profile_count global0adjusted() const
Definition profile-count.h:1275
static const int n_bits
Definition profile-count.h:795
uint64_t UINT64_BIT_FIELD_ALIGN m_val
Definition profile-count.h:809
bool operator<=(const profile_count &other) const
Definition profile-count.h:1062
static profile_count stream_in(class lto_input_block *)
Definition profile-count.cc:146
static const uint64_t max_count
Definition profile-count.h:796
profile_count operator/(int64_t den) const
Definition profile-count.h:1114
profile_count force_guessed() const
Definition profile-count.h:1293
profile_count combine_with_ipa_count_within(profile_count ipa, profile_count ipa2)
Definition profile-count.cc:421
profile_count operator+(const profile_count &other) const
Definition profile-count.h:949
bool initialized_p() const
Definition profile-count.h:889
enum profile_quality quality() const
Definition profile-count.h:916
void dump(FILE *f, struct function *fun=NULL) const
Definition profile-count.cc:94
int to_cgraph_frequency(profile_count entry_bb_count) const
Definition profile-count.cc:316
static profile_count uninitialized()
Definition profile-count.h:873
static profile_count afdo_zero()
Definition profile-count.h:850
bool very_large_p()
Definition profile-count.h:1362
bool precise_p() const
Definition profile-count.h:907
static profile_count one()
Definition profile-count.h:866
enum profile_quality m_quality
Definition profile-count.h:811
static void adjust_for_ipa_scaling(profile_count *num, profile_count *den)
Definition profile-count.cc:373
static profile_count zero()
Definition profile-count.h:837
profile_count & operator+=(const profile_count &other)
Definition profile-count.h:966
bool reliable_p() const
Definition profile-count.h:895
profile_count guessed_local() const
Definition profile-count.h:1243
bool operator>(const profile_count &other) const
Definition profile-count.h:1036
profile_count operator*=(int64_t num)
Definition profile-count.h:1105
profile_count apply_scale(profile_count num, profile_count den) const
Definition profile-count.h:1206
profile_count global0afdo() const
Definition profile-count.h:1264
profile_count operator*(int64_t num) const
Definition profile-count.h:1100
bool ok_for_merging(profile_count other) const
Definition profile-count.h:922
profile_count merge(profile_count other) const
Definition profile-count.h:932
static profile_count guessed_zero()
Definition profile-count.h:858
profile_count ipa() const
Definition profile-count.h:1303
static profile_count from_gcov_type(gcov_type v, profile_quality quality=PRECISE)
Definition profile-count.cc:449
bool nonzero_p() const
Definition profile-count.h:1128
bool compatible_p(const profile_count other) const
Definition profile-count.h:817
bool differs_from_p(profile_count other) const
Definition profile-count.cc:128
bool operator==(const profile_count &other) const
Definition profile-count.h:944
bool operator>=(const profile_count &other) const
Definition profile-count.h:1074
profile_probability probability_in(const profile_count overall) const
Definition profile-count.h:1326
static profile_count adjusted_zero()
Definition profile-count.h:842
void stream_out(struct output_block *)
Definition profile-count.cc:157
profile_count global0() const
Definition profile-count.h:1253
profile_count apply_scale(int64_t num, int64_t den) const
Definition profile-count.h:1190
profile_count operator-(const profile_count &other) const
Definition profile-count.h:987
static profile_count max_prefer_initialized(const profile_count a, const profile_count b)
Definition profile-count.h:1141
profile_count afdo() const
Definition profile-count.h:1317
profile_count & operator-=(const profile_count &other)
Definition profile-count.h:1000
void debug() const
Definition profile-count.cc:119
int to_frequency(struct function *fun) const
Definition profile-count.cc:297
bool ipa_p() const
Definition profile-count.h:901
profile_count guessed() const
Definition profile-count.h:1285
bool verify() const
Definition profile-count.h:1016
profile_count operator/=(int64_t den)
Definition profile-count.h:1119
profile_count apply_probability(int prob) const
Definition profile-count.h:1156
#define NULL
Definition system.h:58
#define INTTYPE_MAXIMUM(t)
Definition system.h:351
#define MIN(X, Y)
Definition system.h:410
#define gcc_checking_assert(EXPR)
Definition system.h:835
#define MAX(X, Y)
Definition system.h:411
comp_cost operator+(comp_cost cost1, comp_cost cost2)
Definition tree-ssa-loop-ivopts.cc:270
comp_cost operator-(comp_cost cost1, comp_cost cost2)
Definition tree-ssa-loop-ivopts.cc:283