• Ravi Bangoria's avatar
    perf annotate: Fix fused instr logic for assembly functions · 7efbcc8c
    Ravi Bangoria authored
    Some x86 microarchitectures fuse a subset of cmp/test/ALU instructions
    with branch instructions, and thus perf annotate highlight such valid
    pairs as fused.
    
    When annotated with source, perf uses struct disasm_line to contain
    either source or instruction line from objdump output. Usually, a C
    statement generates multiple instructions which include such
    cmp/test/ALU + branch instruction pairs. But in case of assembly
    function, each individual assembly source line generate one
    instruction.
    
    The 'perf annotate' instruction fusion logic assumes the previous
    disasm_line as the previous instruction line, which is wrong because,
    for assembly function, previous disasm_line contains source line.  And
    thus perf fails to highlight valid fused instruction pairs for assembly
    functions.
    
    Fix it by searching backward until we find an instruction line and
    consider that disasm_line as fused with current branch instruction.
    
    Before:
             │    cmpq    %rcx, RIP+8(%rsp)
        0.00 │      cmp    %rcx,0x88(%rsp)
             │    je      .Lerror_bad_iret      <--- Source line
        0.14 │   ┌──je     b4                   <--- Instruction line
             │   │movl    %ecx, %eax
    
    After:
             │    cmpq    %rcx, RIP+8(%rsp)
        0.00 │   ┌──cmp    %rcx,0x88(%rsp)
             │   │je      .Lerror_bad_iret
        0.14 │   ├──je     b4
             │   │movl    %ecx, %eax
    Reviewed-by: default avatarJin Yao <yao.jin@linux.intel.com>
    Signed-off-by: default avatarRavi Bangoria <ravi.bangoria@amd.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Kim Phillips <kim.phillips@amd.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: https //lore.kernel.org/r/20210911043854.8373-1-ravi.bangoria@amd.com
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    7efbcc8c
browser.c 18.2 KB