On Tue, Jul 12, 2011 at 11:42 AM, Andrew Pinski <pins...@gmail.com> wrote:
> Hi,
>  The problem here is the code reads:
>       /* Check for more than one successor.  */
>     if (! EDGE_COUNT (bb->succs) > 1)
> But that expression is always false as ! has a higher precedence than
>> does.  So the obvious thing is to rewrite this statement as:
>  if (EDGE_COUNT (bb->succs) <= 1)
> And that fixes the problem.  The only case where this case matters is
> with __builtin_unreachable as fis_get_condition will return null for
> all other cases where there are only one successor edge and we check
> that result.
>
> Committed as obvious after a bootstrap/test on x86_64-linux-gnu.
>
> Thanks,
> Andrew Pinski
>
> ChangeLog:

* cprop.c (find_implicit_sets): Correct the condition.
Index: testsuite/gcc.c-torture/compile/pr49474.c
===================================================================
--- testsuite/gcc.c-torture/compile/pr49474.c   (revision 0)
+++ testsuite/gcc.c-torture/compile/pr49474.c   (revision 0)
@@ -0,0 +1,16 @@
+typedef struct gfc_formal_arglist
+{
+  int next;
+}
+gfc_actual_arglist;
+update_arglist_pass (gfc_actual_arglist* lst, int po, unsigned argpos,
+       const char *name)
+{
+  ((void)(__builtin_expect(!(argpos > 0), 0) ? __builtin_unreachable(), 0 : 
0));
+  if (argpos == 1)
+      return 0;
+  if (lst)
+    lst->next = update_arglist_pass (lst->next, po, argpos - 1, name);
+  else
+    lst = update_arglist_pass (((void *)0), po, argpos - 1, name);
+}
Index: cprop.c
===================================================================
--- cprop.c     (revision 176187)
+++ cprop.c     (working copy)
@@ -1332,7 +1332,7 @@ find_implicit_sets (void)
   FOR_EACH_BB (bb)
     {
       /* Check for more than one successor.  */
-      if (! EDGE_COUNT (bb->succs) > 1)
+      if (EDGE_COUNT (bb->succs) <= 1)
        continue;
 
       cond = fis_get_condition (BB_END (bb));

Reply via email to