re PR debug/80453 (another compare-debug failure)
authorRichard Biener <rguenther@suse.de>
Thu, 20 Apr 2017 14:23:10 +0000 (14:23 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 20 Apr 2017 14:23:10 +0000 (14:23 +0000)
2017-04-20  Richard Biener  <rguenther@suse.de>

PR tree-optimization/80453
* tree-ssa-sccvn.h (struct vn_phi_s): Add cclhs and ccrhs members.
* tree-ssa-sccvn.c (cond_stmts_equal_p): Use recorded lhs and rhs
from the conditions.
(vn_phi_eq): Pass them down.
(vn_phi_lookup): Record them.
(vn_phi_insert): Likewise.

From-SVN: r247024

gcc/ChangeLog
gcc/tree-ssa-sccvn.c
gcc/tree-ssa-sccvn.h

index 80d343615b2f48624ac4c4d4fec06120509acb7f..97fb5f36a8b9bcbc993b6a07d17d0f3954d597b4 100644 (file)
@@ -1,3 +1,13 @@
+2017-04-20  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/80453
+       * tree-ssa-sccvn.h (struct vn_phi_s): Add cclhs and ccrhs members.
+       * tree-ssa-sccvn.c (cond_stmts_equal_p): Use recorded lhs and rhs
+       from the conditions.
+       (vn_phi_eq): Pass them down.
+       (vn_phi_lookup): Record them.
+       (vn_phi_insert): Likewise.
+
 2017-04-20  Matthew Fortune  <matthew.fortune@imgtec.com>
 
        * config/mips/mips.c (mips_expand_vec_perm_const): Re-fix
index bce247a1489b10ddcc2089c9b1f7c1150fad126f..36386cf3e605e3a997fc09e12cf7e2093844a26f 100644 (file)
@@ -2916,14 +2916,11 @@ vn_phi_compute_hash (vn_phi_t vp1)
    the other.  */
 
 static bool
-cond_stmts_equal_p (gcond *cond1, gcond *cond2, bool *inverted_p)
+cond_stmts_equal_p (gcond *cond1, tree lhs1, tree rhs1,
+                   gcond *cond2, tree lhs2, tree rhs2, bool *inverted_p)
 {
   enum tree_code code1 = gimple_cond_code (cond1);
   enum tree_code code2 = gimple_cond_code (cond2);
-  tree lhs1 = gimple_cond_lhs (cond1);
-  tree lhs2 = gimple_cond_lhs (cond2);
-  tree rhs1 = gimple_cond_rhs (cond1);
-  tree rhs2 = gimple_cond_rhs (cond2);
 
   *inverted_p = false;
   if (code1 == code2)
@@ -2941,10 +2938,6 @@ cond_stmts_equal_p (gcond *cond1, gcond *cond2, bool *inverted_p)
   else
     return false;
 
-  lhs1 = vn_valueize (lhs1);
-  rhs1 = vn_valueize (rhs1);
-  lhs2 = vn_valueize (lhs2);
-  rhs2 = vn_valueize (rhs2);
   return ((expressions_equal_p (lhs1, lhs2)
           && expressions_equal_p (rhs1, rhs2))
          || (commutative_tree_code (code1)
@@ -3002,7 +2995,10 @@ vn_phi_eq (const_vn_phi_t const vp1, const_vn_phi_t const vp2)
              return false;
            bool inverted_p;
            if (! cond_stmts_equal_p (as_a <gcond *> (last1),
-                                     as_a <gcond *> (last2), &inverted_p))
+                                     vp1->cclhs, vp1->ccrhs,
+                                     as_a <gcond *> (last2),
+                                     vp2->cclhs, vp2->ccrhs,
+                                     &inverted_p))
              return false;
 
            /* Get at true/false controlled edges into the PHI.  */
@@ -3081,6 +3077,16 @@ vn_phi_lookup (gimple *phi)
   vp1.type = TREE_TYPE (gimple_phi_result (phi));
   vp1.phiargs = shared_lookup_phiargs;
   vp1.block = gimple_bb (phi);
+  /* Extract values of the controlling condition.  */
+  vp1.cclhs = NULL_TREE;
+  vp1.ccrhs = NULL_TREE;
+  basic_block idom1 = get_immediate_dominator (CDI_DOMINATORS, vp1.block);
+  if (EDGE_COUNT (idom1->succs) == 2)
+    if (gcond *last1 = dyn_cast <gcond *> (last_stmt (idom1)))
+      {
+       vp1.cclhs = vn_valueize (gimple_cond_lhs (last1));
+       vp1.ccrhs = vn_valueize (gimple_cond_rhs (last1));
+      }
   vp1.hashcode = vn_phi_compute_hash (&vp1);
   slot = current_info->phis->find_slot_with_hash (&vp1, vp1.hashcode,
                                                  NO_INSERT);
@@ -3117,6 +3123,16 @@ vn_phi_insert (gimple *phi, tree result)
   vp1->type = TREE_TYPE (gimple_phi_result (phi));
   vp1->phiargs = args;
   vp1->block = gimple_bb (phi);
+  /* Extract values of the controlling condition.  */
+  vp1->cclhs = NULL_TREE;
+  vp1->ccrhs = NULL_TREE;
+  basic_block idom1 = get_immediate_dominator (CDI_DOMINATORS, vp1->block);
+  if (EDGE_COUNT (idom1->succs) == 2)
+    if (gcond *last1 = dyn_cast <gcond *> (last_stmt (idom1)))
+      {
+       vp1->cclhs = vn_valueize (gimple_cond_lhs (last1));
+       vp1->ccrhs = vn_valueize (gimple_cond_rhs (last1));
+      }
   vp1->result = result;
   vp1->hashcode = vn_phi_compute_hash (vp1);
 
index 4e63ad746c631082c104aba67ad5ddbafbdf4f0f..ec00c37cca2b7b80b80d7204f42a8023cf2f2f1c 100644 (file)
@@ -67,6 +67,9 @@ typedef struct vn_phi_s
   hashval_t hashcode;
   vec<tree> phiargs;
   basic_block block;
+  /* Controlling condition lhs/rhs.  */
+  tree cclhs;
+  tree ccrhs;
   tree type;
   tree result;
 } *vn_phi_t;