re PR ipa/62015 (ipa-cp-clone uses a clone that is too specialized for the call context)

2014-09-03  Martin Jambor  <mjambor@suse.cz>

	PR ipa/62015
	* ipa-cp.c (intersect_aggregates_with_edge): Handle impermissible
	pass-trough jump functions correctly.

testsuite/
	* g++.dg/ipa/pr62015.C: New test.

From-SVN: r214878
This commit is contained in:
Martin Jambor 2014-09-03 16:26:38 +02:00 committed by Martin Jambor
parent 6f9549ee68
commit c8f403525a
4 changed files with 76 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2014-09-03 Martin Jambor <mjambor@suse.cz>
PR ipa/62015
* ipa-cp.c (intersect_aggregates_with_edge): Handle impermissible
pass-trough jump functions correctly.
2014-09-03 Martin Jambor <mjambor@suse.cz>
PR ipa/61986

View file

@ -3048,6 +3048,11 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
intersect_with_agg_replacements (cs->caller, src_idx,
&inter, 0);
}
else
{
inter.release ();
return vNULL;
}
}
else
{
@ -3063,6 +3068,11 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
else
intersect_with_plats (src_plats, &inter, 0);
}
else
{
inter.release ();
return vNULL;
}
}
}
else if (jfunc->type == IPA_JF_ANCESTOR

View file

@ -1,3 +1,8 @@
2014-09-03 Martin Jambor <mjambor@suse.cz>
PR ipa/62015
* g++.dg/ipa/pr62015.C: New test.
2014-09-03 Martin Jambor <mjambor@suse.cz>
PR ipa/61986

View file

@ -0,0 +1,55 @@
/* { dg-do run } */
/* { dg-options "-O3 -std=c++11" } */
extern "C" int printf(const char *fmt, ...);
extern "C" void abort(void);
struct Side {
enum _Value { Left, Right, Invalid };
constexpr Side() : _value(Invalid) {}
constexpr Side(_Value value) : _value(value) {}
operator _Value() const { return (_Value)_value; }
private:
char _value;
};
struct A {
void init();
void adjust(Side side, bool final);
void move(Side side);
};
void A::init()
{
adjust(Side::Invalid, false);
}
static void __attribute__((noinline))
check (int v, int final)
{
if (v != 0)
abort();
}
__attribute__((noinline))
void A::adjust(Side side, bool final)
{
check ((int)side, final);
}
void A::move(Side side)
{
adjust(side, false);
adjust(side, true);
}
int main()
{
A t;
t.move(Side::Left);
return 0;
}