re PR ipa/61800 (ICE: Segmentation fault during Firefox build)

PR ipa/61800

gcc/
	* cgraph.h (cgraph_node::create_indirect_edge): Add
	compute_indirect_info param.
	* cgraph.c (cgraph_node::create_indirect_edge): Compute
	indirect_info only when it is required.
	* cgraphclones.c (cgraph_clone_edge): Do not recompute
	indirect_info fore cloned indirect edge.

gcc/testsuite/
	* g++.dg/ipa/pr61800.C: New.

From-SVN: r214099
This commit is contained in:
Ilya Enkovich 2014-08-18 13:26:06 +00:00 committed by Kirill Yukhin
parent 44f5982995
commit d34af02260
6 changed files with 88 additions and 4 deletions

View file

@ -1,3 +1,13 @@
2014-08-18 Ilya Enkovich <ilya.enkovich@intel.com>
PR ipa/61800
* cgraph.h (cgraph_node::create_indirect_edge): Add
compute_indirect_info param.
* cgraph.c (cgraph_node::create_indirect_edge): Compute
indirect_info only when it is required.
* cgraphclones.c (cgraph_clone_edge): Do not recompute
indirect_info fore cloned indirect edge.
2014-08-18 Alexander Ivchenko <alexander.ivchenko@intel.com>
Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Anna Tikhonova <anna.tikhonova@intel.com>

View file

@ -942,7 +942,8 @@ cgraph_allocate_init_indirect_info (void)
struct cgraph_edge *
cgraph_node::create_indirect_edge (gimple call_stmt, int ecf_flags,
gcov_type count, int freq)
gcov_type count, int freq,
bool compute_indirect_info)
{
struct cgraph_edge *edge = cgraph_node::create_edge (this, NULL, call_stmt,
count, freq, true);
@ -954,7 +955,8 @@ cgraph_node::create_indirect_edge (gimple call_stmt, int ecf_flags,
edge->indirect_info->ecf_flags = ecf_flags;
/* Record polymorphic call info. */
if (call_stmt
if (compute_indirect_info
&& call_stmt
&& (target = gimple_call_fn (call_stmt))
&& virtual_method_call_p (target))
{

View file

@ -915,7 +915,8 @@ public:
statement destination is a formal parameter of the caller with index
PARAM_INDEX. */
struct cgraph_edge *create_indirect_edge (gimple call_stmt, int ecf_flags,
gcov_type count, int freq);
gcov_type count, int freq,
bool compute_indirect_info = true);
/* Like cgraph_create_edge walk the clone tree and update all clones sharing
same function body. If clones already have edge for OLD_STMT; only

View file

@ -136,7 +136,7 @@ cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
{
new_edge = n->create_indirect_edge (call_stmt,
e->indirect_info->ecf_flags,
count, freq);
count, freq, false);
*new_edge->indirect_info = *e->indirect_info;
}
}

View file

@ -1,3 +1,7 @@
2014-08-18 Ilya Enkovich <ilya.enkovich@intel.com>
* g++.dg/ipa/pr61800.C: New.
2014-08-18 Yury Gribov <y.gribov@samsung.com>
PR sanitizer/62089

View file

@ -0,0 +1,67 @@
/* PR ipa/61800 */
/* { dg-do compile } */
/* { dg-options "-O2" } */
#pragma GCC visibility push(hidden)
class A
{
public:
unsigned long m_fn1 () const;
};
class B;
class C
{
public:
;
virtual bool m_fn2 (void) = 0;
};
class D
{
virtual bool m_fn3 (const int &p1, B *p2) = 0;
};
class F : public D
{
bool m_fn3 (const int &p1, B *p2);
A mPredicates;
};
class B
{
};
class G : public B
{
virtual unsigned int m_fn4 () = 0;
};
class H : public G
{
public:
int txNodeSetContext_aContextNodeSet;
H (B *p1) {}
int
m_fn5 ()
{
return mPosition < m_fn4 ();
}
unsigned int m_fn4 ();
unsigned int mPosition;
};
unsigned int a;
C *b;
bool
F::m_fn3 (const int &p1, B *p2)
{
if (!b->m_fn2 ())
return false;
unsigned int c = mPredicates.m_fn1 ();
for (1; 1 < c; ++a)
{
H d (p2);
while (d.m_fn5 ())
{
do
{
}
while (0);
}
}
}