Hello. Another 4 patches that I've just tests and bootsrapped.
Martin
>From af6233cb16c9dc174ef4e45da06c43bfd5442d4e Mon Sep 17 00:00:00 2001 From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Thu, 4 Jan 2018 21:13:17 +0000 Subject: Backport r256266 gcc/testsuite/ChangeLog: 2018-01-04 Jakub Jelinek <ja...@redhat.com> PR ipa/82352 * g++.dg/ipa/pr82352.C (size_t): Define to __SIZE_TYPE__ instead of long unsigned int. --- diff --git a/gcc/testsuite/g++.dg/ipa/pr82352.C b/gcc/testsuite/g++.dg/ipa/pr82352.C index c044345a486..08516da0c8a 100644 --- a/gcc/testsuite/g++.dg/ipa/pr82352.C +++ b/gcc/testsuite/g++.dg/ipa/pr82352.C @@ -2,7 +2,7 @@ // { dg-do compile } // { dg-options "-O2" } -typedef long unsigned int size_t; +typedef __SIZE_TYPE__ size_t; class A { -- 2.14.3
>From 6ed5216d2b8b2be5c9373a9f9dc0c38ef09abce7 Mon Sep 17 00:00:00 2001 From: marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Thu, 4 Jan 2018 08:54:17 +0000 Subject: Backport r256226 gcc/ChangeLog: 2018-01-04 Martin Liska <mli...@suse.cz> PR ipa/82352 * ipa-icf.c (sem_function::merge): Do not cross comdat boundary. gcc/testsuite/ChangeLog: 2018-01-04 Martin Liska <mli...@suse.cz> PR ipa/82352 * g++.dg/ipa/pr82352.C: New test. --- diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index edb0b7896cd..b9f2bf30744 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -1113,6 +1113,17 @@ sem_function::merge (sem_item *alias_item) return false; } + if (!original->in_same_comdat_group_p (alias) + || original->comdat_local_p ()) + { + if (dump_file) + fprintf (dump_file, + "Not unifying; alias nor wrapper cannot be created; " + "across comdat group boundary\n\n"); + + return false; + } + /* See if original is in a section that can be discarded if the main symbol is not used. */ diff --git a/gcc/testsuite/g++.dg/ipa/pr82352.C b/gcc/testsuite/g++.dg/ipa/pr82352.C new file mode 100644 index 00000000000..c044345a486 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr82352.C @@ -0,0 +1,93 @@ +// PR ipa/82352 +// { dg-do compile } +// { dg-options "-O2" } + +typedef long unsigned int size_t; + +class A +{ +public : + typedef enum { Zero = 0, One = 1 } tA; + A(tA a) { m_a = a; } + +private : + tA m_a; +}; + +class B +{ +public : + void *operator new(size_t t) { return (void*)(42); }; +}; + +class C +{ +public: + virtual void ffff () = 0; +}; + +class D +{ + public : + virtual void g() = 0; + virtual void h() = 0; +}; + +template<class T> class IIII: public T, public D +{ +public: + void ffff() + { + if (!m_i2) throw A(A::One); + }; + + void h() + { + if (m_i2) throw A(A::Zero); + } + +protected: + virtual void g() + { + if (m_i1 !=0) throw A(A::Zero); + }; + +private : + int m_i1; + void *m_i2; +}; + +class E +{ +private: + size_t m_e; + static const size_t Max; + +public: + E& i(size_t a, size_t b, size_t c) + { + if ((a > Max) || (c > Max)) throw A(A::Zero ); + if (a + b > m_e) throw A(A::One ); + return (*this); + } + + inline E& j(const E &s) + { + return i(0,0,s.m_e); + } +}; + +class F : public C { }; +class G : public C { }; +class HHHH : public B, public F, public G { }; + +void k() +{ + new IIII<HHHH>(); +} + +void l() +{ + E e1, e2; + e1.j(e2); +} -- 2.14.3
>From f7491b347eed2606bcaf8ae8497f8fae3738ec6e Mon Sep 17 00:00:00 2001 From: marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Wed, 3 Jan 2018 14:15:58 +0000 Subject: Backport r256177 gcc/ChangeLog: 2018-01-03 Martin Liska <mli...@suse.cz> PR ipa/83549 * cif-code.def (VARIADIC_THUNK): New enum value. * ipa-fnsummary.c (compute_fn_summary): Do not inline variadic thunks. gcc/testsuite/ChangeLog: 2018-01-03 Martin Liska <mli...@suse.cz> PR ipa/83549 * g++.dg/ipa/pr83549.C: New test. --- diff --git a/gcc/cif-code.def b/gcc/cif-code.def index 6d7e2b4070b..19a76213943 100644 --- a/gcc/cif-code.def +++ b/gcc/cif-code.def @@ -95,6 +95,10 @@ DEFCIFCODE(MISMATCHED_ARGUMENTS, CIF_FINAL_ERROR, DEFCIFCODE(LTO_MISMATCHED_DECLARATIONS, CIF_FINAL_ERROR, N_("mismatched declarations during linktime optimization")) +/* Caller is variadic thunk. */ +DEFCIFCODE(VARIADIC_THUNK, CIF_FINAL_ERROR, + N_("variadic thunk call")) + /* Call was originally indirect. */ DEFCIFCODE(ORIGINALLY_INDIRECT_CALL, CIF_FINAL_NORMAL, N_("originally indirect function call not considered for inlining")) diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c index fc18518d48f..e9f76d5cdac 100644 --- a/gcc/ipa-fnsummary.c +++ b/gcc/ipa-fnsummary.c @@ -2422,6 +2422,11 @@ compute_fn_summary (struct cgraph_node *node, bool early) info->inlinable = false; node->callees->inline_failed = CIF_CHKP; } + else if (stdarg_p (TREE_TYPE (node->decl))) + { + info->inlinable = false; + node->callees->inline_failed = CIF_VARIADIC_THUNK; + } else info->inlinable = true; } diff --git a/gcc/testsuite/g++.dg/ipa/pr83549.C b/gcc/testsuite/g++.dg/ipa/pr83549.C new file mode 100644 index 00000000000..90cf8fe7e0d --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr83549.C @@ -0,0 +1,8 @@ +// PR ipa/83549 +// { dg-do compile } +// { dg-options "-O2" } + +struct A { virtual ~A (); }; +struct B { virtual void foo (...); }; +struct C : A, B { void foo (...) {} }; +C c; -- 2.14.3
>From 1abfa5b17a752895ddcfde4aa6e3931142d27a26 Mon Sep 17 00:00:00 2001 From: marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Wed, 27 Dec 2017 09:30:14 +0000 Subject: Backport r256009 gcc/ChangeLog: 2017-12-27 Martin Liska <mli...@suse.cz> PR tree-optimization/83552 * tree-ssa-strlen.c (fold_strstr_to_strncmp): Assign result of get_string_lenth to a SSA_NAME if not a GIMPLE value. gcc/testsuite/ChangeLog: 2017-12-27 Martin Liska <mli...@suse.cz> PR tree-optimization/83552 * gcc.dg/pr83552.c: New test. --- diff --git a/gcc/testsuite/gcc.dg/pr83552.c b/gcc/testsuite/gcc.dg/pr83552.c new file mode 100644 index 00000000000..993cdd26581 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83552.c @@ -0,0 +1,13 @@ +/* PR tree-optimization/83364 */ +/* { dg-options "-O2" } */ + +char *b; +char d[100]; +void a (); +void +c (void) +{ + __builtin_strcat (d, "12345"); + if (__builtin_strstr (b, d) == b) + a (); +} diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index e812bd1e735..be6ab9f1e1b 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -3005,6 +3005,16 @@ fold_strstr_to_strncmp (tree rhs1, tree rhs2, gimple *stmt) { gimple_stmt_iterator gsi = gsi_for_stmt (call_stmt); tree strncmp_decl = builtin_decl_explicit (BUILT_IN_STRNCMP); + + if (!is_gimple_val (arg1_len)) + { + tree arg1_len_tmp = make_ssa_name (TREE_TYPE (arg1_len)); + gassign *arg1_stmt = gimple_build_assign (arg1_len_tmp, + arg1_len); + gsi_insert_before (&gsi, arg1_stmt, GSI_SAME_STMT); + arg1_len = arg1_len_tmp; + } + gcall *strncmp_call = gimple_build_call (strncmp_decl, 3, arg0, arg1, arg1_len); tree strncmp_lhs = make_ssa_name (integer_type_node); -- 2.14.3