From e92d30482ecfa8b870e09648544af9ad54e60ccd Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Fri, 8 Apr 1994 18:18:08 -0400 Subject: [PATCH] (fold, case GT_EXPR): Simplify X < (1 << Y) into X >> Y == 0. From-SVN: r6999 --- gcc/fold-const.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e681278e05f..4cfd2a93767 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -4517,6 +4517,30 @@ fold (expr) return build (code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type, arg0, integer_zero_node); + /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0 + and similarly for <= into !=. */ + if ((code == LT_EXPR || code == GE_EXPR) + && TREE_UNSIGNED (TREE_TYPE (arg0)) + && TREE_CODE (arg1) == LSHIFT_EXPR + && integer_onep (TREE_OPERAND (arg1, 0))) + return build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, + build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0, + TREE_OPERAND (arg1, 1)), + convert (TREE_TYPE (arg0), integer_zero_node)); + + else if ((code == LT_EXPR || code == GE_EXPR) + && TREE_UNSIGNED (TREE_TYPE (arg0)) + && (TREE_CODE (arg1) == NOP_EXPR + || TREE_CODE (arg1) == CONVERT_EXPR) + && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR + && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0))) + return + build (code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, + convert (TREE_TYPE (arg0), + build (RSHIFT_EXPR, TREE_TYPE (arg0), arg0, + TREE_OPERAND (TREE_OPERAND (arg1, 0), 1))), + convert (TREE_TYPE (arg0), integer_zero_node)); + /* Simplify comparison of something with itself. (For IEEE floating-point, we can only do some of these simplifications.) */ if (operand_equal_p (arg0, arg1, 0))