diff options
author | Richard Biener <rguenther@suse.de> | 2021-03-15 13:44:07 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-03-15 16:00:20 +0100 |
commit | 99415d0f18716deeaa8d80e929b1337968cdfa23 (patch) | |
tree | 60084803a0a4462c80258b679890806c159408f0 /gcc/tree-ssa-sccvn.c | |
parent | dce586ff83e5bf86956cb24e646c7b9a21283ce4 (diff) | |
download | gcc-99415d0f18716deeaa8d80e929b1337968cdfa23.zip gcc-99415d0f18716deeaa8d80e929b1337968cdfa23.tar.gz gcc-99415d0f18716deeaa8d80e929b1337968cdfa23.tar.bz2 |
tree-optimization/98834 - fix optimization regression with _b_c_p
The following makes FRE optimize a load we formerly required
SRA + CCP for which now run after we get rid of all __builtin_constant_p
calls.
2021-03-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/98834
* tree-ssa-sccvn.c (vn_reference_lookup_3): Handle missing
subsetting by truncating the access size.
* g++.dg/opt/pr98834.C: New testcase.
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 65b3967..99759a8 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -3215,7 +3215,17 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_, return (void *)-1; /* This can happen with bitfields. */ if (maybe_ne (ref->size, r.size)) - return (void *)-1; + { + /* If the access lacks some subsetting simply apply that by + shortening it. That in the end can only be successful + if we can pun the lookup result which in turn requires + exact offsets. */ + if (known_eq (r.size, r.max_size) + && known_lt (ref->size, r.size)) + r.size = r.max_size = ref->size; + else + return (void *)-1; + } *ref = r; /* Do not update last seen VUSE after translating. */ |