re PR ipa/64565 (ICE: in inline_small_functions, at ipa-inline.c:1664)

PR ipa/64565
	* g++.dg/torture/pr64565.C: New testcase.
	* ipa-inline.c (inline_small_functions): Update callee keys after
	resolving speculation
	(inline_small_functions): Always check monotonicity of the queue.

From-SVN: r219556
This commit is contained in:
Jan Hubicka 2015-01-13 21:59:37 +01:00 committed by Jan Hubicka
parent 59b8926c6f
commit 2001028ad3
4 changed files with 104 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2015-01-13 Jan Hubicka <hubicka@ucw.cz>
PR ipa/64565
* ipa-inline.c (inline_small_functions): Update callee keys after
resolving speculation
(inline_small_functions): Always check monotonicity of the queue.
2015-01-13 Marek Polacek <polacek@redhat.com>
PR middle-end/64391

View File

@ -1626,6 +1626,8 @@ inline_small_functions (void)
reset_edge_caches (where);
update_caller_keys (&edge_heap, where,
updated_nodes, NULL);
update_callee_keys (&edge_heap, where,
updated_nodes);
bitmap_clear (updated_nodes);
}
}
@ -1661,7 +1663,7 @@ inline_small_functions (void)
/* Disable checking for profile because roundoff errors may cause slight
deviations in the order. */
gcc_assert (max_count || cached_badness == current_badness);
gcc_assert (max_count || current_badness >= badness);
gcc_assert (current_badness >= badness);
#else
current_badness = edge_badness (edge, false);
#endif

View File

@ -1,3 +1,8 @@
2015-01-13 Jan Hubicka <hubicka@ucw.cz>
PR ipa/64565
* g++.dg/torture/pr64565.C: New testcase.
2015-01-13 Marek Polacek <polacek@redhat.com>
PR middle-end/64391

View File

@ -0,0 +1,89 @@
/* { dg-do compile } */
typedef enum
{
NS_OK
} nsresult;
struct A
{
static int kIID;
};
class B
{
};
class C
{
public:
C (B p1) { m_fn1 (p1, A::kIID); }
void m_fn1 (B, int);
};
class D;
class F
{
public:
F (int);
};
class G
{
public:
D *operator[](int);
};
class H
{
virtual nsresult m_fn2 ();
public:
void m_fn3 ();
};
class J : H
{
G mQueries;
int mLiveUpdate;
nsresult m_fn2 ();
};
class D
{
public:
nsresult m_fn4 (int);
void m_fn5 (int);
};
class I
{
public:
static I *
m_fn6 ()
{
B __trans_tmp_3;
if (!gHistoryService)
C serv = __trans_tmp_3;
}
void m_fn7 ();
static I *gHistoryService;
};
D *Refresh___trans_tmp_2;
D Refresh___trans_tmp_6, Refresh___trans_tmp_5;
int Refresh_hasDomain;
nsresult
J::m_fn2 ()
{
m_fn3 ();
I history = *I::m_fn6 ();
switch (mLiveUpdate)
{
case 1:
{
mQueries[0];
F query = 0;
if (Refresh_hasDomain)
return NS_OK;
}
case 0:
{
Refresh___trans_tmp_2 = mQueries[0];
F query = Refresh___trans_tmp_5.m_fn4 (0);
history.m_fn7 ();
Refresh___trans_tmp_6.m_fn5 (0);
}
case 3:
m_fn2 ();
}
}