phiopt: Avoid -fcompare-debug bug in phiopt [PR94211]
authorJakub Jelinek <jakub@redhat.com>
Thu, 19 Mar 2020 09:24:16 +0000 (10:24 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 19 Mar 2020 09:24:16 +0000 (10:24 +0100)
Two years ago, I've added support for up to 2 simple preparation statements
in value_replacement, but the
-      && estimate_num_insns (assign, &eni_time_weights)
+      && estimate_num_insns (bb_seq (middle_bb), &eni_time_weights)
change, meant that we compute the cost of all those statements rather than
just the single assign that has been the single supported non-debug
statement in the bb before, doesn't do what I thought would do, gimple_seq
is just gimple * and thus it can't be really overloaded depending on whether
we pass a single gimple * or a whole sequence.  Which means in the last
two years it doesn't count all the statements, but only the first one.
With -g that happens to be a DEBUG_STMT, or it could be e.g. the first
preparation statement which could be much cheaper than the actual assign.

2020-03-19  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/94211
* tree-ssa-phiopt.c (value_replacement): Use estimate_num_insns_seq
instead of estimate_num_insns for bb_seq (middle_bb).  Rename
emtpy_or_with_defined_p variable to empty_or_with_defined_p, adjust
all uses.

* gcc.dg/pr94211.c: New test.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr94211.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.c

index c91c73a663947b130e976820c4142a3b96dcf3cb..259d4aed103915a105664f6b1defe975a7b92dba 100644 (file)
@@ -1,3 +1,11 @@
+2020-03-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/94211
+       * tree-ssa-phiopt.c (value_replacement): Use estimate_num_insns_seq
+       instead of estimate_num_insns for bb_seq (middle_bb).  Rename
+       emtpy_or_with_defined_p variable to empty_or_with_defined_p, adjust
+       all uses.
+
 2020-03-19  Richard Biener  <rguenther@suse.de>
 
        PR ipa/94217
index e828b7f9c9ae7c977c4d5c4d9c077e49056cbbe0..58f2e7e7c47b6e3095f18fde11f30050322f1170 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/94211
+       * gcc.dg/pr94211.c: New test.
+
 2020-03-19  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/94216
diff --git a/gcc/testsuite/gcc.dg/pr94211.c b/gcc/testsuite/gcc.dg/pr94211.c
new file mode 100644 (file)
index 0000000..3e160e4
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR tree-optimization/94211 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fcompare-debug" } */
+
+long
+foo (long a, long b)
+{
+  if (__builtin_expect (b == 1, 1))
+    return a;
+  int e = a + 1;
+  return a / b;
+}
index 947143b8da447388368c9c99e1c360873ed8c560..969311880a93519865c38fc47c2edd16162dad4f 100644 (file)
@@ -1056,7 +1056,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
   gimple *cond;
   edge true_edge, false_edge;
   enum tree_code code;
-  bool emtpy_or_with_defined_p = true;
+  bool empty_or_with_defined_p = true;
 
   /* If the type says honor signed zeros we cannot do this
      optimization.  */
@@ -1075,7 +1075,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
        {
          if (gimple_code (stmt) != GIMPLE_PREDICT
              && gimple_code (stmt) != GIMPLE_NOP)
-           emtpy_or_with_defined_p = false;
+           empty_or_with_defined_p = false;
          continue;
        }
       /* Now try to adjust arg0 or arg1 according to the computation
@@ -1085,7 +1085,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
             && jump_function_from_stmt (&arg0, stmt))
            || (lhs == arg1
                && jump_function_from_stmt (&arg1, stmt)))
-       emtpy_or_with_defined_p = false;
+       empty_or_with_defined_p = false;
     }
 
   cond = last_stmt (cond_bb);
@@ -1137,7 +1137,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
       /* If the middle basic block was empty or is defining the
         PHI arguments and this is a single phi where the args are different
         for the edges e0 and e1 then we can remove the middle basic block. */
-      if (emtpy_or_with_defined_p
+      if (empty_or_with_defined_p
          && single_non_singleton_phi_for_edges (phi_nodes (gimple_bb (phi)),
                                                 e0, e1) == phi)
        {
@@ -1255,7 +1255,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
       && profile_status_for_fn (cfun) != PROFILE_ABSENT
       && EDGE_PRED (middle_bb, 0)->probability < profile_probability::even ()
       /* If assign is cheap, there is no point avoiding it.  */
-      && estimate_num_insns (bb_seq (middle_bb), &eni_time_weights)
+      && estimate_num_insns_seq (bb_seq (middle_bb), &eni_time_weights)
         >= 3 * estimate_num_insns (cond, &eni_time_weights))
     return 0;