aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-sccvn.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-08-01 12:03:29 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-08-01 12:03:29 +0000
commite4837aa9fbb91803585f038de67b0d62d256b654 (patch)
treedeef5cb331e8d14f935a347904cbb33a90b96455 /gcc/tree-ssa-sccvn.c
parent42c4ccce729ae19954160339aa2f20e9663408a5 (diff)
downloadgcc-e4837aa9fbb91803585f038de67b0d62d256b654.zip
gcc-e4837aa9fbb91803585f038de67b0d62d256b654.tar.gz
gcc-e4837aa9fbb91803585f038de67b0d62d256b654.tar.bz2
tree-ssa-sccvn.c (visit_phi): Compare invariant addresses as base and offset.
2018-08-01 Richard Biener <rguenther@suse.de> * tree-ssa-sccvn.c (visit_phi): Compare invariant addresses as base and offset. * gcc.dg/tree-ssa/ssa-fre-68.c: New testcase. From-SVN: r263206
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r--gcc/tree-ssa-sccvn.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 833291a..43f3313 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -3941,6 +3941,8 @@ static bool
visit_phi (gimple *phi)
{
tree result, sameval = VN_TOP, seen_undef = NULL_TREE;
+ tree sameval_base = NULL_TREE;
+ poly_int64 soff, doff;
unsigned n_executable = 0;
bool allsame = true;
edge_iterator ei;
@@ -3971,6 +3973,23 @@ visit_phi (gimple *phi)
sameval = def;
else if (!expressions_equal_p (def, sameval))
{
+ /* We know we're arriving only with invariant addresses here,
+ try harder comparing them. We can do some caching here
+ which we cannot do in expressions_equal_p. */
+ if (TREE_CODE (def) == ADDR_EXPR
+ && TREE_CODE (sameval) == ADDR_EXPR
+ && sameval_base != (void *)-1)
+ {
+ if (!sameval_base)
+ sameval_base = get_addr_base_and_unit_offset
+ (TREE_OPERAND (sameval, 0), &soff);
+ if (!sameval_base)
+ sameval_base = (tree)(void *)-1;
+ else if ((get_addr_base_and_unit_offset
+ (TREE_OPERAND (def, 0), &doff) == sameval_base)
+ && known_eq (soff, doff))
+ continue;
+ }
allsame = false;
break;
}