diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2005-07-04 17:49:17 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2005-07-04 17:49:17 +0000 |
commit | 2238c11d7f3173e90758ed6176ff83a1945ad3ce (patch) | |
tree | 2811bcbabc25bf4c477896b0136dd5dc1b916d3b /gcc | |
parent | 0f8417e9b52f36614455fd9db4e7dff6c851a00c (diff) | |
download | gcc-2238c11d7f3173e90758ed6176ff83a1945ad3ce.zip gcc-2238c11d7f3173e90758ed6176ff83a1945ad3ce.tar.gz gcc-2238c11d7f3173e90758ed6176ff83a1945ad3ce.tar.bz2 |
re PR tree-optimization/22279 (ICE in first_vi_for_offset, at tree-ssa-structalias.c:2566)
2005-07-04 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/22279
* tree-ssa-structalias.c (offset_overlaps_with_access): Use
correct operator.
From-SVN: r101603
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr22279.C | 43 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 2 |
3 files changed, 51 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e8c93fd..0bbe692 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-07-04 Daniel Berlin <dberlin@dberlin.org> + + Fix PR tree-optimization/22279 + + * tree-ssa-structalias.c (offset_overlaps_with_access): Use + correct operator. + 2005-07-04 J"orn Rennecke <joern.rennecke@st.com> * sh.c (output_ieee_ccmpeq): Replace "\\;" with "\n\t". diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22279.C b/gcc/testsuite/g++.dg/tree-ssa/pr22279.C new file mode 100644 index 0000000..0e17f08 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22279.C @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +struct string +{ + long long _M_p; + long long i; + string(); + int begin(); + int end(); + string(int, int); +}; +struct symbol +{ + int type; + string name; + long long raw_name; + long long demangled_name; + long long version_name; + int version_status; + int status; + void init(); +}; +void symbol::init() { name = string(); } +struct pair +{ + symbol first; + symbol second; + pair(const symbol& __a, const symbol& __b) : first(__a), second(__b) { } +}; +struct vector +{ + void push_back(const pair& __x); +}; +/* This ends up with two RHS deref copies, and we need to get the offsets right on them. */ +void f(vector incompatible) +{ + symbol base; + incompatible.push_back(pair(base, base)); +} + + + diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 06adb3e..6db77b7 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -1951,7 +1951,7 @@ offset_overlaps_with_access (const unsigned HOST_WIDE_INT fieldpos, { if (fieldpos == accesspos && fieldsize == accesssize) return true; - if (accesspos >= fieldpos && accesspos <= (fieldpos + fieldsize)) + if (accesspos >= fieldpos && accesspos < (fieldpos + fieldsize)) return true; if (accesspos < fieldpos && (accesspos + accesssize > fieldpos)) return true; |