summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-14 21:19:05 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2002-10-14 21:19:05 +0000
commit25763d80f298a3ff04571a01db5d6f215a936145 (patch)
tree770e70e8378f7c6f20a975a6e92e056f9a8f584b
parentd77d25c661178a591126882260f0ee3d7d9d7fca (diff)
downloadgcc-25763d80f298a3ff04571a01db5d6f215a936145.tar.gz
PR optimization/6631
* Makefile.in (function.o): Depend on langhooks.h. * alias.c (objects_must_conflict_p): Check honor_readonly when examining TYPE_READONLY. * function.c (assign_stack_temp_for_type): Likewise. PR optimization/6631 * g++.dg/opt/const2.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58136 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/alias.c6
-rw-r--r--gcc/function.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/const2.C40
5 files changed, 57 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2064e1d9e65..2513b47cdbb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
+ PR optimization/6631
+ * alias.c (objects_must_conflict_p): Check honor_readonly when
+ examining TYPE_READONLY.
+ * function.c (assign_stack_temp_for_type): Likewise.
+
2002-10-14 Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
* config/alpha/alpha.md (extendsidi2_nofix, extendsidi2_fix):
diff --git a/gcc/alias.c b/gcc/alias.c
index 914b1532e5d..ca560b69e8c 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -1,5 +1,5 @@
/* Alias analysis for GNU C
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by John Carr (jfc@mit.edu).
This file is part of GCC.
@@ -332,8 +332,8 @@ objects_must_conflict_p (t1, t2)
then they may not conflict. */
if ((t1 != 0 && readonly_fields_p (t1))
|| (t2 != 0 && readonly_fields_p (t2))
- || (t1 != 0 && TYPE_READONLY (t1))
- || (t2 != 0 && TYPE_READONLY (t2)))
+ || (t1 != 0 && lang_hooks.honor_readonly && TYPE_READONLY (t1))
+ || (t2 != 0 && lang_hooks.honor_readonly && TYPE_READONLY (t2)))
return 0;
/* If they are the same type, they must conflict. */
diff --git a/gcc/function.c b/gcc/function.c
index 479ecef4141..0c066ed0358 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -798,7 +798,8 @@ assign_stack_temp_for_type (mode, size, keep, type)
/* If a type is specified, set the relevant flags. */
if (type != 0)
{
- RTX_UNCHANGING_P (slot) = TYPE_READONLY (type);
+ RTX_UNCHANGING_P (slot) = (lang_hooks.honor_readonly
+ && TYPE_READONLY (type));
MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
MEM_SET_IN_STRUCT_P (slot, AGGREGATE_TYPE_P (type));
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5b1374cc043..b368a720205 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2002-10-14 Mark Mitchell <mark@codesourcery.com>
+ PR optimization/6631
+ * g++.dg/opt/const2.C: New test.
+
+2002-10-14 Mark Mitchell <mark@codesourcery.com>
+
PR c++/7176
* g++.dg/parse/friend1.C: New test.
* g++.old-deja/g++.pt/memtemp64.C: Adjust.
diff --git a/gcc/testsuite/g++.dg/opt/const2.C b/gcc/testsuite/g++.dg/opt/const2.C
new file mode 100644
index 00000000000..9ddc5e13764
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/const2.C
@@ -0,0 +1,40 @@
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort (void);
+
+struct QSize
+{
+ QSize();
+ QSize( int w, int h );
+ int wd, ht;
+ friend inline const QSize operator+( const QSize &, const QSize & );
+};
+
+inline QSize::QSize()
+{ wd = ht = -1; }
+
+inline QSize::QSize( int w, int h )
+{ wd = w; ht = h; }
+
+inline const QSize operator+( const QSize & s1, const QSize & s2 )
+{ return QSize(s1.wd+s2.wd, s1.ht+s2.ht); }
+
+QSize minimumSize()
+{
+ return QSize (100, 200);
+}
+
+QSize totalMinimumSize()
+{
+ QSize s = minimumSize();
+ return s + QSize( 0, 0 );
+}
+
+int main()
+{
+ QSize s = totalMinimumSize();
+ if (s.wd != 100 || s.ht != 200)
+ abort ();
+}
+