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:
parent
44f5982995
commit
d34af02260
6 changed files with 88 additions and 4 deletions
|
@ -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>
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
67
gcc/testsuite/g++.dg/ipa/pr61800.C
Normal file
67
gcc/testsuite/g++.dg/ipa/pr61800.C
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue