From de77ab7591b12bfcbf70ccf5113fd013e322003a Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 25 Nov 2010 13:47:42 +0000 Subject: [PATCH] Properly cast integer constant char. gcc/ 2010-11-25 H.J. Lu PR middle-end/46647 * builtins.c (target_char_cast): Check INTEGER_CST instead of host_integerp. Replace tree_low_cst with TREE_INT_CST_LOW. gcc/testsuite/ 2010-11-25 H.J. Lu PR middle-end/46647 * gcc.target/i386/pr46647.c: New. From-SVN: r167146 --- gcc/ChangeLog | 6 +++++ gcc/builtins.c | 4 +-- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.target/i386/pr46647.c | 44 +++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr46647.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8c5473b..57536cd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-25 H.J. Lu + + PR middle-end/46647 + * builtins.c (target_char_cast): Check INTEGER_CST instead of + host_integerp. Replace tree_low_cst with TREE_INT_CST_LOW. + 2010-11-25 Joseph Myers * target.def (supports_split_stack, except_unwind_info): Take diff --git a/gcc/builtins.c b/gcc/builtins.c index c9e8e68..a90bf2f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -630,11 +630,11 @@ target_char_cast (tree cst, char *p) { unsigned HOST_WIDE_INT val, hostval; - if (!host_integerp (cst, 1) + if (TREE_CODE (cst) != INTEGER_CST || CHAR_TYPE_SIZE > HOST_BITS_PER_WIDE_INT) return 1; - val = tree_low_cst (cst, 1); + val = TREE_INT_CST_LOW (cst); if (CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT) val &= (((unsigned HOST_WIDE_INT) 1) << CHAR_TYPE_SIZE) - 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4dc1eee..2253a94 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-25 H.J. Lu + + PR middle-end/46647 + * gcc.target/i386/pr46647.c: New. + 2010-11-25 Kai Tietz * gcc.dg/dll-8.c: New. diff --git a/gcc/testsuite/gcc.target/i386/pr46647.c b/gcc/testsuite/gcc.target/i386/pr46647.c new file mode 100644 index 0000000..c7e1542 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr46647.c @@ -0,0 +1,44 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mtune=generic" } */ + +char a[5]; +int +func1 (void) +{ + __builtin_memset (a,-1,sizeof (a)); + return 0; +} + +int a2[5]; +int +func2 (void) +{ + __builtin_memset (a2,-1,sizeof (a2)); + return 0; +} + +char a3[5]; +int +func3 (void) +{ + __builtin_memset (a3,0x8fffffff,sizeof (a3)); + return 0; +} + +char a4[5]; +int +func4 (void) +{ + __builtin_memset (a4,0x8fffff00,sizeof (a4)); + return 0; +} + +int a5[5]; +int +func5 (void) +{ + __builtin_memset (a5,0x8fffffff,sizeof (a5)); + return 0; +} + +/* { dg-final { scan-assembler-not "call\[\\t \]*_?memset" } } */ -- 2.7.4