[PATCH] Fix PR87168
Richard Biener
rguenther@suse.de
Fri Aug 31 13:17:00 GMT 2018
I am testing the following patch to fix a missed optimization and
wrong-code issue in region VN.
{,O1-}Bootstrap and regtest running on x86_64-unknown-linux-gnu.
2018-08-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/87168
* tree-ssa-sccvn.c (SSA_VAL): Add visited output parameter.
(rpo_elim::eliminate_avail): When OP was not visited it must
be available.
* gcc.dg/torture/pr87168.c: New testcase.
Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c (revision 263982)
+++ gcc/tree-ssa-sccvn.c (working copy)
@@ -456,10 +456,14 @@ VN_INFO (tree name)
/* Return the SSA value of X. */
inline tree
-SSA_VAL (tree x)
+SSA_VAL (tree x, bool *visited = NULL)
{
vn_ssa_aux_t tem = vn_ssa_aux_hash->find_with_hash (x, SSA_NAME_VERSION (x));
- return tem && tem->visited ? tem->valnum : x;
+ if (!tem)
+ return x;
+ if (visited)
+ *visited = tem->visited;
+ return tem->visited ? tem->valnum : x;
}
/* Return whether X was visited. */
@@ -5681,7 +5685,12 @@ rpo_elim::~rpo_elim ()
tree
rpo_elim::eliminate_avail (basic_block bb, tree op)
{
- tree valnum = SSA_VAL (op);
+ bool visited;
+ tree valnum = SSA_VAL (op, &visited);
+ /* If we didn't visit OP then it must be defined outside of the
+ region we process and also dominate it. So it is available. */
+ if (!visited)
+ return op;
if (TREE_CODE (valnum) == SSA_NAME)
{
if (SSA_NAME_IS_DEFAULT_DEF (valnum))
Index: gcc/testsuite/gcc.dg/torture/pr87168.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr87168.c (nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr87168.c (working copy)
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+
+int a, b, c, d, e, f, *g;
+
+int main ()
+{
+ unsigned i;
+ while (b)
+ {
+ int j, m;
+L1:
+ f = j;
+L2:
+ if (i && e)
+ {
+ i = f;
+ goto L2;
+ }
+ j = f;
+ if (a)
+ goto L3;
+ for (m = 0; m < 2; m++)
+ if (d)
+ goto L1;
+ goto L2;
+L3:
+ (&j != g) | c;
+ }
+ return 0;
+}
More information about the Gcc-patches
mailing list