]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[PR68083] don't introduce undefined behavior in ifcombine
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 3 Nov 2015 00:30:07 +0000 (00:30 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 3 Nov 2015 00:30:07 +0000 (00:30 +0000)
The ifcombine pass may move a conditional access to an uninitialized
value before the condition that ensures it is always well-defined,
thus introducing undefined behavior.  Stop it from doing so.

for  gcc/ChangeLog

PR tree-optimization/68083
* tree-ssa-ifcombine.c: Include tree-ssa.h.
(bb_no_side_effects_p): Test for undefined uses too.
* tree-ssa.c (gimple_uses_undefined_value_p): New.
* tree-ssa.h (gimple_uses_undefined_value_p): Declare.

for  gcc/testsuite/ChangeLog

PR tree-optimization/68083
* gcc.dg/torture/pr68083.c: New.  From Zhendong Su.

From-SVN: r229690

ChangeLog
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr68083.c [new file with mode: 0644]
gcc/tree-ssa-ifcombine.c
gcc/tree-ssa.c
gcc/tree-ssa.h

index 9ff868fcb584ea24ef9e29a66de119457d70c1e7..a82a792435b8a0a6c71f1e6a7608b2802d8cab57 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-11-02  Alexandre Oliva <aoliva@redhat.com>
+
+       PR tree-optimization/68083
+       * tree-ssa-ifcombine.c: Include tree-ssa.h.
+       (bb_no_side_effects_p): Test for undefined uses too.
+       * tree-ssa.c (gimple_uses_undefined_value_p): New.
+       * tree-ssa.h (gimple_uses_undefined_value_p): Declare.
+
 2015-10-23  Steve Ellcey  <sellcey@imgtec.com>
 
        * MAINTAINERS: Update email address.
index 6a7d988c626d4aff8b8e92a28a6bab7b54bb0a69..84cad3f59b75177436693bffb1b1df5758abdf81 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-02  Alexandre Oliva <aoliva@redhat.com>
+
+       PR tree-optimization/68083
+       * tree-ssa-ifcombine.c: Include tree-ssa.h.
+       (bb_no_side_effects_p): Test for undefined uses too.
+       * tree-ssa.c (gimple_uses_undefined_value_p): New.
+       * tree-ssa.h (gimple_uses_undefined_value_p): Declare.
+
 2015-11-02  Jeff Law <jeff@redhat.com>
 
        * tree-ssa-threadupdate.c (valid_jump_thread_path): Also detect
index 3dc4edcfd971d4fcf6d5e3fbff2a978a790610e1..74a0c1aa0b333ae1bfcef55ca3aa4740cf86a9a6 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-02  Alexandre Oliva <aoliva@redhat.com>
+
+       PR tree-optimization/68083
+       * gcc.dg/torture/pr68083.c: New.  From Zhendong Su.
+
 2015-11-02  Jeff Law  <law@redhat.com>
 
        * gcc.dg/tree-ssa/ssa-thread-11.c: Verify that we do not have
diff --git a/gcc/testsuite/gcc.dg/torture/pr68083.c b/gcc/testsuite/gcc.dg/torture/pr68083.c
new file mode 100644 (file)
index 0000000..ae24781
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do run } */
+
+int a = 2, b = 1, c = 1;
+
+int
+fn1 ()
+{
+  int d;
+  for (; a; a--)
+    {
+      for (d = 0; d < 4; d++)
+       {
+         int k;
+         if (c < 1)
+           if (k)
+             c = 0;
+         if (b)
+           continue;
+         return 0;
+       }
+      b = !1;
+    }
+  return 0;
+}
+
+int
+main ()
+{
+  fn1 ();
+
+  if (a != 1)
+    __builtin_abort ();
+
+  return 0;
+}
index b812d9a8fc501208970346cf2a771fcdcaae320e..c18de7e607e087a97e9aef77fc73bee3e038f843 100644 (file)
@@ -38,6 +38,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimple-iterator.h"
 #include "gimplify-me.h"
 #include "tree-cfg.h"
+#include "tree-ssa.h"
 
 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
 #define LOGICAL_OP_NON_SHORT_CIRCUIT \
@@ -122,6 +123,7 @@ bb_no_side_effects_p (basic_block bb)
        continue;
 
       if (gimple_has_side_effects (stmt)
+         || gimple_uses_undefined_value_p (stmt)
          || gimple_could_trap_p (stmt)
          || gimple_vuse (stmt))
        return false;
index 20e05ad31b60609631fab73966f71387cdab90e0..84a4d5b9495897dc2726decf0df9dd91ecb85c00 100644 (file)
@@ -1203,6 +1203,24 @@ ssa_undefined_value_p (tree t, bool partial)
 }
 
 
+/* Return TRUE iff STMT, a gimple statement, references an undefined
+   SSA name.  */
+
+bool
+gimple_uses_undefined_value_p (gimple *stmt)
+{
+  ssa_op_iter iter;
+  tree op;
+
+  FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
+    if (ssa_undefined_value_p (op))
+      return true;
+
+  return false;
+}
+
+
+
 /* If necessary, rewrite the base of the reference tree *TP from
    a MEM_REF to a plain or converted symbol.  */
 
index 5a409e5f5d5beef82360f03ecd5d45e226bfc929..3b5bd706593e2ca57a9230f88221922c78c62a10 100644 (file)
@@ -51,6 +51,7 @@ extern bool tree_ssa_useless_type_conversion (tree);
 extern tree tree_ssa_strip_useless_type_conversions (tree);
 
 extern bool ssa_undefined_value_p (tree, bool = true);
+extern bool gimple_uses_undefined_value_p (gimple *);
 extern void execute_update_addresses_taken (void);
 
 /* Given an edge_var_map V, return the PHI arg definition.  */