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:
parent
6f9549ee68
commit
c8f403525a
4 changed files with 76 additions and 0 deletions
|
@ -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>
|
2014-09-03 Martin Jambor <mjambor@suse.cz>
|
||||||
|
|
||||||
PR ipa/61986
|
PR ipa/61986
|
||||||
|
|
10
gcc/ipa-cp.c
10
gcc/ipa-cp.c
|
@ -3048,6 +3048,11 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
|
||||||
intersect_with_agg_replacements (cs->caller, src_idx,
|
intersect_with_agg_replacements (cs->caller, src_idx,
|
||||||
&inter, 0);
|
&inter, 0);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inter.release ();
|
||||||
|
return vNULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3063,6 +3068,11 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
|
||||||
else
|
else
|
||||||
intersect_with_plats (src_plats, &inter, 0);
|
intersect_with_plats (src_plats, &inter, 0);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inter.release ();
|
||||||
|
return vNULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (jfunc->type == IPA_JF_ANCESTOR
|
else if (jfunc->type == IPA_JF_ANCESTOR
|
||||||
|
|
|
@ -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>
|
2014-09-03 Martin Jambor <mjambor@suse.cz>
|
||||||
|
|
||||||
PR ipa/61986
|
PR ipa/61986
|
||||||
|
|
55
gcc/testsuite/g++.dg/ipa/pr62015.C
Normal file
55
gcc/testsuite/g++.dg/ipa/pr62015.C
Normal 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;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue