This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH]: Transform builtin ascii and toascii
- From: "Kaveh R. Ghazi" <ghazi at caip dot rutgers dot edu>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 7 Apr 2004 08:03:30 -0400 (EDT)
- Subject: [PATCH]: Transform builtin ascii and toascii
This patch adds tranformations of isascii and toascii into bit
operations, namely:
isascii(c) -> ((c & ~0x7f) == 0)
toascii(c) -> (c & 0x7f)
Tested on sparc-sun-solaris2.7, no regressions and the new testcase
passes.
Ok for mainline?
Thanks,
--Kaveh
2004-04-05 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.c (fold_builtin_isascii, fold_builtin_toascii): New.
(fold_builtin): Handle BUILT_IN_ISASCII and BUILT_IN_TOASCII.
testsuite:
* gcc.dg/torture/builtin-ctype-2.c: New test.
diff -rup orig/egcc-CVS20040404/gcc/builtins.c egcc-CVS20040404/gcc/builtins.c
--- orig/egcc-CVS20040404/gcc/builtins.c 2004-04-01 20:03:19.000000000 -0500
+++ egcc-CVS20040404/gcc/builtins.c 2004-04-05 12:51:36.724695549 -0400
@@ -6610,6 +6610,43 @@ fold_builtin_signbit (tree exp)
return NULL_TREE;
}
+/* Fold a call to builtin isascii. */
+
+static tree
+fold_builtin_isascii (tree arglist)
+{
+ if (! validate_arglist (arglist, INTEGER_TYPE, VOID_TYPE))
+ return 0;
+ else
+ {
+ /* Transform isascii(c) -> ((c & ~0x7f) == 0). */
+ tree arg = TREE_VALUE (arglist);
+
+ return fold (build (EQ_EXPR, integer_type_node, integer_zero_node,
+ build (BIT_AND_EXPR, integer_type_node, arg,
+ fold (build1 (BIT_NOT_EXPR,
+ integer_type_node,
+ build_int_2 (0x7f, 0))))));
+ }
+}
+
+/* Fold a call to builtin toascii. */
+
+static tree
+fold_builtin_toascii (tree arglist)
+{
+ if (! validate_arglist (arglist, INTEGER_TYPE, VOID_TYPE))
+ return 0;
+ else
+ {
+ /* Transform toascii(c) -> (c & 0x7f). */
+ tree arg = TREE_VALUE (arglist);
+
+ return fold (build (BIT_AND_EXPR, integer_type_node, arg,
+ build_int_2 (0x7f, 0)));
+ }
+}
+
/* Used by constant folding to eliminate some builtin calls early. EXP is
the CALL_EXPR of a call to a builtin function. */
@@ -7104,6 +7141,12 @@ fold_builtin (tree exp)
case BUILT_IN_SIGNBITL:
return fold_builtin_signbit (exp);
+ case BUILT_IN_ISASCII:
+ return fold_builtin_isascii (arglist);
+
+ case BUILT_IN_TOASCII:
+ return fold_builtin_toascii (arglist);
+
default:
break;
}
/* Copyright (C) 2004 Free Software Foundation.
Verify that built-in ctype transformations are done correctly by
the compiler.
Written by Kaveh Ghazi, 2004-04-05. */
/* { dg-do link } */
extern void link_failure_var(void);
void test(int i)
{
/* All of these ctype calls should compile-time evaluate to true. */
#define TEST_CTYPE_CST_TRUE(FN, VALUE) \
extern void link_failure_##FN##_cst_true(void); \
extern int FN(int); \
if (! FN(VALUE)) \
link_failure_##FN##_cst_true()
/* All of these ctype calls should compile-time evaluate to false. */
#define TEST_CTYPE_CST_FALSE(FN, VALUE) \
extern void link_failure_##FN##_cst_false(void); \
extern int FN(int); \
if (FN(VALUE)) \
link_failure_##FN##_cst_false()
/* All of these ctype calls should compile-time evaluate to true. */
#define TEST_TOCTYPE_CST_TRUE(FN, VALUE) \
extern void link_failure_##FN##_cst_true(void); \
extern int FN(int); \
if (FN(VALUE) != (VALUE)) \
link_failure_##FN##_cst_true()
/* All of these ctype calls should compile-time evaluate to false. */
#define TEST_TOCTYPE_CST_FALSE(FN, VALUE) \
extern void link_failure_##FN##_cst_false(void); \
extern int FN(int); \
if (FN(VALUE) == (VALUE)) \
link_failure_##FN##_cst_false()
#ifdef __OPTIMIZE__
TEST_CTYPE_CST_TRUE (isascii, 0);
TEST_CTYPE_CST_TRUE (isascii, 1);
TEST_CTYPE_CST_TRUE (isascii, 126);
TEST_CTYPE_CST_TRUE (isascii, 127);
TEST_CTYPE_CST_FALSE (isascii, -1);
TEST_CTYPE_CST_FALSE (isascii, 128);
TEST_CTYPE_CST_FALSE (isascii, 129);
TEST_CTYPE_CST_FALSE (isascii, 255);
TEST_CTYPE_CST_FALSE (isascii, 256);
TEST_CTYPE_CST_FALSE (isascii, 257);
TEST_CTYPE_CST_FALSE (isascii, 10000);
TEST_CTYPE_CST_FALSE (isascii, __INT_MAX__);
/* This ctype call should transform into another expression. */
if (isascii(i) != ((i & ~0x7f) == 0))
link_failure_var();
TEST_TOCTYPE_CST_TRUE (toascii, 0);
TEST_TOCTYPE_CST_TRUE (toascii, 1);
TEST_TOCTYPE_CST_TRUE (toascii, 126);
TEST_TOCTYPE_CST_TRUE (toascii, 127);
TEST_TOCTYPE_CST_FALSE (toascii, -1);
TEST_TOCTYPE_CST_FALSE (toascii, 128);
TEST_TOCTYPE_CST_FALSE (toascii, 129);
TEST_TOCTYPE_CST_FALSE (toascii, 255);
TEST_TOCTYPE_CST_FALSE (toascii, 256);
TEST_TOCTYPE_CST_FALSE (toascii, 10000);
TEST_TOCTYPE_CST_FALSE (toascii, __INT_MAX__);
/* This ctype call should transform into another expression. */
if (toascii(i) != (i & 0x7f))
link_failure_var();
#endif /* __OPTIMIZE__ */
}
int main (void)
{
return 0;
}