On Mon, 18 Mar 2019 16:38:42 +0100 Peter Zijlstra <[email protected]> wrote:
> With CONFIG_PROFILE_ALL_BRANCHES, the "if" macro converts the > conditional to an array index. This can cause GCC to create horrible > code. When there are nested ifs, the generated code uses register > values to encode branching decisions. > > Make it easier for GCC to optimize by keeping the conditional as a > conditional rather than converting it to an integer. This shrinks the > generated code quite a bit, and also makes the code sane enough for > objtool to understand. > > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Cc: [email protected] > Reported-by: Peter Zijlstra <[email protected]> > Signed-off-by: Josh Poimboeuf <[email protected]> > Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Acked-by: Steven Rostedt (VMware) <[email protected]> -- Steve > Link: https://lkml.kernel.org/r/20190307174802.46fmpysxyo35hh43@treble > --- > include/linux/compiler.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > --- a/include/linux/compiler.h > +++ b/include/linux/compiler.h > @@ -67,7 +67,7 @@ void ftrace_likely_update(struct ftrace_ > .line = __LINE__, \ > }; \ > ______r = !!(cond); \ > - ______f.miss_hit[______r]++; > \ > + ______r ? ______f.miss_hit[1]++ : ______f.miss_hit[0]++;\ > ______r; \ > })) > #endif /* CONFIG_PROFILE_ALL_BRANCHES */ >

