ipa-cp.c (propagate_vr_across_jump_function): Propagate also across binary operations.
authorJan Hubicka <hubicka@ucw.cz>
Wed, 13 Nov 2019 23:40:49 +0000 (00:40 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 13 Nov 2019 23:40:49 +0000 (23:40 +0000)
* ipa-cp.c (propagate_vr_across_jump_function): Propagate also across
binary operations.

From-SVN: r278185

gcc/ChangeLog
gcc/ipa-cp.c

index b41e6969ff6a54be5313a90e44b4b7951123746f..1bc627a111dd4ee8ece55664e63c794231d8bb1b 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-13  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-cp.c (propagate_vr_across_jump_function): Propagate also across
+       binary operations.
+
 2019-11-13  Jan Hubicka  <hubicka@ucw.cz>
 
        * ipa-profile.c (check_argument_count): Check properly that e_info
index 6acfb2ba58a1d3eb49b60a7439104b0a31ee0788..36cac5f012ce6637b27c908cca834449ad494e27 100644 (file)
@@ -1975,23 +1975,51 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc,
   if (jfunc->type == IPA_JF_PASS_THROUGH)
     {
       enum tree_code operation = ipa_get_jf_pass_through_operation (jfunc);
+      class ipa_node_params *caller_info = IPA_NODE_REF (cs->caller);
+      int src_idx = ipa_get_jf_pass_through_formal_id (jfunc);
+      class ipcp_param_lattices *src_lats
+       = ipa_get_parm_lattices (caller_info, src_idx);
+      tree operand_type = ipa_get_type (caller_info, src_idx);
+
+      if (src_lats->m_value_range.bottom_p ())
+       return dest_lat->set_to_bottom ();
 
+      value_range vr;
       if (TREE_CODE_CLASS (operation) == tcc_unary)
        {
-         class ipa_node_params *caller_info = IPA_NODE_REF (cs->caller);
-         int src_idx = ipa_get_jf_pass_through_formal_id (jfunc);
-         tree operand_type = ipa_get_type (caller_info, src_idx);
-         class ipcp_param_lattices *src_lats
-           = ipa_get_parm_lattices (caller_info, src_idx);
-
-         if (src_lats->m_value_range.bottom_p ())
-           return dest_lat->set_to_bottom ();
-         value_range vr;
-         if (ipa_vr_operation_and_type_effects (&vr,
-                                                &src_lats->m_value_range.m_vr,
-                                                operation, param_type,
-                                                operand_type))
-           return dest_lat->meet_with (&vr);
+         ipa_vr_operation_and_type_effects (&vr,
+                                            &src_lats->m_value_range.m_vr,
+                                            operation, param_type,
+                                            operand_type);
+       }
+      /* A crude way to prevent unbounded number of value range updates
+        in SCC components.  We should allow limited number of updates within
+        SCC, too.  */
+      else if (!ipa_edge_within_scc (cs))
+       {
+         tree op = ipa_get_jf_pass_through_operand (jfunc);
+         value_range op_vr (op, op);
+         value_range op_res,res;
+
+         range_fold_binary_expr (&op_res, operation, operand_type,
+                                 &src_lats->m_value_range.m_vr, &op_vr);
+         ipa_vr_operation_and_type_effects (&vr,
+                                            &op_res,
+                                            NOP_EXPR, param_type,
+                                            operand_type);
+       }
+      if (!vr.undefined_p () && !vr.varying_p ())
+       {
+         if (jfunc->m_vr)
+           {
+             value_range jvr;
+             if (ipa_vr_operation_and_type_effects (&jvr, jfunc->m_vr,
+                                                    NOP_EXPR,
+                                                    param_type,
+                                                    jfunc->m_vr->type ()))
+               vr.intersect (*jfunc->m_vr);
+           }
+         return dest_lat->meet_with (&vr);
        }
     }
   else if (jfunc->type == IPA_JF_CONST)