diff options
author | Richard Guenther <rguenther@suse.de> | 2012-01-27 10:54:51 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-01-27 10:54:51 +0000 |
commit | 45c8342998c3c431a06366f37c48be9082de8906 (patch) | |
tree | b599001dbe6f3f81d8368b34ad45ce0bb017a6c0 /gcc | |
parent | 10c7477699e2d8906204293e15c64b34d1e62231 (diff) | |
download | gcc-45c8342998c3c431a06366f37c48be9082de8906.zip gcc-45c8342998c3c431a06366f37c48be9082de8906.tar.gz gcc-45c8342998c3c431a06366f37c48be9082de8906.tar.bz2 |
re PR middle-end/51959 (ICE in set_mem_alias_set, at emit-rtl.c:1884)
2012-01-27 Richard Guenther <rguenther@suse.de>
PR middle-end/51959
* expr.c (store_field): Use the alias-set of the scratch memory
for storing to it.
* g++.dg/torture/pr51959.C: New testcase.
From-SVN: r183616
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr51959.C | 80 |
4 files changed, 92 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7fb05d..a18f505 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-27 Richard Guenther <rguenther@suse.de> + + PR middle-end/51959 + * expr.c (store_field): Use the alias-set of the scratch memory + for storing to it. + 2012-01-27 Tom de Vries <tom@codesourcery.com> PR tree-optimization/51990 @@ -6299,7 +6299,7 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, store_field (blk_object, bitsize, bitpos, bitregion_start, bitregion_end, - mode, exp, type, alias_set, nontemporal); + mode, exp, type, MEM_ALIAS_SET (blk_object), nontemporal); emit_move_insn (target, object); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 58311bc..bdd2792 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-27 Richard Guenther <rguenther@suse.de> + + PR middle-end/51959 + * g++.dg/torture/pr51959.C: New testcase. + 2012-01-27 Tom de Vries <tom@codesourcery.com> PR tree-optimization/51990 diff --git a/gcc/testsuite/g++.dg/torture/pr51959.C b/gcc/testsuite/g++.dg/torture/pr51959.C new file mode 100644 index 0000000..da0be71 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr51959.C @@ -0,0 +1,80 @@ +// { dg-do compile } + +namespace std { + typedef __SIZE_TYPE__ size_t; +} +inline void* operator new(std::size_t, void* __p) throw() { + return __p; +} +template <typename T> class QTypeInfo { +}; +enum { Q_COMPLEX_TYPE = 0, Q_PRIMITIVE_TYPE = 0x1, Q_STATIC_TYPE = 0, Q_MOVABLE_TYPE = 0x2, Q_DUMMY_TYPE = 0x4 }; +template<typename Enum> class QFlags { + int i; + inline QFlags(Enum f) : i(f) { } +}; +class __attribute__((visibility("default"))) QSize { +public: + bool isEmpty() const; + friend inline bool operator==(const QSize &, const QSize &); + int wd; + int ht; +}; +template<> class QTypeInfo<QSize > { +public: + enum { + isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isLarge = (sizeof(QSize)>sizeof(void*)), isPointer = false, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0) }; +}; +class __attribute__((visibility("default"))) QBasicAtomicInt { +public: + inline bool operator!=(int value) const { } +}; +struct __attribute__((visibility("default"))) QListData { + struct Data { + QBasicAtomicInt ref; + }; + void **append(); +}; +template <typename T> class QList { + struct Node { + void *v; + }; + union { + QListData p; + QListData::Data *d; + }; +public: + void append(const T &t); + inline void push_back(const T &t) { + append(t); + } + void node_construct(Node *n, const T &t); + void node_destruct(Node *n); +}; +template <typename T> inline void QList<T>::node_construct(Node *n, const T &t) { + if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) n->v = new T(t); + else if (QTypeInfo<T>::isComplex) new (n) T(t); +} +template <typename T> inline void QList<T>::node_destruct(Node *n) { +} +template <typename T> void QList<T>::append(const T &t) { + if (d->ref != 1) { + try { + } + catch (...) { + } + if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) { + } + else { + Node *n, copy; + node_construct(©, t); + try { n = reinterpret_cast<Node *>(p.append());; } + catch (...) { node_destruct(©); throw; } + *n = copy; + } + } +}; +void virtual_hook(QSize sz, QList<QSize> &arg) +{ + arg.push_back(sz); +} |