Implement three-level optimize_for_size predicates
authorJan Hubicka <jh@suse.cz>
Mon, 26 Oct 2020 17:19:48 +0000 (18:19 +0100)
committerJan Hubicka <jh@suse.cz>
Mon, 26 Oct 2020 17:19:48 +0000 (18:19 +0100)
commitf20a6c57f0f26d9c60d6d6182f1e2181f727c834
tree27c496c30e568070afa9a437c707bd911b31db10
parent63b2149fb4b0bd16c44ab9485cfdc37149e97b97
Implement three-level optimize_for_size predicates

this patch implements thre two-state optimize_for_size predicates, so with -Os
and with profile feedback for never executed code it returns OPTIMIZE_SIZE_MAX
while in cases we decide to optimize for size based on branch prediction logic
it return OPTIMIZE_SIZE_BALLANCED.

The idea is that for places where we guess that code is unlikely we do not
want to do extreme optimizations for size that leads to many fold slowdowns
(using idiv rather than few shigts or using rep based inlined stringops).

I will update RTL handling code to also support this with BB granuality (which
we don't currently).  LLVM has -Os and -Oz levels where -Oz is our -Os and
LLVM's -Os would ocrrespond to OPTIMIZE_SIZE_BALLANCED.  I wonder if we want
to export this to command line somehow?  For me it would be definitly useful
to test things, I am not sure how "weaker" -Os is desired in practice.

gcc/ChangeLog:

* cgraph.h (cgraph_node::optimize_for_size_p): Return
optimize_size_level.
(cgraph_node::optimize_for_size_p): Update.
* coretypes.h (enum optimize_size_level): New enum.
* predict.c (unlikely_executed_edge_p): Microoptimize.
(optimize_function_for_size_p): Return optimize_size_level.
(optimize_bb_for_size_p): Likewise.
(optimize_edge_for_size_p): Likewise.
(optimize_insn_for_size_p): Likewise.
(optimize_loop_nest_for_size_p): Likewise.
* predict.h (optimize_function_for_size_p): Update declaration.
(optimize_bb_for_size_p): Update declaration.
(optimize_edge_for_size_p): Update declaration.
(optimize_insn_for_size_p): Update declaration.
(optimize_loop_for_size_p): Update declaration.
(optimize_loop_nest_for_size_p): Update declaration.
gcc/cgraph.h
gcc/coretypes.h
gcc/predict.c
gcc/predict.h