From f8719680bfd5adf14aa91ce3017d59f7eac7f64e Mon Sep 17 00:00:00 2001
From: Alexandre Oliva <aoliva@redhat.com>
Date: Wed, 24 Oct 2018 21:55:39 +0000
Subject: [PATCH] gOlogy: do not change code in isolate-paths for warnings only

The isolate-paths pass is activated by various -f flags, but also by
-Wnull-dereference.  Most of its codegen changes are conditioned on at
least one of the -f flags, but those that detect, warn about and
isolate paths that return the address of local variables are enabled
even if the pass is activated only by -Wnull-dereference.

-W flags should not cause codegen changes, so this patch makes the
codegen changes conditional on the presence of any of the -f flags
that activate the pass.  Should we have a separate option to activate
only this kind of transformation?

for  gcc/ChangeLog

	* gimple-ssa-isolate-paths.c
	(find_implicit_erroneous_behavior): Do not change code if the
	pass is running for warnings only.
	(find_explicit_erroneous_behavior): Likewise.

From-SVN: r265473
---
 gcc/ChangeLog                  |  7 +++++++
 gcc/gimple-ssa-isolate-paths.c | 17 +++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f7faf892a9dc..fdfca8ba6bc3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-10-24  Alexandre Oliva <aoliva@redhat.com>
+
+	* gimple-ssa-isolate-paths.c
+	(find_implicit_erroneous_behavior): Do not change code if the
+	pass is running for warnings only.
+	(find_explicit_erroneous_behavior): Likewise.
+
 2018-10-24  Michael Meissner  <meissner@linux.ibm.com>
 
 	* config/rs6000/rs6000.c (TARGET_MANGLE_DECL_ASSEMBLER_NAME):
diff --git a/gcc/gimple-ssa-isolate-paths.c b/gcc/gimple-ssa-isolate-paths.c
index e1fab61bedab..880836c21aa7 100644
--- a/gcc/gimple-ssa-isolate-paths.c
+++ b/gcc/gimple-ssa-isolate-paths.c
@@ -431,7 +431,9 @@ find_implicit_erroneous_behavior (void)
 					"declared here");
 			  }
 
-			  if (gimple_bb (use_stmt) == bb)
+			  if ((flag_isolate_erroneous_paths_dereference
+			       || flag_isolate_erroneous_paths_attribute)
+			      && gimple_bb (use_stmt) == bb)
 			    {
 			      duplicate = isolate_path (bb, duplicate, e,
 							use_stmt, lhs, true);
@@ -553,9 +555,16 @@ find_explicit_erroneous_behavior (void)
 			  inform (DECL_SOURCE_LOCATION(valbase),
 				  "declared here");
 		      }
-		      tree zero = build_zero_cst (TREE_TYPE (val));
-		      gimple_return_set_retval (return_stmt, zero);
-		      update_stmt (stmt);
+
+		      /* Do not modify code if the user only asked for
+			 warnings.  */
+		      if (flag_isolate_erroneous_paths_dereference
+			  || flag_isolate_erroneous_paths_attribute)
+			{
+			  tree zero = build_zero_cst (TREE_TYPE (val));
+			  gimple_return_set_retval (return_stmt, zero);
+			  update_stmt (stmt);
+			}
 		    }
 		}
 	    }
-- 
GitLab