[PATCH 05/11] Remove from RB_REMOVE_COLOR some null checks

Sebastian Huber sebastian.huber@embedded-brains.de
Mon Oct 19 16:05:18 GMT 2020


From: dougm <dougm@FreeBSD.org>

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
---
 newlib/libc/include/sys/tree.h | 46 +++++++++++++++-------------------
 1 file changed, 20 insertions(+), 26 deletions(-)

diff --git a/newlib/libc/include/sys/tree.h b/newlib/libc/include/sys/tree.h
index d5adfdd4e..372c001b9 100644
--- a/newlib/libc/include/sys/tree.h
+++ b/newlib/libc/include/sys/tree.h
@@ -493,26 +493,23 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent)		\
 				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)) {	\
-				RB_COLOR(tmp, field) = RB_RED;		\
-				elm = parent;				\
-				parent = RB_PARENT(elm, field);		\
-				continue;				\
-			}						\
-			if (!RB_ISRED(RB_RIGHT(tmp, field), field)) {	\
+			if (RB_ISRED(RB_LEFT(tmp, field), field)) {	\
 				struct type *oleft;			\
-				if ((oleft = RB_LEFT(tmp, field))	\
-				    != NULL)				\
-					RB_COLOR(oleft, field) = RB_BLACK; \
+				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))	\
+				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 *parent)		\
 				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)) {	\
-				RB_COLOR(tmp, field) = RB_RED;		\
-				elm = parent;				\
-				parent = RB_PARENT(elm, field);		\
-				continue;				\
-			}						\
-			if (!RB_ISRED(RB_LEFT(tmp, field), field)) {	\
+			if (RB_ISRED(RB_RIGHT(tmp, field), field)) {	\
 				struct type *oright;			\
-				if ((oright = RB_RIGHT(tmp, field))	\
-				    != NULL)				\
-					RB_COLOR(oright, field) = RB_BLACK; \
+				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))	\
+				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;						\
-- 
2.26.2



More information about the Newlib mailing list