This fixes Honzas previous commit to not build &integer_zero_node (what?).

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2014-08-19  Richard Biener  <rguent...@suse.de>

        * gimple-fold.c (fold_gimple_assign): Properly build a
        null-pointer constant when devirtualizing addresses.

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c   (revision 214135)
+++ gcc/gimple-fold.c   (working copy)
@@ -319,14 +319,6 @@ fold_gimple_assign (gimple_stmt_iterator
                  = possible_polymorphic_call_targets (rhs, stmt, &final);
                if (final && targets.length () <= 1 && dbg_cnt (devirt))
                  {
-                   tree fndecl;
-
-                   if (targets.length () == 1)
-                     fndecl = targets[0]->decl;
-                   else
-                     /* We can not use __builtin_unreachable here because it
-                        can not have address taken.  */
-                     fndecl = integer_zero_node;
                    if (dump_enabled_p ())
                      {
                        location_t loc = gimple_location_safe (stmt);
@@ -335,11 +327,19 @@ fold_gimple_assign (gimple_stmt_iterator
                                         "reference to function %s\n",
                                         targets.length () == 1
                                         ? targets[0]->name ()
-                                        : "__builtin_unreachable");
+                                        : "NULL");
+                     }
+                   if (targets.length () == 1)
+                     {
+                       val = fold_convert (TREE_TYPE (val),
+                                           build_fold_addr_expr_loc
+                                             (loc, targets[0]->decl));
+                       STRIP_USELESS_TYPE_CONVERSION (val);
                      }
-                   val = fold_convert (TREE_TYPE (val),
-                                       build_fold_addr_expr_loc (loc, fndecl));
-                   STRIP_USELESS_TYPE_CONVERSION (val);
+                   else
+                     /* We can not use __builtin_unreachable here because it
+                        can not have address taken.  */
+                     val = build_int_cst (TREE_TYPE (val), 0);
                    return val;
                  }
              }

Reply via email to