]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
predict.c (expr_expected_value_1): Assume compare-and-swap builtin boolean return...
authorRichard Henderson <rth@redhat.com>
Wed, 30 Nov 2011 22:19:02 +0000 (14:19 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 30 Nov 2011 22:19:02 +0000 (14:19 -0800)
        * predict.c (expr_expected_value_1): Assume compare-and-swap builtin
        boolean return is true.

From-SVN: r181862

gcc/ChangeLog
gcc/predict.c

index 1e06e7f516f973865979d4e0bce45e648af9efc1..dceaefcf3ccd7914c9f9f73cdee542547ca3bba0 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-30  Richard Henderson  <rth@redhat.com>
+
+       * predict.c (expr_expected_value_1): Assume compare-and-swap builtin
+       boolean return is true.
+
 2011-11-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/51044
index eeca172ce45f245fb7349b4a91e21c9da5b17e1a..923653179052a65ba9ed75d6107722a5265291d0 100644 (file)
@@ -1190,7 +1190,8 @@ static tree expr_expected_value (tree, bitmap);
 /* Helper function for expr_expected_value.  */
 
 static tree
-expr_expected_value_1 (tree type, tree op0, enum tree_code code, tree op1, bitmap visited)
+expr_expected_value_1 (tree type, tree op0, enum tree_code code,
+                      tree op1, bitmap visited)
 {
   gimple def;
 
@@ -1255,17 +1256,36 @@ expr_expected_value_1 (tree type, tree op0, enum tree_code code, tree op1, bitma
          tree decl = gimple_call_fndecl (def);
          if (!decl)
            return NULL;
-         if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
-             && DECL_FUNCTION_CODE (decl) == BUILT_IN_EXPECT)
-           {
-             tree val;
+         if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
+           switch (DECL_FUNCTION_CODE (decl))
+             {
+             case BUILT_IN_EXPECT:
+               {
+                 tree val;
+                 if (gimple_call_num_args (def) != 2)
+                   return NULL;
+                 val = gimple_call_arg (def, 0);
+                 if (TREE_CONSTANT (val))
+                   return val;
+                 return gimple_call_arg (def, 1);
+               }
 
-             if (gimple_call_num_args (def) != 2)
-               return NULL;
-             val = gimple_call_arg (def, 0);
-             if (TREE_CONSTANT (val))
-               return val;
-             return gimple_call_arg (def, 1);
+             case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N:
+             case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1:
+             case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2:
+             case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4:
+             case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8:
+             case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16:
+             case BUILT_IN_ATOMIC_COMPARE_EXCHANGE:
+             case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N:
+             case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1:
+             case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2:
+             case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4:
+             case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8:
+             case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16:
+               /* Assume that any given atomic operation has low contention,
+                  and thus the compare-and-swap operation succeeds.  */
+               return boolean_true_node;
            }
        }