Be more careful about barriers when speculating conditional stores.
authorBernd Schmidt <bernds@redhat.com>
Fri, 27 Nov 2015 10:05:36 +0000 (10:05 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Fri, 27 Nov 2015 10:05:36 +0000 (10:05 +0000)
* gimple.h (nonbarrier_call_p): Declare.
* gimple.c (nonbarrier_call_p): New function.
* tree-ssa-phiopt.c (nontrapping_dom_walker::before_dom_children):
Also increment call phase for ASMs with vdef and potential barrier
calls.

From-SVN: r231005

gcc/ChangeLog
gcc/gimple.c
gcc/gimple.h
gcc/tree-ssa-phiopt.c

index 4510240eb22aae003e65097ca8da7cb182156b38..e9fbabf667172df8dc5a5fce38d6177cdfef5e14 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-27  Bernd Schmidt  <bschmidt@redhat.com>
+
+       * gimple.h (nonbarrier_call_p): Declare.
+       * gimple.c (nonbarrier_call_p): New function.
+       * tree-ssa-phiopt.c (nontrapping_dom_walker::before_dom_children):
+       Also increment call phase for ASMs with vdef and potential barrier
+       calls.
+
 2015-11-27  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * ifcvt.c (insn_valid_noce_process_p): Reject insn if it satisfies
index 2764df8818600a19f9bfc749ab6011caedd7be84..bf552a7ae9cd44e0daf828b97c3100e0cb13edbd 100644 (file)
@@ -2636,6 +2636,18 @@ nonfreeing_call_p (gimple *call)
   return n->nonfreeing_fn;
 }
 
+/* Return true when CALL is a call stmt that definitely need not
+   be considered to be a memory barrier.  */
+bool
+nonbarrier_call_p (gimple *call)
+{
+  if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
+    return true;
+  /* Should extend this to have a nonbarrier_fn flag, just as above in
+     the nonfreeing case.  */
+  return false;
+}
+
 /* Callback for walk_stmt_load_store_ops.
  
    Return TRUE if OP will dereference the tree stored in DATA, FALSE
index 6eb22de1e5e42abba5b2cae14e4c69efab418522..0b04804ce4607828f25422a31e99a0bb9a4112ae 100644 (file)
@@ -1507,6 +1507,7 @@ extern bool gimple_call_builtin_p (const gimple *, enum built_in_function);
 extern bool gimple_asm_clobbers_memory_p (const gasm *);
 extern void dump_decl_set (FILE *, bitmap);
 extern bool nonfreeing_call_p (gimple *);
+extern bool nonbarrier_call_p (gimple *);
 extern bool infer_nonnull_range (gimple *, tree);
 extern bool infer_nonnull_range_by_dereference (gimple *, tree);
 extern bool infer_nonnull_range_by_attribute (gimple *, tree);
index 02d5aa010c317627a47b771e513ebc81580710f6..344cd2f27012b18282dbe49302aed1632513f508 100644 (file)
@@ -1519,7 +1519,9 @@ nontrapping_dom_walker::before_dom_children (basic_block bb)
     {
       gimple *stmt = gsi_stmt (gsi);
 
-      if (is_gimple_call (stmt) && !nonfreeing_call_p (stmt))
+      if ((gimple_code (stmt) == GIMPLE_ASM && gimple_vdef (stmt))
+         || (is_gimple_call (stmt)
+             && (!nonfreeing_call_p (stmt) || !nonbarrier_call_p (stmt))))
        nt_call_phase++;
       else if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
        {