Message ID | alpine.LSU.2.11.1408191309180.20733@zhemvz.fhfr.qr |
---|---|
State | New |
Headers | show |
> > This fixes Honzas previous commit to not build &integer_zero_node (what?). Oops, thanks! Honza > > Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. > > Richard. > > 2014-08-19 Richard Biener <rguenther@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; > } > }
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; } }