Commit b914768c by Jan Hubicka Committed by Jan Hubicka

re PR ipa/92421 (ICE in inline_small_functions, at ipa-inline.c:2001 since r277759)


	PR c++/92421
	* ipa-prop.c (update_indirect_edges_after_inlining):
	Mark parameter as used.
	* ipa-inline.c (recursive_inlining): Reset node cache
	after inlining.
	(inline_small_functions): Remove checking ifdef.
	* ipa-inline-analysis.c (do_estimate_edge_time): Verify
	cache consistency.
	* g++.dg/torture/pr92421.C: New testcase.

From-SVN: r278159
parent 7b34a284
2019-11-13 Jan Hubicka <hubicka@ucw.cz> 2019-11-13 Jan Hubicka <hubicka@ucw.cz>
PR c++/92421
* ipa-prop.c (update_indirect_edges_after_inlining):
Mark parameter as used.
* ipa-inline.c (recursive_inlining): Reset node cache
after inlining.
(inline_small_functions): Remove checking ifdef.
* ipa-inline-analysis.c (do_estimate_edge_time): Verify
cache consistency.
2019-11-13 Jan Hubicka <hubicka@ucw.cz>
PR ipa/92498 PR ipa/92498
* ipa-profile.c (check_argument_count): Do not ICE when descriptors * ipa-profile.c (check_argument_count): Do not ICE when descriptors
is NULL. is NULL.
...@@ -210,6 +210,19 @@ do_estimate_edge_time (struct cgraph_edge *edge) ...@@ -210,6 +210,19 @@ do_estimate_edge_time (struct cgraph_edge *edge)
time = e->entry.time; time = e->entry.time;
nonspec_time = e->entry.nonspec_time; nonspec_time = e->entry.nonspec_time;
hints = e->entry.hints; hints = e->entry.hints;
if (flag_checking)
{
sreal chk_time, chk_nonspec_time;
int chk_size, chk_min_size;
ipa_hints chk_hints;
ctx.estimate_size_and_time (&chk_size, &chk_min_size,
&chk_time, &chk_nonspec_time,
&chk_hints);
gcc_assert (chk_size == size && chk_time == time
&& chk_nonspec_time == nonspec_time
&& chk_hints == hints);
}
} }
else else
{ {
......
...@@ -1633,6 +1633,7 @@ recursive_inlining (struct cgraph_edge *edge, ...@@ -1633,6 +1633,7 @@ recursive_inlining (struct cgraph_edge *edge,
} }
inline_call (curr, false, new_edges, &overall_size, true); inline_call (curr, false, new_edges, &overall_size, true);
reset_node_cache (node);
lookup_recursive_calls (node, curr->callee, &heap); lookup_recursive_calls (node, curr->callee, &heap);
n++; n++;
} }
...@@ -1982,11 +1983,10 @@ inline_small_functions (void) ...@@ -1982,11 +1983,10 @@ inline_small_functions (void)
if (!edge->inline_failed || !edge->callee->analyzed) if (!edge->inline_failed || !edge->callee->analyzed)
continue; continue;
#if CHECKING_P
/* Be sure that caches are maintained consistent. /* Be sure that caches are maintained consistent.
This check is affected by scaling roundoff errors when compiling for This check is affected by scaling roundoff errors when compiling for
IPA this we skip it in that case. */ IPA this we skip it in that case. */
if (!edge->callee->count.ipa_p () if (flag_checking && !edge->callee->count.ipa_p ()
&& (!max_count.initialized_p () || !max_count.nonzero_p ())) && (!max_count.initialized_p () || !max_count.nonzero_p ()))
{ {
sreal cached_badness = edge_badness (edge, false); sreal cached_badness = edge_badness (edge, false);
...@@ -1997,6 +1997,9 @@ inline_small_functions (void) ...@@ -1997,6 +1997,9 @@ inline_small_functions (void)
if (edge_growth_cache != NULL) if (edge_growth_cache != NULL)
edge_growth_cache->remove (edge); edge_growth_cache->remove (edge);
reset_node_cache (edge->caller->inlined_to
? edge->caller->inlined_to
: edge->caller);
gcc_assert (old_size_est == estimate_edge_size (edge)); gcc_assert (old_size_est == estimate_edge_size (edge));
gcc_assert (old_time_est == estimate_edge_time (edge)); gcc_assert (old_time_est == estimate_edge_time (edge));
/* FIXME: /* FIXME:
...@@ -2021,9 +2024,6 @@ inline_small_functions (void) ...@@ -2021,9 +2024,6 @@ inline_small_functions (void)
} }
else else
current_badness = edge_badness (edge, false); current_badness = edge_badness (edge, false);
#else
current_badness = edge_badness (edge, false);
#endif
if (current_badness != badness) if (current_badness != badness)
{ {
if (edge_heap.min () && current_badness > edge_heap.min_key ()) if (edge_heap.min () && current_badness > edge_heap.min_key ())
......
...@@ -3537,6 +3537,11 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs, ...@@ -3537,6 +3537,11 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
if (ici->polymorphic if (ici->polymorphic
&& !ipa_get_jf_ancestor_type_preserved (jfunc)) && !ipa_get_jf_ancestor_type_preserved (jfunc))
ici->vptr_changed = true; ici->vptr_changed = true;
ipa_set_param_used_by_indirect_call (new_root_info,
ici->param_index, true);
if (ici->polymorphic)
ipa_set_param_used_by_polymorphic_call (new_root_info,
ici->param_index, true);
} }
} }
else else
......
2019-11-13 Jan Hubicka <hubicka@ucw.cz>
PR c++/92421
* g++.dg/torture/pr92421.C: New testcase.
2019-11-13 David Edelsohn <dje.gcc@gmail.com> 2019-11-13 David Edelsohn <dje.gcc@gmail.com>
* gcc.target/powerpc/pr92090.c: Limit -mbig to powerpc64le-*-*. * gcc.target/powerpc/pr92090.c: Limit -mbig to powerpc64le-*-*.
......
/* { dg-do compile } */
typedef long a;
void *b, *c;
template <typename, typename> class d {};
template <typename e, typename f> bool operator!=(d<e, f>, d<e, f>);
class g {
public:
g(char *);
};
class j {
public:
j();
void h();
void i();
void aj();
};
class m {
public:
m(bool);
};
class n {
public:
operator a();
};
class o {
public:
long am();
};
class H {
public:
class p {};
virtual bool accept(const char *, unsigned long, p *, bool);
};
class q : H {
public:
class r {
public:
enum at { au, av, aw };
};
enum { ax };
virtual void ay(char *, int, const char *, r::at, char *);
virtual bool az(const g &, unsigned = ax);
virtual bool ba(const int &, p *, bool);
void bb(char *bc, long bd, char *, long be) {
class bf : public p {
public:
bf(long);
} bg(be);
accept(bc, bd, &bg, true);
}
};
class s {
q *bi;
bool bj();
};
template <class bk> class t : q {
bool accept(const char *, unsigned long bd, p *bg, bool) {
bool k(bp || bq), cl = false, err = false;
if (br)
ay("", 1, __func__, r::au, "");
if (bs)
ay("", 6, __func__, r::av, "");
char bt[1], cd[1];
long bu = sizeof(int) + bd, ce = sizeof(L) + bd;
char *bw = bu > sizeof(bt) ? new char : bt,
*cf = ce > sizeof(cd) ? new char : cd;
__builtin___memcpy_chk(b, c, bd, 0);
a by[1];
int bz = 0;
u cb = *cc((int *)bw, true, by, &bz);
ay("", 1, __func__, r::aw, "");
if (bw != bt)
delete bw;
__builtin___memcpy_chk(b, c, bd, 0);
cb.ch.i();
bool ci = cj((L *)cf, bg);
bool atran = bq && bp && cb.ck;
if (atran && !ci && cm(&cb))
if (cn > co) {
int cp = cb.cq % 6;
v cs = *(ct + cp);
if (cu(&cs))
cl = true;
}
if (ci)
if (k)
cv.aj();
cv.h();
b = cc((int *)bw, false, by, &bz);
if (b)
if (cw(&cb, by, bz))
if (atran && bp && cx())
cv.aj();
if (cl)
if (k)
cv.aj();
cv.h();
int cp = cb.cq % 6;
v cs = *(ct + cp);
if (cy())
err = true;
O da = *(db + cp);
if (da.dc->am() > cs.dc->am() + cs.dd->am() + 1 && de(&da))
cv.aj();
return !err;
}
bool ba(const int &, p *, bool) {
d<int, int> kit, df;
while (kit != df)
;
cx();
}
bool az(const g &, unsigned) {
t dj;
int cur;
while (cur) {
int dk, dl;
char dbuf;
dj.bb(&dbuf, dl, &dbuf, dk);
}
}
struct L {};
struct u {
j ch;
a cq;
bool ck;
};
struct v {
o *dd;
o *dc;
};
struct O {
o *dc;
};
bool cy();
bool cu(v *);
bool cj(L *, p *);
bool de(O *);
u *cc(int *, bool, a *, int *);
bool cw(u *, a *, int);
bool cx() {
dm.dn();
bool err = false;
if (dm.l())
err = true;
return !err;
}
bool cm(u *);
j cv;
int br;
bool bs;
bool bq;
bk dm;
a co;
n cn;
v ct[6];
O db[6];
bool bp;
};
class w : q {
public:
void dn();
bool l() {
m(true);
if (br)
ay("", 1087, __func__, r::au, "");
return false;
}
int br;
};
bool s::bj() {
bi->az("");
new t<w>;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment