Fix ipa-vrp convert value_range
authorKugan Vivekanandarajah <kuganv@linaro.org>
Tue, 27 Sep 2016 03:41:14 +0000 (03:41 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Tue, 27 Sep 2016 03:41:14 +0000 (03:41 +0000)
gcc/ChangeLog:

2016-09-27  Kugan Vivekanandarajah  <kuganv@linaro.org>

PR ipa/77677
* ipa-prop.c (ipa_compute_jump_functions_for_edge): Use
extract_range_from_unary_expr to convert value_range.
* tree-vrp.c (extract_range_from_unary_expr_1): Rename to.
(extract_range_from_unary_expr): This.
* tree-vrp.h (extract_range_from_unary_expr): Declare.

gcc/testsuite/ChangeLog:

2016-09-27  Kugan Vivekanandarajah  <kuganv@linaro.org>

PR ipa/77677
* gcc.dg/torture/pr77677-2.c: New test.

From-SVN: r240517

gcc/ChangeLog
gcc/ipa-prop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr77677-2.c [new file with mode: 0644]
gcc/tree-vrp.c
gcc/tree-vrp.h

index 55824e5565711d9e4a387dd33ca02bee3ca30658..3e5b0994eae05eb01682fa8c50b911981da4fa6d 100644 (file)
@@ -1,3 +1,12 @@
+2016-09-27  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR ipa/77677
+       * ipa-prop.c (ipa_compute_jump_functions_for_edge): Use
+       extract_range_from_unary_expr to convert value_range.
+       * tree-vrp.c (extract_range_from_unary_expr_1): Rename to.
+       (extract_range_from_unary_expr): This.
+       * tree-vrp.h (extract_range_from_unary_expr): Declare.
+
 2016-09-27  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/rs6000.md (movcc_internal1): Disparage using CTR or LR.
index feecd232afcafcbe47379733ad37a055ec71134a..302a47935a101e09779f28dfe382c00d1adcf6d5 100644 (file)
@@ -1703,13 +1703,23 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
          if (TREE_CODE (arg) == SSA_NAME
              && param_type
              && (type = get_range_info (arg, &min, &max))
-             && (type == VR_RANGE || type == VR_ANTI_RANGE)
-             && (min.get_precision () <= TYPE_PRECISION (param_type)))
+             && (type == VR_RANGE || type == VR_ANTI_RANGE))
            {
-             jfunc->vr_known = true;
-             jfunc->m_vr.type = type;
-             jfunc->m_vr.min = wide_int_to_tree (param_type, min);
-             jfunc->m_vr.max = wide_int_to_tree (param_type, max);
+             value_range vr;
+
+             vr.type = type;
+             vr.min = wide_int_to_tree (TREE_TYPE (arg), min);
+             vr.max = wide_int_to_tree (TREE_TYPE (arg), max);
+             vr.equiv = NULL;
+             extract_range_from_unary_expr (&jfunc->m_vr,
+                                            NOP_EXPR,
+                                            param_type,
+                                            &vr, TREE_TYPE (arg));
+             if (jfunc->m_vr.type == VR_RANGE
+                 || jfunc->m_vr.type == VR_ANTI_RANGE)
+               jfunc->vr_known = true;
+             else
+               jfunc->vr_known = false;
            }
          else
            gcc_assert (!jfunc->vr_known);
index 446848f2760ecfeea470661ea41775fa90d51b6e..4b24d64eac4c43a952c16272f32d3dbac4680627 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-27  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       PR ipa/77677
+       * gcc.dg/torture/pr77677-2.c: New test.
+
 2016-09-26  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/77420
diff --git a/gcc/testsuite/gcc.dg/torture/pr77677-2.c b/gcc/testsuite/gcc.dg/torture/pr77677-2.c
new file mode 100644 (file)
index 0000000..b586d7a
--- /dev/null
@@ -0,0 +1,17 @@
+/* PR ipa/77677 */
+/* { dg-do compile } */
+/* { dg-options "-w" } */
+
+enum machine_mode { MAX_MACHINE_MODE };
+
+struct {
+  int mode : 8;
+} a;
+int b;
+
+static int fn1();
+
+void fn2() { fn1(a, a.mode); }
+
+int fn1(a, mode) enum machine_mode mode;
+{ int c = b = c; }
index 3c75a0d98852854a80cef104be02e9a888450842..35c06b8ac4de3adbb6956064086df44e7fda76f9 100644 (file)
@@ -3281,10 +3281,10 @@ extract_range_from_binary_expr (value_range *vr,
    the range of its operand *VR0 with type OP0_TYPE with resulting type TYPE.
    The resulting range is stored in *VR.  */
 
-static void
-extract_range_from_unary_expr_1 (value_range *vr,
-                                enum tree_code code, tree type,
-                                value_range *vr0_, tree op0_type)
+void
+extract_range_from_unary_expr (value_range *vr,
+                              enum tree_code code, tree type,
+                              value_range *vr0_, tree op0_type)
 {
   value_range vr0 = *vr0_, vrtem0 = VR_INITIALIZER, vrtem1 = VR_INITIALIZER;
 
@@ -3337,12 +3337,12 @@ extract_range_from_unary_expr_1 (value_range *vr,
   if (vr0.type == VR_ANTI_RANGE
       && ranges_from_anti_range (&vr0, &vrtem0, &vrtem1))
     {
-      extract_range_from_unary_expr_1 (vr, code, type, &vrtem0, op0_type);
+      extract_range_from_unary_expr (vr, code, type, &vrtem0, op0_type);
       if (vrtem1.type != VR_UNDEFINED)
        {
          value_range vrres = VR_INITIALIZER;
-         extract_range_from_unary_expr_1 (&vrres, code, type,
-                                          &vrtem1, op0_type);
+         extract_range_from_unary_expr (&vrres, code, type,
+                                        &vrtem1, op0_type);
          vrp_meet (vr, &vrres);
        }
       return;
@@ -3597,7 +3597,7 @@ extract_range_from_unary_expr (value_range *vr, enum tree_code code,
   else
     set_value_range_to_varying (&vr0);
 
-  extract_range_from_unary_expr_1 (vr, code, type, &vr0, TREE_TYPE (op0));
+  extract_range_from_unary_expr (vr, code, type, &vr0, TREE_TYPE (op0));
 }
 
 
index 7ffb7e76a13de43d2e3bc0379e077b9b3c9d2669..5cea7094909683eecb7c177b2c68fd9f9009659c 100644 (file)
@@ -51,4 +51,9 @@ struct GTY(()) value_range
 extern void vrp_intersect_ranges (value_range *vr0, value_range *vr1);
 extern void vrp_meet (value_range *vr0, const value_range *vr1);
 extern void dump_value_range (FILE *, const value_range *);
+extern void extract_range_from_unary_expr (value_range *vr,
+                                          enum tree_code code,
+                                          tree type,
+                                          value_range *vr0_,
+                                          tree op0_type);