[PATCH] Enhance PHI processing in VN
Richard Biener
rguenther@suse.de
Thu Sep 7 08:46:00 GMT 2017
This enhances VN to do the same PHI handling as CCP, meeting
undefined and constant to constant. I've gone a little bit
further (and maybe will revisit this again) in also meeting
all-undefined to undefined taking one of the undefined args
as the value number. I feel like this might run into
the equation issues I mentioned in the other mail so it
would be cleaner to invent a "new" undefined value number
here -- but I have to make sure to not create too many
default-defs or break iteration convergence (default defs are also
expensive given they require a decl - sth I want to change as well).
So for now I guess I'll stick with the slightly bogus(?) way also
hoping for a testcase that shows the issue this uncovers.
Note it's required to handle
_3 = PHI <_1(D), _2(D)>
..
_4 = PHI <_3, 1>
consistently with
_4 = PHI <_1(D), _2(D), 1>
aka with/without extra forwarders.
Similar to CCP/copyprop this doesn't allow copies to be propagated
this way as this removes most gcc.dg/Wuninitialized* warnings
we test for...
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard.
2017-09-07 Richard Biener <rguenther@suse.de>
* tree-ssa-sccnv.c (visit_phi): Handle meeting undefined
values.
* gcc.dg/tree-ssa/ssa-fre-59.c: New testcase.
Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-59.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-59.c (nonexistent)
+++ gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-59.c (working copy)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-fre1" } */
+
+int i;
+int foo (int b)
+{
+ int j;
+ i = 1;
+ if (b)
+ j = i;
+ return i - j;
+}
+
+/* { dg-final { scan-tree-dump "return 0;" "fre1" } } */
Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c (revision 251833)
+++ gcc/tree-ssa-sccvn.c (working copy)
@@ -3864,6 +3864,7 @@ visit_phi (gimple *phi)
tree result;
tree sameval = VN_TOP;
bool allsame = true;
+ tree seen_undef = NULL_TREE;
unsigned n_executable = 0;
/* TODO: We could check for this in init_sccvn, and replace this
@@ -3884,8 +3885,12 @@ visit_phi (gimple *phi)
if (TREE_CODE (def) == SSA_NAME)
def = SSA_VAL (def);
if (def == VN_TOP)
- continue;
- if (sameval == VN_TOP)
+ ;
+ /* Ignore undefined defs here. */
+ else if (TREE_CODE (def) == SSA_NAME
+ && ssa_undefined_value_p (def, false))
+ seen_undef = def;
+ else if (sameval == VN_TOP)
sameval = def;
else if (!expressions_equal_p (def, sameval))
{
@@ -3893,7 +3898,18 @@ visit_phi (gimple *phi)
break;
}
}
-
+ /* If we found undefined values and didn't end up with a constant
+ drop back to varying as otherwise we end up removing most late
+ uninitialized use warnings. CCP/copyprop have the same restriction. */
+ if (allsame && seen_undef)
+ {
+ /* Unless this was the only value we've seen. */
+ if (sameval == VN_TOP)
+ sameval = seen_undef;
+ else if (! is_gimple_min_invariant (sameval))
+ allsame = false;
+ }
+
/* If none of the edges was executable or all incoming values are
undefined keep the value-number at VN_TOP. If only a single edge
is exectuable use its value. */
More information about the Gcc-patches
mailing list