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>
|
||||
|
||||
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,
|
||||
&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
|
||||
|
|
|
@ -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
|
||||
|
|
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