Commit 3a4228ba by Kugan Vivekanandarajah Committed by Kugan Vivekanandarajah

Fix ipa-vrp convert value_range

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
parent 963da599
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> 2016-09-27 Segher Boessenkool <segher@kernel.crashing.org>
* config/rs6000/rs6000.md (movcc_internal1): Disparage using CTR or LR. * config/rs6000/rs6000.md (movcc_internal1): Disparage using CTR or LR.
......
...@@ -1703,13 +1703,23 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi, ...@@ -1703,13 +1703,23 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
if (TREE_CODE (arg) == SSA_NAME if (TREE_CODE (arg) == SSA_NAME
&& param_type && param_type
&& (type = get_range_info (arg, &min, &max)) && (type = get_range_info (arg, &min, &max))
&& (type == VR_RANGE || type == VR_ANTI_RANGE) && (type == VR_RANGE || type == VR_ANTI_RANGE))
&& (min.get_precision () <= TYPE_PRECISION (param_type))) {
{ 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; jfunc->vr_known = true;
jfunc->m_vr.type = type; else
jfunc->m_vr.min = wide_int_to_tree (param_type, min); jfunc->vr_known = false;
jfunc->m_vr.max = wide_int_to_tree (param_type, max);
} }
else else
gcc_assert (!jfunc->vr_known); gcc_assert (!jfunc->vr_known);
......
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> 2016-09-26 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/77420 PR fortran/77420
......
/* 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; }
...@@ -3281,8 +3281,8 @@ extract_range_from_binary_expr (value_range *vr, ...@@ -3281,8 +3281,8 @@ extract_range_from_binary_expr (value_range *vr,
the range of its operand *VR0 with type OP0_TYPE with resulting type TYPE. the range of its operand *VR0 with type OP0_TYPE with resulting type TYPE.
The resulting range is stored in *VR. */ The resulting range is stored in *VR. */
static void void
extract_range_from_unary_expr_1 (value_range *vr, extract_range_from_unary_expr (value_range *vr,
enum tree_code code, tree type, enum tree_code code, tree type,
value_range *vr0_, tree op0_type) value_range *vr0_, tree op0_type)
{ {
...@@ -3337,11 +3337,11 @@ extract_range_from_unary_expr_1 (value_range *vr, ...@@ -3337,11 +3337,11 @@ extract_range_from_unary_expr_1 (value_range *vr,
if (vr0.type == VR_ANTI_RANGE if (vr0.type == VR_ANTI_RANGE
&& ranges_from_anti_range (&vr0, &vrtem0, &vrtem1)) && 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) if (vrtem1.type != VR_UNDEFINED)
{ {
value_range vrres = VR_INITIALIZER; value_range vrres = VR_INITIALIZER;
extract_range_from_unary_expr_1 (&vrres, code, type, extract_range_from_unary_expr (&vrres, code, type,
&vrtem1, op0_type); &vrtem1, op0_type);
vrp_meet (vr, &vrres); vrp_meet (vr, &vrres);
} }
...@@ -3597,7 +3597,7 @@ extract_range_from_unary_expr (value_range *vr, enum tree_code code, ...@@ -3597,7 +3597,7 @@ extract_range_from_unary_expr (value_range *vr, enum tree_code code,
else else
set_value_range_to_varying (&vr0); 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));
} }
......
...@@ -51,4 +51,9 @@ struct GTY(()) value_range ...@@ -51,4 +51,9 @@ struct GTY(()) value_range
extern void vrp_intersect_ranges (value_range *vr0, value_range *vr1); extern void vrp_intersect_ranges (value_range *vr0, value_range *vr1);
extern void vrp_meet (value_range *vr0, const 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 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);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment