]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2014-08-19 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Aug 2014 11:19:52 +0000 (11:19 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Aug 2014 11:19:52 +0000 (11:19 +0000)
* gimple-fold.c (fold_gimple_assign): Properly build a
null-pointer constant when devirtualizing addresses.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@214141 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimple-fold.c

index ccb3e5181e36e0e4e0605d548f18aac00d214c45..84fc047503bc2a1a3c0e0631275014af4fd3119e 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-19  Richard Biener  <rguenther@suse.de>
+
+       * gimple-fold.c (fold_gimple_assign): Properly build a
+       null-pointer constant when devirtualizing addresses.
+
 2014-07-07  Mark Wielaard  <mjw@redhat.com>
 
        * dwarf2out.c (decl_quals): New function.
index 9afaedf251d2593daec81248750a7179f3322fbf..3c03c01330d6ad008b0795af8c46c7b7373bd389 100644 (file)
@@ -319,14 +319,6 @@ fold_gimple_assign (gimple_stmt_iterator *si)
                  = 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 *si)
                                         "reference to function %s\n",
                                         targets.length () == 1
                                         ? targets[0]->name ()
-                                        : "__builtin_unreachable");
+                                        : "NULL");
                      }
-                   val = fold_convert (TREE_TYPE (val),
-                                       build_fold_addr_expr_loc (loc, fndecl));
-                   STRIP_USELESS_TYPE_CONVERSION (val);
+                   if (targets.length () == 1)
+                     {
+                       val = fold_convert (TREE_TYPE (val),
+                                           build_fold_addr_expr_loc
+                                             (loc, targets[0]->decl));
+                       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;
                  }
              }