Author: dougm
Date: Tue Jun  2 17:18:16 2020
New Revision: 361727
URL: https://svnweb.freebsd.org/changeset/base/361727

Log:
  Remove from RB_REMOVE_COLOR some null checks where the pointer checked
  is provably never null.  Restructure the surrounding code just enough
  to make the non-nullness obvious.
  
  Reviewed by:  markj
  Tested by:    pho
  Differential Revision:        https://reviews.freebsd.org/D25089

Modified:
  head/sys/sys/tree.h

Modified: head/sys/sys/tree.h
==============================================================================
--- head/sys/sys/tree.h Tue Jun  2 16:40:58 2020        (r361726)
+++ head/sys/sys/tree.h Tue Jun  2 17:18:16 2020        (r361727)
@@ -493,26 +493,23 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type 
                                RB_ROTATE_LEFT(head, parent, tmp, field);\
                                tmp = RB_RIGHT(parent, field);          \
                        }                                               \
-                       if (!RB_ISRED(RB_LEFT(tmp, field), field) &&    \
-                           !RB_ISRED(RB_RIGHT(tmp, field), field)) {   \
+                       if (RB_ISRED(RB_LEFT(tmp, field), field)) {     \
+                               struct type *oleft;                     \
+                               oleft = RB_LEFT(tmp, field);            \
+                               RB_COLOR(oleft, field) = RB_BLACK;      \
                                RB_COLOR(tmp, field) = RB_RED;          \
+                               RB_ROTATE_RIGHT(head, tmp, oleft, field); \
+                               tmp = RB_RIGHT(parent, field);          \
+                       } else if (!RB_ISRED(RB_RIGHT(tmp, field), field)) { \
+                               RB_COLOR(tmp, field) = RB_RED;          \
                                elm = parent;                           \
                                parent = RB_PARENT(elm, field);         \
                                continue;                               \
                        }                                               \
-                       if (!RB_ISRED(RB_RIGHT(tmp, field), field)) {   \
-                               struct type *oleft;                     \
-                               if ((oleft = RB_LEFT(tmp, field))       \
-                                   != NULL)                            \
-                                       RB_COLOR(oleft, field) = RB_BLACK; \
-                               RB_COLOR(tmp, field) = RB_RED;          \
-                               RB_ROTATE_RIGHT(head, tmp, oleft, field); \
-                               tmp = RB_RIGHT(parent, field);          \
-                       }                                               \
+                       if (RB_ISRED(RB_RIGHT(tmp, field), field))      \
+                               RB_COLOR(RB_RIGHT(tmp, field), field) = 
RB_BLACK; \
                        RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
                        RB_COLOR(parent, field) = RB_BLACK;             \
-                       if (RB_RIGHT(tmp, field))                       \
-                               RB_COLOR(RB_RIGHT(tmp, field), field) = 
RB_BLACK; \
                        RB_ROTATE_LEFT(head, parent, tmp, field);       \
                        elm = RB_ROOT(head);                            \
                        break;                                          \
@@ -523,26 +520,23 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type 
                                RB_ROTATE_RIGHT(head, parent, tmp, field);\
                                tmp = RB_LEFT(parent, field);           \
                        }                                               \
-                       if (!RB_ISRED(RB_LEFT(tmp, field), field) &&    \
-                           !RB_ISRED(RB_RIGHT(tmp, field), field)) {   \
+                       if (RB_ISRED(RB_RIGHT(tmp, field), field)) {    \
+                               struct type *oright;                    \
+                               oright = RB_RIGHT(tmp, field);          \
+                               RB_COLOR(oright, field) = RB_BLACK;     \
                                RB_COLOR(tmp, field) = RB_RED;          \
+                               RB_ROTATE_LEFT(head, tmp, oright, field); \
+                               tmp = RB_LEFT(parent, field);           \
+                       } else if (!RB_ISRED(RB_LEFT(tmp, field), field)) { \
+                               RB_COLOR(tmp, field) = RB_RED;          \
                                elm = parent;                           \
                                parent = RB_PARENT(elm, field);         \
                                continue;                               \
                        }                                               \
-                       if (!RB_ISRED(RB_LEFT(tmp, field), field)) {    \
-                               struct type *oright;                    \
-                               if ((oright = RB_RIGHT(tmp, field))     \
-                                   != NULL)                            \
-                                       RB_COLOR(oright, field) = RB_BLACK; \
-                               RB_COLOR(tmp, field) = RB_RED;          \
-                               RB_ROTATE_LEFT(head, tmp, oright, field); \
-                               tmp = RB_LEFT(parent, field);           \
-                       }                                               \
+                       if (RB_ISRED(RB_LEFT(tmp, field), field))       \
+                               RB_COLOR(RB_LEFT(tmp, field), field) = 
RB_BLACK; \
                        RB_COLOR(tmp, field) = RB_COLOR(parent, field); \
                        RB_COLOR(parent, field) = RB_BLACK;             \
-                       if (RB_LEFT(tmp, field))                        \
-                               RB_COLOR(RB_LEFT(tmp, field), field) = 
RB_BLACK; \
                        RB_ROTATE_RIGHT(head, parent, tmp, field);      \
                        elm = RB_ROOT(head);                            \
                        break;                                          \
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to