qemu/accel/tcg
Richard Henderson 6b8b622e87 cputlb: Make store_helper less fragile to compiler optimizations
This has no functional change.

The current function structure is:

    inline QEMU_ALWAYSINLINE
    store_memop() {
        switch () {
            ...
        default:
            qemu_build_not_reached();
        }
    }
    inline QEMU_ALWAYSINLINE
    store_helper() {
        ...
        if (span_two_pages_or_io) {
            ...
            helper_ret_stb_mmu();
        }
        store_memop();
    }
    helper_ret_stb_mmu() {
        store_helper();
    }

Whereas GCC will generate an error at compile-time when an always_inline
function is not inlined, Clang does not.  Nor does Clang prioritize the
inlining of always_inline functions.  Both of these are arguably bugs.

Both `store_memop` and `store_helper` need to be inlined and allow
constant propogations to eliminate the `qemu_build_not_reached` call.

However, if the compiler instead chooses to inline helper_ret_stb_mmu
into store_helper, then store_helper is now self-recursive and the
compiler is no longer able to propagate the constant in the same way.

This does not produce at current QEMU head, but was reproducible
at v4.2.0 with `clang-10 -O2 -fexperimental-new-pass-manager`.

The inline recursion problem can be fixed solely by marking
helper_ret_stb_mmu as noinline, so the compiler does not make an
incorrect decision about which functions to inline.

In addition, extract store_helper_unaligned as a noinline subroutine
that can be shared by all of the helpers.  This saves about 6k code
size in an optimized x86_64 build.

Reported-by: Shu-Chun Weng <scw@google.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2020-09-03 13:13:58 -07:00
..
atomic_common.c.inc meson: rename included C source files to .c.inc 2020-08-21 06:18:30 -04:00
atomic_template.h trace: Remove trace_mem_build_info_no_se_[bl]e 2020-01-15 15:13:09 -10:00
cpu-exec-common.c qemu-common: Move tcg_enabled() etc. to sysemu/tcg.h 2019-06-11 20:22:09 +02:00
cpu-exec.c tcg/cpu-exec: precise single-stepping after an interrupt 2020-07-17 11:09:34 -07:00
cputlb.c cputlb: Make store_helper less fragile to compiler optimizations 2020-09-03 13:13:58 -07:00
meson.build meson: accel 2020-08-21 06:30:36 -04:00
plugin-gen.c plugin-gen: add module for TCG-related code 2019-10-28 15:12:38 +00:00
plugin-helpers.h plugin-gen: add module for TCG-related code 2019-10-28 15:12:38 +00:00
tcg-all.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
tcg-runtime-gvec.c tcg: Implement gvec support for rotate by vector 2020-06-02 08:42:37 -07:00
tcg-runtime.c tcg: Search includes from the project root source directory 2020-01-15 15:13:10 -10:00
tcg-runtime.h tcg: Implement gvec support for rotate by vector 2020-06-02 08:42:37 -07:00
trace-events accel/tcg: don't disable exec_tb trace events 2020-05-15 15:25:16 +01:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
translate-all.c accel/tcg: better handle memory constrained systems 2020-07-27 09:40:16 +01:00
translate-all.h cputlb: Pass retaddr to tb_check_watchpoint 2019-09-25 10:56:28 -07:00
translator.c qemu_log_lock/unlock now preserves the qemu_logfile handle. 2019-12-18 20:18:02 +00:00
user-exec-stub.c hw/core: Move cpu.c, cpu.h from qom/ to hw/core/ 2019-08-21 13:24:01 +02:00
user-exec.c meson: rename included C source files to .c.inc 2020-08-21 06:18:30 -04:00