phiopt: Improve value_replacement maybe equal phires range handling
authorJakub Jelinek <jakub@redhat.com>
Fri, 23 Dec 2022 15:19:08 +0000 (16:19 +0100)
committerJakub Jelinek <jakub@redhat.com>
Fri, 23 Dec 2022 15:19:08 +0000 (16:19 +0100)
My previous patch added throwing away of SSA_NAME_RANGE_INFO of
phires when we have phires = x != carg ? x : oarg, but that could
throw away useful range info, all we need is merge phires current
range info with the carg constant which can newly appear there
(and the optimization proved the single user doesn't care about that).

2022-12-23  Jakub Jelinek  <jakub@redhat.com>
    Aldy Hernandez  <aldyh@redhat.com>

* tree-ssa-phiopt.cc (value_replacement): Instead of resetting
phires range info, union it with carg.

gcc/tree-ssa-phiopt.cc

index 906b406..59dc21c 100644 (file)
@@ -1492,11 +1492,25 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
                    break;
                  }
              if (equal_p)
-               /* After the optimization PHI result can have value
-                  which it couldn't have previously.
-                  We could instead of resetting it union the range
-                  info with oarg.  */
-               reset_flow_sensitive_info (gimple_phi_result (phi));
+               {
+                 tree phires = gimple_phi_result (phi);
+                 if (SSA_NAME_RANGE_INFO (phires))
+                   {
+                     /* After the optimization PHI result can have value
+                        which it couldn't have previously.  */
+                     int_range_max r;
+                     if (get_global_range_query ()->range_of_expr (r, phires,
+                                                                   phi))
+                       {
+                         int_range<2> tmp (carg, carg);
+                         r.union_ (tmp);
+                         reset_flow_sensitive_info (phires);
+                         set_range_info (phires, r);
+                       }
+                     else
+                       reset_flow_sensitive_info (phires);
+                   }
+               }
              if (equal_p && MAY_HAVE_DEBUG_BIND_STMTS)
                {
                  imm_use_iterator imm_iter;