Implement P0479R5, [[likely]] and [[unlikely]].
commit863c62e0bf4eb405d8b9b31a8e4818cb0747ff56
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Nov 2018 21:49:42 +0000 (16 21:49 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Nov 2018 21:49:42 +0000 (16 21:49 +0000)
tree1c43236aab7e94c52420d2456ea29ce3079f0857
parentb67e663d5f78d43356908b1a405fce7ea19763e9
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@266223 138bc75d-0d04-0410-961f-82ee72b054a4
18 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-attribs.c
gcc/c-family/c-common.h
gcc/c-family/c-lex.c
gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/tree.c
gcc/gimplify.c
gcc/testsuite/g++.dg/cpp2a/attr-likely1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/attr-likely2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/attr-likely3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/attr-likely4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/feat-cxx2a.C