From 2238c11d7f3173e90758ed6176ff83a1945ad3ce Mon Sep 17 00:00:00 2001
From: Daniel Berlin <dberlin@dberlin.org>
Date: Mon, 4 Jul 2005 17:49:17 +0000
Subject: [PATCH] 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
---
 gcc/ChangeLog                           |  7 ++++
 gcc/testsuite/g++.dg/tree-ssa/pr22279.C | 43 +++++++++++++++++++++++++
 gcc/tree-ssa-structalias.c              |  2 +-
 3 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr22279.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e8c93fd6b6b7..0bbe692aa8ee 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 000000000000..0e17f08ecde4
--- /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 06adb3ec6020..6db77b77e30e 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;
-- 
GitLab