[PATCH] Allow to switch off thread-unsafe if-conversion optimizations

Samuel Tardieu sam@rfc1149.net
Sat Oct 27 00:43:00 GMT 2007


Followup of the discussion currently running on gcc@gcc.gnu.org
(-fno-tree-cselim not working?).

The option name may need to be changed for a better one.

2007-10-27  Samuel Tardieu  <sam@rfc1149.net>

	* common.opt: New option -fthread-unsafe-if-conversion
	* ifcvt.c (noce_process_if_block): Do not allow if conversion of
	a test without a else part when -fthread-unsafe-if-conversion is
	set as an unnecessary read+write memory access may introduce a
	race condition.

diff --git a/gcc/common.opt b/gcc/common.opt
index c468b3b..44cfcbd 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1148,6 +1148,11 @@ funsafe-loop-optimizations
 Common Report Var(flag_unsafe_loop_optimizations) Optimization
 Allow loop optimizations to assume that the loops behave in normal way
 
+fthread-unsafe-if-conversion
+Common Report Var(flag_thread_unsafe_if_conversion) Init(1) Optimization
+Allow the compiler to convert some tests in a way that may be unsafe in
+multi-threaded programs.
+
 fassociative-math
 Common Report Var(flag_associative_math)
 Allow optimization for floating-point arithmetic which may change the
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 7810d7e..07dc4d8 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -2319,6 +2319,13 @@ noce_process_if_block (struct noce_if_info *if_info)
     goto success;
   if (! HAVE_conditional_execution)
     {
+      /* If the test to convert has no else part, it is potentially
+	 thread-unsafe as it may introduce an extra read+write of an
+	 otherwise unreferenced variable. Do not convert if the user
+	 asked us not do to so.  */
+      if (if_info->insn_b == NULL_RTX && ! flag_thread_unsafe_if_conversion)
+	return FALSE;
+
       if (noce_try_store_flag_constants (if_info))
 	goto success;
       if (noce_try_addcc (if_info))



More information about the Gcc-patches mailing list