Commit c8f40352 by Martin Jambor Committed by Martin Jambor

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
parent 6f9549ee
2014-09-03 Martin Jambor <mjambor@suse.cz> 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 PR ipa/61986
* ipa-cp.c (find_aggregate_values_for_callers_subset): Chain * ipa-cp.c (find_aggregate_values_for_callers_subset): Chain
created replacements in ascending order of offsets. created replacements in ascending order of offsets.
...@@ -3048,6 +3048,11 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index, ...@@ -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, ...@@ -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
......
2014-09-03 Martin Jambor <mjambor@suse.cz> 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 PR ipa/61986
* gcc.dg/ipa/pr61986.c: New test. * gcc.dg/ipa/pr61986.c: New test.
......
/* { 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;
}
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