diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-05-24 13:51:09 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-05-24 13:51:09 +0200 |
commit | 0d5a9e784849c3fe7ae59c4a328ccffa60b1d32f (patch) | |
tree | 472f2a2aa52fdca9e0ab2f7f9b21adaeeeb6d935 /gcc/tree-vrp.c | |
parent | e7bcc691204350945d31fcb27b6d421cdf6d8453 (diff) | |
download | gcc-0d5a9e784849c3fe7ae59c4a328ccffa60b1d32f.zip gcc-0d5a9e784849c3fe7ae59c4a328ccffa60b1d32f.tar.gz gcc-0d5a9e784849c3fe7ae59c4a328ccffa60b1d32f.tar.bz2 |
re PR tree-optimization/53465 (wrong code with -O1 -ftree-vrp)
PR tree-optimization/53465
* tree-vrp.c (extract_range_from_cond_expr): First copy_value_range
vr0 into *vr, then vrp_meet that.
(vrp_meet): If one vr type is VR_UNDEFINED, ensure the result doesn't
have any equivalences.
(vrp_visit_phi_node): Call copy_value_range instead of vrp_meet the
first time.
* gcc.c-torture/execute/pr53465.c: New test.
From-SVN: r187827
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 4dc942c..2c1bcad 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3282,8 +3282,8 @@ extract_range_from_cond_expr (value_range_t *vr, gimple stmt) set_value_range_to_varying (&vr1); /* The resulting value range is the union of the operand ranges */ - vrp_meet (&vr0, &vr1); copy_value_range (vr, &vr0); + vrp_meet (vr, &vr1); } @@ -6888,13 +6888,17 @@ vrp_meet (value_range_t *vr0, value_range_t *vr1) { if (vr0->type == VR_UNDEFINED) { - copy_value_range (vr0, vr1); + /* Drop equivalences. See PR53465. */ + set_value_range (vr0, vr1->type, vr1->min, vr1->max, NULL); return; } if (vr1->type == VR_UNDEFINED) { - /* Nothing to do. VR0 already has the resulting range. */ + /* VR0 already has the resulting range, just drop equivalences. + See PR53465. */ + if (vr0->equiv) + bitmap_clear (vr0->equiv); return; } @@ -7036,6 +7040,7 @@ vrp_visit_phi_node (gimple phi) tree lhs = PHI_RESULT (phi); value_range_t *lhs_vr = get_value_range (lhs); value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL }; + bool first = true; int edges, old_edges; struct loop *l; @@ -7092,7 +7097,11 @@ vrp_visit_phi_node (gimple phi) fprintf (dump_file, "\n"); } - vrp_meet (&vr_result, &vr_arg); + if (first) + copy_value_range (&vr_result, &vr_arg); + else + vrp_meet (&vr_result, &vr_arg); + first = false; if (vr_result.type == VR_VARYING) break; |