Fix for PR64068 and PR64559.

* g++.dg/ipa/pr64068.C: New test.
	* gcc.dg/ipa/PR64559.c: New test.
	PR ipa/64068
	PR ipa/64559
	* ipa.c (symbol_table::remove_unreachable_nodes):
	Do not put abstract origins into boundary.

From-SVN: r219672
This commit is contained in:
Martin Liska 2015-01-15 17:29:23 +00:00
parent 40d54d2432
commit c23127ce74
5 changed files with 100 additions and 1 deletions

View file

@ -1,3 +1,10 @@
2015-01-15 Jan Hubicka <hubicka@ucw.cz>
PR ipa/64068
PR ipa/64559
* ipa.c (symbol_table::remove_unreachable_nodes):
Do not put abstract origins into boundary.
2015-01-15 Evgeny Stupachenko <evstupac@gmail.com>
* config/i386/gnu-user.h (CRT_GET_RFIB_DATA): Remove EBX register usage.

View file

@ -400,7 +400,6 @@ symbol_table::remove_unreachable_nodes (FILE *file)
n = n->next_sibling_clone)
if (n->decl == DECL_ABSTRACT_ORIGIN (node->decl))
n->used_as_abstract_origin = true;
enqueue_node (origin_node, &first, &reachable);
}
}
/* If any symbol in a comdat group is reachable, force

View file

@ -1,3 +1,8 @@
2015-01-15 Martin Liska <mliska@suse.cz>
* g++.dg/ipa/pr64068.C: New test.
* gcc.dg/ipa/PR64559.c: New test.
2015-01-15 H.J. Lu <hongjiu.lu@intel.com>
* g++.dg/other/anon5.C: Ignore additional messages on Linux/x86

View file

@ -0,0 +1,49 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
typedef int PROV_ENUMALGS_EX, PCCRYPT_OID_INFO;
class A {
int m_fn2();
virtual bool m_fn1(PCCRYPT_OID_INFO);
};
int fn1();
void fn2();
int A::m_fn2() { m_fn1(0); }
bool fn3() {
for (;;) {
if (fn1()) {
if (fn1() != 259)
fn2();
break;
}
return 1;
}
return 0;
}
class B {
public:
B() { fn3(); }
};
class C : A {
bool m_fn1(PCCRYPT_OID_INFO) { m_fn3(); }
int isSupportedByProvider_algId;
PROV_ENUMALGS_EX isSupportedByProvider_outEnumAlgs;
PROV_ENUMALGS_EX isSupportedByProvider_enumAlgs;
bool m_fn3() {
while (1) {
if (fn1()) {
if (fn1() != 259)
fn2();
break;
}
if (isSupportedByProvider_algId)
isSupportedByProvider_outEnumAlgs = isSupportedByProvider_enumAlgs;
return 1;
}
return 0;
}
};
void fn4() { B(); }

View file

@ -0,0 +1,39 @@
/* { dg-do compile } */
/* { dg-options "-Os" } */
int a, b, c, d;
struct S
{
int f0;
};
static int
fn1 (int p)
{
return p == 0 || a;
}
static int
fn2 ()
{
d = fn1 (c);
return 0;
}
static int
fn3 (struct S p)
{
p.f0 || fn2 ();
if (fn1 (1))
b = 0;
return 0;
}
int
main ()
{
struct S e = { 1 };
fn3 (e);
return 0;
}