This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR64853
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 29 Jan 2015 14:49:16 +0100 (CET)
- Subject: [PATCH] Fix PR64853
- Authentication-results: sourceware.org; auth=none
This fixes PR64853 by restricting what we lookup from
match-and-simplifiers further in propagator engine using passes.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard.
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.
Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c (revision 220235)
+++ gcc/tree-vrp.c (working copy)
@@ -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;
}
Index: gcc/tree-ssa-ccp.c
===================================================================
--- gcc/tree-ssa-ccp.c (revision 220235)
+++ gcc/tree-ssa-ccp.c (working copy)
@@ -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;
}
Index: gcc/testsuite/gcc.dg/torture/pr64853.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr64853.c (revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr64853.c (working copy)
@@ -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;
+}