This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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;
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]