Skip to content
Snippets Groups Projects
Commit 2674fa47 authored by Jason Merrill's avatar Jason Merrill Committed by Jason Merrill
Browse files

Implement P0479R5, [[likely]] and [[unlikely]].

[[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.

gcc/
	* gimplify.c (gimplify_case_label_expr): Handle hot/cold attributes.
gcc/c-family/
	* c-lex.c (c_common_has_attribute): Handle likely/unlikely.
	* c-attribs.c (attr_cold_hot_exclusions): Make public.
gcc/cp/
	* tree.c (handle_likeliness_attribute): New.
	(std_attribute_table): Add likely/unlikely.
	* cp-gimplify.c (lookup_hotness_attribute, remove_hotness_attribute)
	(process_stmt_hotness_attribute, first_stmt): New.
	(genericize_if_stmt): Check for duplicate predictions.
	* parser.c (cp_parser_statement): Call
	process_stmt_hotness_attribute.
	(cp_parser_label_for_labeled_statement): Apply attributes to case.
	* decl.c (finish_case_label): Give label in template type void.
	* pt.c (tsubst_expr) [CASE_LABEL_EXPR]: Copy attributes.
	[PREDICT_EXPR]: Handle.

From-SVN: r266223
parent a0a57b07
No related branches found
No related tags found
No related merge requests found
Showing with 296 additions and 14 deletions
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment