• M
    rbtree: low level optimizations in rb_erase() · 4f035ad6
    Michel Lespinasse 提交于
    Various minor optimizations in rb_erase():
    - Avoid multiple loading of node->__rb_parent_color when computing parent
      and color information (possibly not in close sequence, as there might
      be further branches in the algorithm)
    - In the 1-child subcase of case 1, copy the __rb_parent_color field from
      the erased node to the child instead of recomputing it from the desired
      parent and color
    - When searching for the erased node's successor, differentiate between
      cases 2 and 3 based on whether any left links were followed. This avoids
      a condition later down.
    - In case 3, keep a pointer to the erased node's right child so we don't
      have to refetch it later to adjust its parent.
    - In the no-childs subcase of cases 2 and 3, place the rebalance assigment
      last so that the compiler can remove the following if(rebalance) test.
    
    Also, added some comments to illustrate cases 2 and 3.
    Signed-off-by: NMichel Lespinasse <walken@google.com>
    Acked-by: NRik van Riel <riel@redhat.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    4f035ad6
rbtree.c 16.7 KB