diff mbox

Fix devirt to NULL

Message ID alpine.LSU.2.11.1408191309180.20733@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Aug. 19, 2014, 11:10 a.m. UTC
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  <rguenther@suse.de>

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

Comments

Jan Hubicka Aug. 19, 2014, 1:34 p.m. UTC | #1
> 
> 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;
>  		  }
>  	      }
diff mbox

Patch

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;
 		  }
 	      }