Message ID | 1447201710-10229-25-git-send-email-benh@kernel.crashing.org |
---|---|
State | New |
Headers | show |
On Wed, Nov 11, 2015 at 11:27:37AM +1100, Benjamin Herrenschmidt wrote: > There's no point inlining this, if you hit the exception case you exit > anyway, That doesn't quite seem relevant - IIUC this is affecting inlining in the code generation path, rather than the code execution path. > and not inlining saves about 100K of code size (and cache > footprint). That sounds like a win, though. > > Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > --- > target-ppc/translate.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/target-ppc/translate.c b/target-ppc/translate.c > index a5ab2eb..ac62942 100644 > --- a/target-ppc/translate.c > +++ b/target-ppc/translate.c > @@ -279,7 +279,8 @@ void gen_update_current_nip(void *opaque) > tcg_gen_movi_tl(cpu_nip, ctx->nip); > } > > -static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error) > +static void __attribute__((noinline)) > +gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error) I thought we generally avoided bare gcc attributes in qemu, but I don't see a helper macro for it and I do see it used in a few other places, so I guess its ok. > { > TCGv_i32 t0, t1; > if (ctx->exception == POWERPC_EXCP_NONE) { > @@ -293,7 +294,8 @@ static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t > ctx->exception = (excp); > } > > -static inline void gen_exception(DisasContext *ctx, uint32_t excp) > +static void __attribute__((noinline)) > +gen_exception(DisasContext *ctx, uint32_t excp) > { > TCGv_i32 t0; > if (ctx->exception == POWERPC_EXCP_NONE) { > @@ -305,7 +307,8 @@ static inline void gen_exception(DisasContext *ctx, uint32_t excp) > ctx->exception = (excp); > } > > -static inline void gen_debug_exception(DisasContext *ctx) > +static void __attribute__((noinline)) > +gen_debug_exception(DisasContext *ctx) > { > TCGv_i32 t0; >
On Fri, 2015-11-20 at 18:53 +1100, David Gibson wrote: > On Wed, Nov 11, 2015 at 11:27:37AM +1100, Benjamin Herrenschmidt > wrote: > > There's no point inlining this, if you hit the exception case you > > exit anyway, > > That doesn't quite seem relevant - IIUC this is affecting inlining in > the code generation path, rather than the code execution path. Well, the generation path is also slightly performance sensitive. My point was making the error path inline wasn't buying us anything. > > and not inlining saves about 100K of code size (and cache > > footprint). > > That sounds like a win, though. Yup. .../... > > -static inline void gen_exception_err(DisasContext *ctx, uint32_t > > excp, uint32_t error) > > +static void __attribute__((noinline)) > > +gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t > > error) > > I thought we generally avoided bare gcc attributes in qemu, but I > don't see a helper macro for it and I do see it used in a few other > places, so I guess its ok. That was my guess too... > > { > > TCGv_i32 t0, t1; > > if (ctx->exception == POWERPC_EXCP_NONE) { > > @@ -293,7 +294,8 @@ static inline void > > gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t > > ctx->exception = (excp); > > } > > > > -static inline void gen_exception(DisasContext *ctx, uint32_t excp) > > +static void __attribute__((noinline)) > > +gen_exception(DisasContext *ctx, uint32_t excp) > > { > > TCGv_i32 t0; > > if (ctx->exception == POWERPC_EXCP_NONE) { > > @@ -305,7 +307,8 @@ static inline void gen_exception(DisasContext > > *ctx, uint32_t excp) > > ctx->exception = (excp); > > } > > > > -static inline void gen_debug_exception(DisasContext *ctx) > > +static void __attribute__((noinline)) > > +gen_debug_exception(DisasContext *ctx) > > { > > TCGv_i32 t0; > > >
diff --git a/target-ppc/translate.c b/target-ppc/translate.c index a5ab2eb..ac62942 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -279,7 +279,8 @@ void gen_update_current_nip(void *opaque) tcg_gen_movi_tl(cpu_nip, ctx->nip); } -static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error) +static void __attribute__((noinline)) +gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error) { TCGv_i32 t0, t1; if (ctx->exception == POWERPC_EXCP_NONE) { @@ -293,7 +294,8 @@ static inline void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t ctx->exception = (excp); } -static inline void gen_exception(DisasContext *ctx, uint32_t excp) +static void __attribute__((noinline)) +gen_exception(DisasContext *ctx, uint32_t excp) { TCGv_i32 t0; if (ctx->exception == POWERPC_EXCP_NONE) { @@ -305,7 +307,8 @@ static inline void gen_exception(DisasContext *ctx, uint32_t excp) ctx->exception = (excp); } -static inline void gen_debug_exception(DisasContext *ctx) +static void __attribute__((noinline)) +gen_debug_exception(DisasContext *ctx) { TCGv_i32 t0;
There's no point inlining this, if you hit the exception case you exit anyway, and not inlining saves about 100K of code size (and cache footprint). Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> --- target-ppc/translate.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)