vr-values.h (get_output_for_vrp): Prototype.
authorJeff Law <law@redhat.com>
Fri, 17 Nov 2017 16:25:22 +0000 (09:25 -0700)
committerJeff Law <law@gcc.gnu.org>
Fri, 17 Nov 2017 16:25:22 +0000 (09:25 -0700)
* vr-values.h (get_output_for_vrp): Prototype.
* vr-values.c (get_output_for_vrp): New function extracted from
vrp_visit_assignment_or_call and extract_range_from_stmt.
(vrp_visit_assignment_or_call): Use get_output_for_vrp.  Simplify.

From-SVN: r254880

gcc/ChangeLog
gcc/vr-values.c
gcc/vr-values.h

index 38101fa35502cc1638674c814f0224c8d36d248d..82111ba9c2f29df53dd51ca1ca201dbddcb5c43f 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-17  Jeff Law  <law@redhat.com>
+
+       * vr-values.h (get_output_for_vrp): Prototype.
+       * vr-values.c (get_output_for_vrp): New function extracted from
+       vrp_visit_assignment_or_call and extract_range_from_stmt.
+       (vrp_visit_assignment_or_call): Use get_output_for_vrp.  Simplify.
+
 2017-11-17  Luis Machado  <luis.machado@linaro.org>
 
        * config/aarch64/aarch64.c
index d4434ded75dfd0977bb0d72fdf8cdcfa533b0ad8..3e760a378fcd77676e9fa75e0682c0e63bc4ac1e 100644 (file)
@@ -1955,19 +1955,18 @@ vrp_valueize_1 (tree name)
     }
   return name;
 }
-/* Visit assignment STMT.  If it produces an interesting range, record
-   the range in VR and set LHS to OUTPUT_P.  */
 
-void
-vr_values::vrp_visit_assignment_or_call (gimple *stmt, tree *output_p,
-                                        value_range *vr)
+/* Given STMT, an assignment or call, return its LHS if the type
+   of the LHS is suitable for VRP analysis, else return NULL_TREE.  */
+
+tree
+get_output_for_vrp (gimple *stmt)
 {
-  tree lhs;
-  enum gimple_code code = gimple_code (stmt);
-  lhs = gimple_get_lhs (stmt);
-  *output_p = NULL_TREE;
+  if (!is_gimple_assign (stmt) && !is_gimple_call (stmt))
+    return NULL_TREE;
 
   /* We only keep track of ranges in integral and pointer types.  */
+  tree lhs = gimple_get_lhs (stmt);
   if (TREE_CODE (lhs) == SSA_NAME
       && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
           /* It is valid to have NULL MIN/MAX values on a type.  See
@@ -1975,8 +1974,25 @@ vr_values::vrp_visit_assignment_or_call (gimple *stmt, tree *output_p,
           && TYPE_MIN_VALUE (TREE_TYPE (lhs))
           && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
          || POINTER_TYPE_P (TREE_TYPE (lhs))))
+    return lhs;
+
+  return NULL_TREE;
+}
+
+/* Visit assignment STMT.  If it produces an interesting range, record
+   the range in VR and set LHS to OUTPUT_P.  */
+
+void
+vr_values::vrp_visit_assignment_or_call (gimple *stmt, tree *output_p,
+                                        value_range *vr)
+{
+  tree lhs = get_output_for_vrp (stmt);
+  *output_p = lhs;
+
+  /* We only keep track of ranges in integral and pointer types.  */
+  if (lhs)
     {
-      *output_p = lhs;
+      enum gimple_code code = gimple_code (stmt);
 
       /* Try folding the statement to a constant first.  */
       x_vr_values = this;
index 20bd6c57a6ce7be5d7c316b6e8e2e3b975edbecb..24f013a940258d9e50c94e59dd227475c78d65c9 100644 (file)
@@ -118,4 +118,5 @@ class vr_values
 
 #define VR_INITIALIZER { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL }
 
+extern tree get_output_for_vrp (gimple *);
 #endif /* GCC_VR_VALUES_H */