From 554cf33034e4a4ba3960a0885f45fa7a919dbd0d Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Fri, 19 Feb 2010 10:50:30 +0100
Subject: [PATCH] re PR middle-end/42233 (c++ builtin_expect code generation
 regression)

	PR middle-end/42233
	* gimplify.c (gimple_boolify): For __builtin_expect call
	gimple_boolify also on its first argument.

From-SVN: r156888
---
 gcc/ChangeLog  |  6 ++++++
 gcc/gimplify.c | 26 ++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f7b78f90ab51..bde0623d236f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-02-19  Jakub Jelinek  <jakub@redhat.com>
+
+	PR middle-end/42233
+	* gimplify.c (gimple_boolify): For __builtin_expect call
+	gimple_boolify also on its first argument.
+
 2010-02-18  Uros Bizjak  <ubizjak@gmail.com>
 
 	* configure.ac (gnu-unique-object): Wrap regexps using [] in
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 91dabd1aa92c..618e3a661378 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -2720,6 +2720,32 @@ gimple_boolify (tree expr)
   tree type = TREE_TYPE (expr);
   location_t loc = EXPR_LOCATION (expr);
 
+  if (TREE_CODE (expr) == NE_EXPR
+      && TREE_CODE (TREE_OPERAND (expr, 0)) == CALL_EXPR
+      && integer_zerop (TREE_OPERAND (expr, 1)))
+    {
+      tree call = TREE_OPERAND (expr, 0);
+      tree fn = get_callee_fndecl (call);
+
+      /* For __builtin_expect ((long) (x), y) recurse into x as well.  */
+      if (fn
+	  && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL
+	  && DECL_FUNCTION_CODE (fn) == BUILT_IN_EXPECT
+	  && call_expr_nargs (call) == 2)
+	{
+	  tree arg = CALL_EXPR_ARG (call, 0);
+	  if (arg)
+	    {
+	      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 (TREE_CODE (type) == BOOLEAN_TYPE)
     return expr;
 
-- 
GitLab