From d53c73e02c3907858fcb41a86906b71501e91397 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek <jakub@redhat.com> Date: Thu, 25 Mar 2010 09:16:18 +0100 Subject: [PATCH] re PR c/43385 (glibc regex testsuite failures) PR c/43385 * gimplify.c (gimple_boolify): Only recurse on __builtin_expect argument if the argument is truth_value_p. * gcc.c-torture/execute/pr43385.c: New test. From-SVN: r157721 --- gcc/ChangeLog | 6 ++ gcc/gimplify.c | 12 ++-- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.c-torture/execute/pr43385.c | 59 +++++++++++++++++++ 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr43385.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78e05a898648..f4a22c81ffee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-03-25 Jakub Jelinek <jakub@redhat.com> + + PR c/43385 + * gimplify.c (gimple_boolify): Only recurse on __builtin_expect + argument if the argument is truth_value_p. + 2010-03-24 Michael Meissner <meissner@linux.vnet.ibm.com> * config/rs6000/constraints.md: Update copyright year for my diff --git a/gcc/gimplify.c b/gcc/gimplify.c index f87b5b57553b..26906b0800a7 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -2727,7 +2727,8 @@ gimple_boolify (tree expr) tree call = TREE_OPERAND (expr, 0); tree fn = get_callee_fndecl (call); - /* For __builtin_expect ((long) (x), y) recurse into x as well. */ + /* For __builtin_expect ((long) (x), y) recurse into x as well + if x is truth_value_p. */ if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL && DECL_FUNCTION_CODE (fn) == BUILT_IN_EXPECT @@ -2739,9 +2740,12 @@ gimple_boolify (tree expr) if (TREE_CODE (arg) == NOP_EXPR && TREE_TYPE (arg) == TREE_TYPE (call)) arg = TREE_OPERAND (arg, 0); - arg = gimple_boolify (arg); - CALL_EXPR_ARG (call, 0) - = fold_convert_loc (loc, TREE_TYPE (call), arg); + if (truth_value_p (TREE_CODE (arg))) + { + arg = gimple_boolify (arg); + CALL_EXPR_ARG (call, 0) + = fold_convert_loc (loc, TREE_TYPE (call), arg); + } } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d629156688c..93083bff1c80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-03-25 Jakub Jelinek <jakub@redhat.com> + + PR c/43385 + * gcc.c-torture/execute/pr43385.c: New test. + 2010-03-24 Joseph Myers <joseph@codesourcery.com> * gcc.dg/strncpy-fix-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr43385.c b/gcc/testsuite/gcc.c-torture/execute/pr43385.c new file mode 100644 index 000000000000..eeb9096a8e59 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr43385.c @@ -0,0 +1,59 @@ +/* PR c/43385 */ + +extern void abort (void); + +int e; + +__attribute__((noinline)) void +foo (int x, int y) +{ + if (__builtin_expect (x, 0) && y != 0) + e++; +} + +__attribute__((noinline)) int +bar (int x, int y) +{ + if (__builtin_expect (x, 0) && y != 0) + return 1; + else + return 0; +} + +int +main (void) +{ + int z = 0; + asm ("" : "+r" (z)); + foo (z + 2, z + 1); + if (e != 1) + abort (); + foo (z + 2, z); + if (e != 1) + abort (); + foo (z + 1, z + 1); + if (e != 2) + abort (); + foo (z + 1, z); + if (e != 2) + abort (); + foo (z, z + 1); + if (e != 2) + abort (); + foo (z, z); + if (e != 2) + abort (); + if (bar (z + 2, z + 1) != 1) + abort (); + if (bar (z + 2, z) != 0) + abort (); + if (bar (z + 1, z + 1) != 1) + abort (); + if (bar (z + 1, z) != 0) + abort (); + if (bar (z, z + 1) != 0) + abort (); + if (bar (z, z) != 0) + abort (); + return 0; +} -- GitLab