diff options
author | Richard Biener <rguenther@suse.de> | 2015-01-29 13:50:37 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-01-29 13:50:37 +0000 |
commit | d94e3e750d1e5c2fc9ecc8e8a32adec33fc85f8e (patch) | |
tree | 9bc44a875566081bd8465765ea38024d21452464 /gcc | |
parent | 16277100d305948fa6d6fb5a4a318d9728c2400f (diff) | |
download | gcc-d94e3e750d1e5c2fc9ecc8e8a32adec33fc85f8e.zip gcc-d94e3e750d1e5c2fc9ecc8e8a32adec33fc85f8e.tar.gz gcc-d94e3e750d1e5c2fc9ecc8e8a32adec33fc85f8e.tar.bz2 |
re PR tree-optimization/64853 (wrong code at -Os and above on x86_64-linux-gnu)
2015-01-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/64853
* tree-vrp.c (vrp_valueize_1): Do not return anything if the
stmt will get simulated again.
* tree-ssa-ccp.c (valueize_op_1): Likewise.
* gcc.dg/torture/pr64853.c: New testcase.
From-SVN: r220247
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr64853.c | 44 | ||||
-rw-r--r-- | gcc/tree-ssa-ccp.c | 6 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 6 |
5 files changed, 62 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 97316fa..be590e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-01-29 Richard Biener <rguenther@suse.de> + + PR tree-optimization/64853 + * tree-vrp.c (vrp_valueize_1): Do not return anything if the + stmt will get simulated again. + * tree-ssa-ccp.c (valueize_op_1): Likewise. + 2015-01-29 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * config/arm/arm.c (arm_emit_multi_reg_pop): Simplify definition of diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cda948d..8409b46 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2015-01-29 Richard Biener <rguenther@suse.de> + PR tree-optimization/64853 + * gcc.dg/torture/pr64853.c: New testcase. + +2015-01-29 Richard Biener <rguenther@suse.de> + PR tree-optimization/64844 * gcc.dg/vect/pr64844.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr64853.c b/gcc/testsuite/gcc.dg/torture/pr64853.c new file mode 100644 index 0000000..620f99d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr64853.c @@ -0,0 +1,44 @@ +/* { dg-do run } */ + +struct S +{ + int f1; +}; + +static struct S a = { 1 }; +char b; +static unsigned char *c = &b; +int d, e, f; + +int +fn1 (int p) +{ + return 0 ? 0 : p - 1; +} + +static int +fn2 (struct S p) +{ + int g = 200; + for (e = 4; e; e = fn1 (e)) + { + for (; d; d++) + ; + *c &= p.f1 & g; + g = --*c; + if (f) + return 0; + } + return 0; +} + +int +main () +{ + fn2 (a); + + if (b != 0) + __builtin_abort (); + + return 0; +} diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 43336fa..a576bd1 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -1141,15 +1141,15 @@ valueize_op_1 (tree op) { if (TREE_CODE (op) == SSA_NAME) { - tree tem = get_constant_value (op); - if (tem) - return tem; /* If the definition may be simulated again we cannot follow this SSA edge as the SSA propagator does not necessarily re-visit the use. */ gimple def_stmt = SSA_NAME_DEF_STMT (op); if (prop_simulate_again_p (def_stmt)) return NULL_TREE; + tree tem = get_constant_value (op); + if (tem) + return tem; } return op; } diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 2bc22c6..ef1c21d 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -7092,15 +7092,15 @@ vrp_valueize_1 (tree name) { if (TREE_CODE (name) == SSA_NAME) { - value_range_t *vr = get_value_range (name); - if (range_int_cst_singleton_p (vr)) - return vr->min; /* If the definition may be simulated again we cannot follow this SSA edge as the SSA propagator does not necessarily re-visit the use. */ gimple def_stmt = SSA_NAME_DEF_STMT (name); if (prop_simulate_again_p (def_stmt)) return NULL_TREE; + value_range_t *vr = get_value_range (name); + if (range_int_cst_singleton_p (vr)) + return vr->min; } return name; } |