re PR middle-end/44706 (Failed to build 483.xalancbmk in SPEC CPU 2006)
authorJan Hubicka <jh@suse.cz>
Fri, 2 Jul 2010 09:39:54 +0000 (11:39 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 2 Jul 2010 09:39:54 +0000 (09:39 +0000)
PR middle-end/44706
* predict.c (predict_paths_for_bb): Handle case when control dependence
BB has only abnormal edges.
* g++.dg/tree-ssa/pr44706.C: New testcase.

From-SVN: r161691

gcc/ChangeLog
gcc/predict.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr44706.C [new file with mode: 0644]

index 365a719..2e208ca 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-02  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/44706
+       * predict.c (predict_paths_for_bb): Handle case when control dependence
+       BB has only abnormal edges.
+
 2010-07-02  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/44748
index 5d61140..15d573b 100644 (file)
@@ -1786,8 +1786,33 @@ predict_paths_for_bb (basic_block cur, basic_block bb,
     if (e->src->index >= NUM_FIXED_BLOCKS
        && !dominated_by_p (CDI_POST_DOMINATORS, e->src, bb))
     {
+      edge e2;
+      edge_iterator ei2;
+      bool found = false;
+
+      /* Ignore abnormals, we predict them as not taken anyway.  */
+      if (e->flags & (EDGE_EH | EDGE_FAKE | EDGE_ABNORMAL))
+       continue;
       gcc_assert (bb == cur || dominated_by_p (CDI_POST_DOMINATORS, cur, bb));
-      predict_edge_def (e, pred, taken);
+
+      /* See if there is how many edge from e->src that is not abnormal
+        and does not lead to BB.  */
+      FOR_EACH_EDGE (e2, ei2, e->src->succs)
+       if (e2 != e
+           && !(e2->flags & (EDGE_EH | EDGE_FAKE | EDGE_ABNORMAL))
+           && !dominated_by_p (CDI_POST_DOMINATORS, e2->dest, bb))
+         {
+           found = true;
+           break;
+         }
+
+      /* If there is non-abnormal path leaving e->src, predict edge
+        using predictor.  Otherwise we need to look for paths
+        leading to e->src.  */
+      if (found)
+        predict_edge_def (e, pred, taken);
+      else
+       predict_paths_for_bb (e->src, e->src, pred, taken);
     }
   for (son = first_dom_son (CDI_POST_DOMINATORS, cur);
        son;
index d9c0a99..651d8b6 100644 (file)
@@ -1,3 +1,7 @@
+2010-07-02  Jan Hubicka  <jh@suse.cz>
+
+       * g++.dg/tree-ssa/pr44706.C: New testcase.
+
 2010-07-02  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/44748
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr44706.C b/gcc/testsuite/g++.dg/tree-ssa/pr44706.C
new file mode 100644 (file)
index 0000000..39904d8
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-fnsplit" } */
+class MemoryManager;
+class XMLExcepts {
+public : 
+    enum Codes     {
+      AttrList_BadIndex
+    };
+};
+class XMLException {
+public:
+    XMLException(const char* const srcFile, const unsigned int srcLine,
+MemoryManager* const memoryManager = 0);
+};
+class ArrayIndexOutOfBoundsException : public XMLException {
+public:
+    ArrayIndexOutOfBoundsException(const char* const srcFile , const unsigned
+int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager =
+0) : XMLException(srcFile, srcLine, memoryManager) {
+    }
+};
+class XMLAttDef {
+  bool fExternalAttribute;
+};
+class XMLAttDefList {
+public:
+    MemoryManager* getMemoryManager() const;
+};
+class DTDAttDef : public XMLAttDef {
+};
+class DTDAttDefList : public XMLAttDefList {
+  virtual const XMLAttDef &getAttDef(unsigned int index) const ;
+  DTDAttDef** fArray;
+  unsigned int fCount;
+};
+const XMLAttDef &DTDAttDefList::getAttDef(unsigned int index) const {
+  if(index >= fCount) 
+    throw ArrayIndexOutOfBoundsException("foo.cpp", 0,
+XMLExcepts::AttrList_BadIndex, getMemoryManager());
+  return *(fArray[index]);
+}
+
+/* Mistake in branch prediction caused us to split away real body of the function keeping
+   only throw () invokation.   This is bad idea.  */
+/* { dg-final { scan-tree-dump-not "Splitting function" "fnsplit"} } */
+/* { dg-final { cleanup-tree-dump "fnsplit" } } */