aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-06-02 17:39:43 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-06-02 15:39:43 +0000
commit437ffe7b16428fc85566cc80207b2591ecbbf1e9 (patch)
tree111ab9b5c50fddbf3f2bb8c2a8a8ccd30603cdc5 /gcc
parent98166192bb58f603cdf9757e5621dffb84a1080a (diff)
downloadgcc-437ffe7b16428fc85566cc80207b2591ecbbf1e9.zip
gcc-437ffe7b16428fc85566cc80207b2591ecbbf1e9.tar.gz
gcc-437ffe7b16428fc85566cc80207b2591ecbbf1e9.tar.bz2
re PR middle-end/44295 (Failed to build 483.xalancbmk in SPEC CPU 2006)
PR middle-end/44295 * cgraphunit.c (cgraph_redirect_edge_call_stmt_to_callee): Do not create new cgraph node to check callee. * testsuite/g++.dg/torture/pr44295.C: Neww testcase. From-SVN: r160159
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cgraphunit.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr44295.C170
4 files changed, 188 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 755c476..f47194c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-06-02 Jan Hubicka <jh@suse.cz>
+
+ PR middle-end/44295
+ * cgraphunit.c (cgraph_redirect_edge_call_stmt_to_callee): Do not
+ create new cgraph node to check callee.
+
2010-06-02 Richard Guenther <rguenther@suse.de>
* lto-streamer-in.c (input_gimple_stmt): Fix typo.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 47686a4..54752ed 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2346,13 +2346,19 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
tree decl = gimple_call_fndecl (e->call_stmt);
gimple new_stmt;
gimple_stmt_iterator gsi;
+#ifdef ENABLE_CHECKING
+ struct cgraph_node *node;
+#endif
if (!decl || decl == e->callee->decl
/* Don't update call from same body alias to the real function. */
|| cgraph_get_node (decl) == cgraph_get_node (e->callee->decl))
return e->call_stmt;
- gcc_assert (!cgraph_node (decl)->clone.combined_args_to_skip);
+#ifdef ENABLE_CHECKING
+ node = cgraph_get_node (decl);
+ gcc_assert (!node || !node->clone.combined_args_to_skip);
+#endif
if (cgraph_dump_file)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bbaf1c8..158b066 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-06-02 Jan Hubicka <jh@suse.cz>
+ PR middle-end/44295
+ * testsuite/g++.dg/torture/pr44295.C: Neww testcase.
+
+2010-06-02 Jan Hubicka <jh@suse.cz>
+
* gcc.dg/tree-ssa/loadpre6.c: Update.
2010-06-02 Richard Guenther <rguenther@suse.de>
diff --git a/gcc/testsuite/g++.dg/torture/pr44295.C b/gcc/testsuite/g++.dg/torture/pr44295.C
new file mode 100644
index 0000000..004b7c0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr44295.C
@@ -0,0 +1,170 @@
+/* { dg-do compile } */
+extern "C" {
+ typedef long unsigned int size_t;
+ typedef struct {
+ } __sigset_t;
+ typedef union {
+ } pthread_barrierattr_t;
+ }
+ typedef unsigned short XMLCh;
+ typedef unsigned long XMLSize_t;
+ namespace xercesc_2_5 {
+ class DOMNodeList;
+ class DOMNode {
+ };
+ class DOMDocumentRange {
+ };
+ class DOMDocument: public DOMDocumentRange, public DOMNode {
+ };
+ union wait {
+ struct {
+ }
+ __wait_stopped;
+ }
+ div_t;
+ class MemoryManager;
+ class XMemory {
+ public : void* operator new(size_t size, MemoryManager* memMgr);
+ void operator delete(void* p);
+ void operator delete(void* p, MemoryManager* memMgr);
+ };
+ class XMLExcepts {
+ public : enum Codes {
+ NoError = 0 , HshTbl_ZeroModulus = 48 , HshTbl_BadHashFromKey = 49 };
+ };
+ class XMLUni {
+ };
+ }
+ namespace xercesc_2_5 {
+ class XMLException : public XMemory {
+ public:
+ virtual ~XMLException();
+ XMLException(const char* const srcFile, const unsigned int srcLine, MemoryManager* const memoryManager = 0);
+ void loadExceptText ( const XMLExcepts::Codes toLoad );
+ };
+ class XMLDeleter {
+ };
+ class XMLPlatformUtils {
+ public : static MemoryManager* fgMemoryManager;
+ static inline size_t alignPointerForNewBlockAllocation(size_t ptrSize);
+ };
+ inline size_t XMLPlatformUtils::alignPointerForNewBlockAllocation(size_t ptrSize) {
+ }
+ class HashBase : public XMemory {
+ public:
+ virtual bool equals(const void *const key1, const void *const key2) = 0;
+ virtual ~HashBase() {
+};
+ };
+ class IllegalArgumentException : public XMLException {
+ public:
+IllegalArgumentException(const char* const srcFile , const unsigned int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = 0) : XMLException(srcFile, srcLine, memoryManager) {
+ loadExceptText(toThrow);
+ }
+ };
+ class RuntimeException : public XMLException {
+ public:
+RuntimeException(const char* const srcFile , const unsigned int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = 0) : XMLException(srcFile, srcLine, memoryManager) {
+ loadExceptText(toThrow);
+ }
+ };
+ class MemoryManager {
+ public:
+ virtual ~MemoryManager() {
+ }
+ virtual void* allocate(size_t size) = 0;
+ };
+ template <class TElem> class BaseRefVectorOf : public XMemory {
+ BaseRefVectorOf ( const unsigned int maxElems , const bool adoptElems = true , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager );
+ virtual ~BaseRefVectorOf();
+ bool fAdoptedElems;
+ TElem** fElemList;
+ };
+ template <class TElem> BaseRefVectorOf<TElem>::BaseRefVectorOf( const unsigned int maxElems , const bool adoptElems , MemoryManager* const manager) : fAdoptedElems(adoptElems) {
+ for (unsigned int index = 0;
+ index < maxElems;
+ index++) fElemList[index] = 0;
+ }
+ template <class TElem> BaseRefVectorOf<TElem>::~BaseRefVectorOf() {
+ }
+ class XMLString {
+ public:
+ static bool equals ( const XMLCh* const str1 , const XMLCh* const str2 );
+ static void moveChars ( XMLCh* const targetStr , const XMLCh* const srcStr , const unsigned int count );
+ };
+ inline void XMLString::moveChars( XMLCh* const targetStr , const XMLCh* const srcStr , const unsigned int count) {
+ }
+ inline bool XMLString::equals( const XMLCh* const str1 , const XMLCh* const str2) {
+ const XMLCh* psz1 = str1;
+ const XMLCh* psz2 = str2;
+ if (psz1 == 0 || psz2 == 0) {
+ return true;
+ }
+ }
+ }
+ namespace xercesc_2_5 {
+ class HashPtr : public HashBase {
+ virtual bool equals(const void *const key1, const void *const key2);
+ };
+ template <class TVal> struct DOMDeepNodeListPoolTableBucketElem : public XMemory {
+ void* fKey1;
+ XMLCh* fKey2;
+ XMLCh* fKey3;
+ };
+ template <class TVal> class DOMDeepNodeListPool {
+ public:
+ DOMDeepNodeListPool ( const XMLSize_t modulus , const bool adoptElems , const XMLSize_t initSize = 128 );
+ TVal* getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3);
+ DOMDeepNodeListPoolTableBucketElem<TVal>* findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal);
+ bool fAdoptedElems;
+ DOMDeepNodeListPoolTableBucketElem<TVal>** fBucketList;
+ XMLSize_t fHashModulus;
+ HashBase* fHash;
+ TVal** fIdPtrs;
+ XMLSize_t fIdPtrsCount;
+ MemoryManager* fMemoryManager;
+ };
+ template <class TVal> DOMDeepNodeListPool<TVal>::DOMDeepNodeListPool( const XMLSize_t modulus , const bool adoptElems , const XMLSize_t initSize) : fAdoptedElems(adoptElems) , fBucketList(0) , fHash(0) , fIdPtrs(0) {
+ fHash = new (fMemoryManager) HashPtr();
+ fIdPtrs = (TVal**) fMemoryManager->allocate(fIdPtrsCount * sizeof(TVal*));
+ if (modulus == 0) throw IllegalArgumentException("./xercesc/dom/impl/bad.c", 38, XMLExcepts::HshTbl_ZeroModulus, fMemoryManager);
+ }
+ template <class TVal> TVal* DOMDeepNodeListPool<TVal>::getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3) {
+ XMLSize_t hashVal;
+ DOMDeepNodeListPoolTableBucketElem<TVal>* findIt = findBucketElem(key1, key2, key3, hashVal);
+ }
+ template <class TVal> DOMDeepNodeListPoolTableBucketElem<TVal>* DOMDeepNodeListPool<TVal>:: findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal) {
+ if (hashVal > fHashModulus) throw RuntimeException("./xercesc/dom/impl/bad.c", 64, XMLExcepts::HshTbl_BadHashFromKey, fMemoryManager);
+ DOMDeepNodeListPoolTableBucketElem<TVal>* curElem = fBucketList[hashVal];
+ if (fHash->equals(key1, curElem->fKey1) && (XMLString::equals(key2, curElem->fKey2)) && (XMLString::equals(key3, curElem->fKey3))) {
+ return curElem;
+ }
+ }
+ class DOMDeepNodeListImpl;
+ class DOMDocumentImpl: public DOMDocument {
+ DOMNodeList* getElementsByTagName(const XMLCh * tagname) const;
+ DOMNodeList* getDeepNodeList(const DOMNode *rootNode, const XMLCh *tagName);
+ DOMNodeList* getDeepNodeList(const DOMNode *rootNode, const XMLCh *namespaceURI, const XMLCh *localName);
+ DOMDeepNodeListPool<DOMDeepNodeListImpl>* fNodeListPool;
+ };
+ }
+ void * operator new(size_t amt, xercesc_2_5:: DOMDocument *doc);
+ namespace xercesc_2_5 {
+ class DOMNodeList {
+ };
+ class DOMDeepNodeListImpl: public DOMNodeList {
+ };
+ DOMNodeList *DOMDocumentImpl::getElementsByTagName(const XMLCh *tagname) const {
+ return ((DOMDocumentImpl*)this)->getDeepNodeList(this,tagname);
+ }
+ DOMNodeList *DOMDocumentImpl::getDeepNodeList(const DOMNode *rootNode, const XMLCh *tagName) {
+ if(!fNodeListPool) {
+ fNodeListPool = new (this) DOMDeepNodeListPool<DOMDeepNodeListImpl>(109, false);
+ }
+ DOMNodeList* retList = fNodeListPool->getByKey(rootNode, tagName, 0);
+ }
+ DOMNodeList *DOMDocumentImpl::getDeepNodeList(const DOMNode *rootNode, const XMLCh *namespaceURI, const XMLCh *localName) {
+ DOMNodeList* retList = fNodeListPool->getByKey(rootNode, localName, namespaceURI);
+ }
+ }
+