diff options
author | doko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca> | 2014-06-16 09:03:56 +0000 |
---|---|---|
committer | doko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca> | 2014-06-16 09:03:56 +0000 |
commit | 16354269ab365409fdd5c8e4d571abac09995b6b (patch) | |
tree | eaab6e61e5552a86b4b3a10bb238bff900fdc52a /debian | |
parent | 887e2b58571a2d1035b56a6e9ddb78143104fad7 (diff) | |
download | gcc-49-16354269ab365409fdd5c8e4d571abac09995b6b.tar.gz |
* Update to SVN 20140616 (r211699) from the gcc-4_9-branch.
git-svn-id: svn://svn.debian.org/svn/gcccvs/branches/sid/gcc-4.9@7457 6ca36cf4-e1d1-0310-8c6f-e303bb2178ca
Diffstat (limited to 'debian')
-rw-r--r-- | debian/changelog | 4 | ||||
-rw-r--r-- | debian/patches/svn-updates.diff | 2463 |
2 files changed, 2302 insertions, 165 deletions
diff --git a/debian/changelog b/debian/changelog index 46d0eb1..5b752a0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,7 @@ gcc-4.9 (4.9.0-7) UNRELEASED; urgency=medium + * Update to SVN 20140616 (r211699) from the gcc-4_9-branch. + [ Matthias Klose ] * Update to SVN 20140610 (r211403) from the gcc-4_9-branch. * Fix patch application for powerpcspe (Helmit Grohne). Closes: #751001. @@ -9,7 +11,7 @@ gcc-4.9 (4.9.0-7) UNRELEASED; urgency=medium [ Aurelien Jarno ] * Fix PR c++/61336, taken from the trunk. - -- Matthias Klose <doko@debian.org> Tue, 10 Jun 2014 12:21:42 +0200 + -- Matthias Klose <doko@debian.org> Mon, 16 Jun 2014 10:59:16 +0200 gcc-4.9 (4.9.0-6) unstable; urgency=medium diff --git a/debian/patches/svn-updates.diff b/debian/patches/svn-updates.diff index bb02b1c..1d5f19c 100644 --- a/debian/patches/svn-updates.diff +++ b/debian/patches/svn-updates.diff @@ -1,10 +1,10 @@ -# DP: updates from the 4.9 branch upto 20140610 (r211403). +# DP: updates from the 4.9 branch upto 20140616 (r211699). last_updated() { cat > ${dir}LAST_UPDATED <<EOF -Tue Jun 10 12:11:03 CEST 2014 -Tue Jun 10 10:11:03 UTC 2014 (revision 211403) +Mon Jun 16 10:55:09 CEST 2014 +Mon Jun 16 08:55:09 UTC 2014 (revision 211699) EOF } @@ -1009,7 +1009,7 @@ Index: libstdc++-v3/include/std/tuple =================================================================== --- a/src/libstdc++-v3/include/std/tuple (.../tags/gcc_4_9_0_release) +++ b/src/libstdc++-v3/include/std/tuple (.../branches/gcc-4_9-branch) -@@ -710,6 +710,11 @@ +@@ -710,27 +710,28 @@ add_cv<typename tuple_element<__i, _Tp>::type>::type type; }; @@ -1021,37 +1021,80 @@ Index: libstdc++-v3/include/std/tuple /// Finds the size of a given tuple type. template<typename _Tp> struct tuple_size; -@@ -755,7 +760,7 @@ + ++ // _GLIBCXX_RESOLVE_LIB_DEFECTS ++ // 2313. tuple_size should always derive from integral_constant<size_t, N> + template<typename _Tp> + struct tuple_size<const _Tp> +- : public integral_constant< +- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type, +- tuple_size<_Tp>::value> { }; ++ : public integral_constant<size_t, tuple_size<_Tp>::value> { }; + + template<typename _Tp> + struct tuple_size<volatile _Tp> +- : public integral_constant< +- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type, +- tuple_size<_Tp>::value> { }; ++ : public integral_constant<size_t, tuple_size<_Tp>::value> { }; + + template<typename _Tp> + struct tuple_size<const volatile _Tp> +- : public integral_constant< +- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type, +- tuple_size<_Tp>::value> { }; ++ : public integral_constant<size_t, tuple_size<_Tp>::value> { }; + + /// class tuple_size + template<typename... _Elements> +@@ -747,23 +748,23 @@ + __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept + { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } + +- // Return a reference (const reference, rvalue reference) to the ith element +- // of a tuple. Any const or non-const ref elements are returned with their +- // original type. ++ /// Return a reference to the ith element of a tuple. + template<std::size_t __i, typename... _Elements> + constexpr typename __add_ref< typename tuple_element<__i, tuple<_Elements...>>::type >::type get(tuple<_Elements...>& __t) noexcept - { return __get_helper<__i>(__t); } + { return std::__get_helper<__i>(__t); } ++ /// Return a const reference to the ith element of a const tuple. template<std::size_t __i, typename... _Elements> constexpr typename __add_c_ref< -@@ -762,7 +767,7 @@ typename tuple_element<__i, tuple<_Elements...>>::type >::type get(const tuple<_Elements...>& __t) noexcept - { return __get_helper<__i>(__t); } + { return std::__get_helper<__i>(__t); } ++ /// Return an rvalue reference to the ith element of a tuple rvalue. template<std::size_t __i, typename... _Elements> constexpr typename __add_r_ref< -@@ -786,17 +791,17 @@ + typename tuple_element<__i, tuple<_Elements...>>::type +@@ -783,22 +784,26 @@ + __get_helper2(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept + { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); } + ++ /// Return a reference to the unique element of type _Tp of a tuple. template <typename _Tp, typename... _Types> constexpr _Tp& get(tuple<_Types...>& __t) noexcept - { return __get_helper2<_Tp>(__t); } + { return std::__get_helper2<_Tp>(__t); } ++ /// Return a reference to the unique element of type _Tp of a tuple rvalue. template <typename _Tp, typename... _Types> constexpr _Tp&& get(tuple<_Types...>&& __t) noexcept - { return std::move(__get_helper2<_Tp>(__t)); } -+ { return std::move(std::__get_helper2<_Tp>(__t)); } ++ { return std::forward<_Tp&&>(std::__get_helper2<_Tp>(__t)); } ++ /// Return a const reference to the unique element of type _Tp of a tuple. template <typename _Tp, typename... _Types> constexpr const _Tp& get(const tuple<_Types...>& __t) noexcept @@ -1059,7 +1102,10 @@ Index: libstdc++-v3/include/std/tuple + { return std::__get_helper2<_Tp>(__t); } #endif ++ // This class helps construct the various comparison operations on tuples + template<std::size_t __check_equal_size, std::size_t __i, std::size_t __j, + typename _Tp, typename _Up> Index: libstdc++-v3/include/std/iomanip =================================================================== --- a/src/libstdc++-v3/include/std/iomanip (.../tags/gcc_4_9_0_release) @@ -1151,6 +1197,64 @@ Index: libstdc++-v3/include/std/iomanip } /** +Index: libstdc++-v3/include/std/type_traits +=================================================================== +--- a/src/libstdc++-v3/include/std/type_traits (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/include/std/type_traits (.../branches/gcc-4_9-branch) +@@ -37,6 +37,18 @@ + + #include <bits/c++config.h> + ++#ifdef _GLIBCXX_USE_C99_STDINT_TR1 ++# if defined (__UINT_LEAST16_TYPE__) && defined(__UINT_LEAST32_TYPE__) ++namespace std ++{ ++ typedef __UINT_LEAST16_TYPE__ uint_least16_t; ++ typedef __UINT_LEAST32_TYPE__ uint_least32_t; ++} ++# else ++# include <cstdint> ++# endif ++#endif ++ + namespace std _GLIBCXX_VISIBILITY(default) + { + _GLIBCXX_BEGIN_NAMESPACE_VERSION +@@ -1583,6 +1595,12 @@ + struct __make_unsigned<long long> + { typedef unsigned long long __type; }; + ++#if defined(_GLIBCXX_USE_WCHAR_T) && !defined(__WCHAR_UNSIGNED__) ++ template<> ++ struct __make_unsigned<wchar_t> : __make_unsigned<__WCHAR_TYPE__> ++ { }; ++#endif ++ + #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128) + template<> + struct __make_unsigned<__int128> +@@ -1665,6 +1683,21 @@ + struct __make_signed<unsigned long long> + { typedef signed long long __type; }; + ++#if defined(_GLIBCXX_USE_WCHAR_T) && defined(__WCHAR_UNSIGNED__) ++ template<> ++ struct __make_signed<wchar_t> : __make_signed<__WCHAR_TYPE__> ++ { }; ++#endif ++ ++#ifdef _GLIBCXX_USE_C99_STDINT_TR1 ++ template<> ++ struct __make_signed<char16_t> : __make_signed<uint_least16_t> ++ { }; ++ template<> ++ struct __make_signed<char32_t> : __make_signed<uint_least32_t> ++ { }; ++#endif ++ + #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128) + template<> + struct __make_signed<unsigned __int128> Index: libstdc++-v3/include/std/future =================================================================== --- a/src/libstdc++-v3/include/std/future (.../tags/gcc_4_9_0_release) @@ -1973,7 +2077,37 @@ Index: libstdc++-v3/ChangeLog =================================================================== --- a/src/libstdc++-v3/ChangeLog (.../tags/gcc_4_9_0_release) +++ b/src/libstdc++-v3/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,156 @@ +@@ -1,3 +1,186 @@ ++2014-06-13 Jonathan Wakely <jwakely@redhat.com> ++ ++ Backport from mainline ++ PR libstdc++/60326 ++ * include/std/type_traits (__make_unsigned, __make_signed): Define ++ specializations for wchar_t, char16_t and char32_t. ++ * testsuite/20_util/make_signed/requirements/typedefs-4.cc: New. ++ * testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Correct ++ test for make_unsigned<volatile wchar_t>. ++ * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc: ++ Likewise. ++ * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error ++ line number. ++ * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: ++ Likewise. ++ * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: ++ Likewise. ++ ++ Backport from mainline ++ PR libstdc++/61269 ++ * include/std/type_traits: Move include outside namespace std. ++ * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error. ++ * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Likewise. ++ * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: ++ Likewise. ++ ++ * include/std/tuple (tuple_size<cv _Tp>): Implement LWG 2313. ++ (get<_Tp>(tuple<_Types...>&&)): Use forward instead of move. ++ * testsuite/20_util/tuple/element_access/get_by_type.cc: Test rvalues. ++ +2014-06-07 Ed Smith-Rowland <3dw4rd@verizon.net> + + Backport from mainline @@ -2830,6 +2964,19 @@ Index: libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc + tuple_element_t<0,tuple<foo,void,int> > q2(q1); + tuple_element_t<2,tuple<void,int,foo> > q3(q1); +} +Index: libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc +=================================================================== +--- a/src/libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc (.../branches/gcc-4_9-branch) +@@ -41,4 +41,8 @@ + get<1>(b)=5; + VERIFY(get<int>(b)==1 && get<int&>(b)==5 && get<const int&>(b)==2); + VERIFY(j==5); ++ // test rvalue overload: ++ VERIFY(get<int>(std::move(b))==1); ++ VERIFY(get<int&>(std::move(b))==5); ++ VERIFY(get<const int&>(std::move(b))==2); + } Index: libstdc++-v3/testsuite/20_util/tuple/60497.cc =================================================================== --- a/src/libstdc++-v3/testsuite/20_util/tuple/60497.cc (.../tags/gcc_4_9_0_release) @@ -2872,6 +3019,107 @@ Index: libstdc++-v3/testsuite/20_util/tuple/60497.cc +auto b = std::get<0>(ct); +auto c = std::get<element_type>(t); +auto d = std::get<element_type>(ct); +Index: libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc +=================================================================== +--- a/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc (.../branches/gcc-4_9-branch) +@@ -48,5 +48,5 @@ + // { dg-error "required from here" "" { target *-*-* } 40 } + // { dg-error "required from here" "" { target *-*-* } 42 } + +-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1714 } +-// { dg-error "declaration of" "" { target *-*-* } 1678 } ++// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1747 } ++// { dg-error "declaration of" "" { target *-*-* } 1711 } +Index: libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-4.cc +=================================================================== +--- a/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-4.cc (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-4.cc (.../branches/gcc-4_9-branch) +@@ -0,0 +1,33 @@ ++// { dg-options "-std=gnu++11" } ++// { dg-do compile } ++// { dg-require-cstdint "" } ++ ++// Copyright (C) 2014 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 3, or (at your option) ++// any later version. ++// ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++// ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING3. If not see ++// <http://www.gnu.org/licenses/>. ++ ++#include <type_traits> ++ ++// libstdc++/60326 ++ ++using namespace std; ++#ifdef _GLIBCXX_USE_WCHAR_T ++using wchar_signed = make_signed<wchar_t>::type; ++using wchar_unsigned = make_unsigned<wchar_t>::type; ++static_assert( !is_same<wchar_signed, wchar_unsigned>::value, "wchar_t" ); ++#endif ++static_assert( is_signed<make_signed<char16_t>::type>::value, "char16_t"); ++static_assert( is_signed<make_signed<char32_t>::type>::value, "char32_t"); +Index: libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc +=================================================================== +--- a/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc (.../branches/gcc-4_9-branch) +@@ -48,5 +48,5 @@ + // { dg-error "required from here" "" { target *-*-* } 40 } + // { dg-error "required from here" "" { target *-*-* } 42 } + +-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1632 } +-// { dg-error "declaration of" "" { target *-*-* } 1596 } ++// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1650 } ++// { dg-error "declaration of" "" { target *-*-* } 1614 } +Index: libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc +=================================================================== +--- a/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc (.../branches/gcc-4_9-branch) +@@ -49,7 +49,7 @@ + + #ifdef _GLIBCXX_USE_WCHAR_T + typedef make_unsigned<volatile wchar_t>::type test23_type; +- static_assert(is_same<test23_type, volatile wchar_t>::value, ""); ++ static_assert(is_same<test23_type, volatile unsigned wchar_t>::value, ""); + #endif + + // Chapter 48, chapter 20. Smallest rank such that new unsigned type +Index: libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc +=================================================================== +--- a/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc (.../branches/gcc-4_9-branch) +@@ -50,7 +50,7 @@ + + #ifdef _GLIBCXX_USE_WCHAR_T + typedef make_unsigned<volatile wchar_t>::type test23_type; +- static_assert(is_same<test23_type, volatile wchar_t>::value, ""); ++ static_assert(is_same<test23_type, volatile unsigned wchar_t>::value, ""); + #endif + + typedef make_unsigned<test_enum>::type test24_type; +Index: libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc +=================================================================== +--- a/src/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc (.../tags/gcc_4_9_0_release) ++++ b/src/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc (.../branches/gcc-4_9-branch) +@@ -19,7 +19,7 @@ + // with this library; see the file COPYING3. If not see + // <http://www.gnu.org/licenses/>. + +-// { dg-error "static assertion failed" "" { target *-*-* } 2003 } ++// { dg-error "static assertion failed" "" { target *-*-* } 2036 } + + #include <utility> + Index: libstdc++-v3/testsuite/20_util/shared_ptr/cons/61036.cc =================================================================== --- a/src/libstdc++-v3/testsuite/20_util/shared_ptr/cons/61036.cc (.../tags/gcc_4_9_0_release) @@ -3394,7 +3642,14 @@ Index: gcc/c-family/ChangeLog =================================================================== --- a/src/gcc/c-family/ChangeLog (.../tags/gcc_4_9_0_release) +++ b/src/gcc/c-family/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,29 @@ +@@ -1,3 +1,36 @@ ++2014-06-12 Jakub Jelinek <jakub@redhat.com> ++ ++ PR middle-end/61486 ++ * c-omp.c (c_omp_split_clauses): Don't crash on firstprivate in ++ #pragma omp target teams or ++ #pragma omp {,target }teams distribute simd. ++ +2014-06-04 Marek Polacek <polacek@redhat.com> + + Backport from mainline @@ -3501,6 +3756,26 @@ Index: gcc/c-family/c-common.c *vecp = build1 (ADDR_EXPR, type1, *vecp); *vecp = convert (type, *vecp); } +Index: gcc/c-family/c-omp.c +=================================================================== +--- a/src/gcc/c-family/c-omp.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/c-family/c-omp.c (.../branches/gcc-4_9-branch) +@@ -789,8 +789,13 @@ + else if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS)) + != 0) + { +- /* This must be #pragma omp {,target }teams distribute. */ +- gcc_assert (code == OMP_DISTRIBUTE); ++ /* This must be one of ++ #pragma omp {,target }teams distribute ++ #pragma omp target teams ++ #pragma omp {,target }teams distribute simd. */ ++ gcc_assert (code == OMP_DISTRIBUTE ++ || code == OMP_TEAMS ++ || code == OMP_SIMD); + s = C_OMP_CLAUSE_SPLIT_TEAMS; + } + else if ((mask & (OMP_CLAUSE_MASK_1 Index: gcc/c-family/c-common.h =================================================================== --- a/src/gcc/c-family/c-common.h (.../tags/gcc_4_9_0_release) @@ -3673,7 +3948,7 @@ Index: gcc/DATESTAMP +++ b/src/gcc/DATESTAMP (.../branches/gcc-4_9-branch) @@ -1 +1 @@ -20140422 -+20140610 ++20140616 Index: gcc/tree-tailcall.c =================================================================== --- a/src/gcc/tree-tailcall.c (.../tags/gcc_4_9_0_release) @@ -4061,7 +4336,29 @@ Index: gcc/omp-low.c =================================================================== --- a/src/gcc/omp-low.c (.../tags/gcc_4_9_0_release) +++ b/src/gcc/omp-low.c (.../branches/gcc-4_9-branch) -@@ -1730,6 +1730,9 @@ +@@ -1509,11 +1509,19 @@ + break; + + case OMP_CLAUSE_SHARED: ++ decl = OMP_CLAUSE_DECL (c); + /* Ignore shared directives in teams construct. */ + if (gimple_code (ctx->stmt) == GIMPLE_OMP_TEAMS) +- break; ++ { ++ /* Global variables don't need to be copied, ++ the receiver side will use them directly. */ ++ tree odecl = maybe_lookup_decl_in_outer_ctx (decl, ctx); ++ if (is_global_var (odecl)) ++ break; ++ insert_decl_map (&ctx->cb, decl, odecl); ++ break; ++ } + gcc_assert (is_taskreg_ctx (ctx)); +- decl = OMP_CLAUSE_DECL (c); + gcc_assert (!COMPLETE_TYPE_P (TREE_TYPE (decl)) + || !is_variable_sized (decl)); + /* Global variables don't need to be copied, +@@ -1730,6 +1738,9 @@ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)) scan_array_reductions = true; @@ -4071,7 +4368,7 @@ Index: gcc/omp-low.c break; case OMP_CLAUSE_SHARED: -@@ -1816,6 +1819,9 @@ +@@ -1816,6 +1827,9 @@ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)) scan_omp (&OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c), ctx); @@ -4081,7 +4378,7 @@ Index: gcc/omp-low.c } /* Create a new name for omp child function. Returns an identifier. */ -@@ -2994,6 +3000,27 @@ +@@ -2994,6 +3008,27 @@ return true; } @@ -4109,7 +4406,7 @@ Index: gcc/omp-low.c /* Generate code to implement the input clauses, FIRSTPRIVATE and COPYIN, from the receiver (aka child) side and initializers for REFERENCE_TYPE private variables. Initialization statements go in ILIST, while calls -@@ -3185,13 +3212,11 @@ +@@ -3185,13 +3220,11 @@ } else if (TREE_CONSTANT (x)) { @@ -4128,7 +4425,7 @@ Index: gcc/omp-low.c x = NULL_TREE; else { -@@ -3520,23 +3545,7 @@ +@@ -3520,23 +3553,7 @@ But if they aren't used, we need to emit the deferred initialization now. */ else if (is_reference (var) && is_simd) @@ -4153,7 +4450,7 @@ Index: gcc/omp-low.c x = lang_hooks.decls.omp_clause_default_ctor (c, new_var, unshare_expr (x)); if (x) -@@ -3569,6 +3578,13 @@ +@@ -3569,6 +3586,13 @@ if (code == MINUS_EXPR) code = PLUS_EXPR; @@ -4167,7 +4464,7 @@ Index: gcc/omp-low.c if (is_simd && lower_rec_simd_input_clauses (new_var, ctx, max_vf, idx, lane, ivar, lvar)) -@@ -3580,9 +3596,18 @@ +@@ -3580,9 +3604,18 @@ x = build2 (code, TREE_TYPE (ref), ref, ivar); ref = build_outer_var_ref (var, ctx); gimplify_assign (ref, x, &llist[1]); @@ -4186,7 +4483,7 @@ Index: gcc/omp-low.c gimplify_assign (new_var, x, ilist); if (is_simd) { -@@ -3803,6 +3828,14 @@ +@@ -3803,6 +3836,14 @@ OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c)); OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) = NULL; } @@ -4201,7 +4498,7 @@ Index: gcc/omp-low.c x = build_outer_var_ref (var, ctx); if (is_reference (var)) -@@ -5570,6 +5603,12 @@ +@@ -5570,6 +5611,12 @@ { stmt = gimple_build_assign (endvar, iend); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); @@ -4214,7 +4511,7 @@ Index: gcc/omp-low.c } if (fd->collapse > 1) expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); -@@ -5986,6 +6025,12 @@ +@@ -5986,6 +6033,12 @@ { stmt = gimple_build_assign (endvar, e); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); @@ -4227,7 +4524,7 @@ Index: gcc/omp-low.c } if (fd->collapse > 1) expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar); -@@ -6371,6 +6416,12 @@ +@@ -6371,6 +6424,12 @@ { stmt = gimple_build_assign (endvar, e); gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING); @@ -4240,7 +4537,7 @@ Index: gcc/omp-low.c } if (fd->collapse > 1) expand_omp_for_init_vars (fd, &si, counts, inner_stmt, startvar); -@@ -11291,45 +11342,53 @@ +@@ -11291,45 +11350,53 @@ ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data) { struct walk_stmt_info *wi = (struct walk_stmt_info *) data; @@ -4323,7 +4620,7 @@ Index: gcc/omp-low.c { tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*tp), repl); *tp = vce; -@@ -11338,8 +11397,6 @@ +@@ -11338,8 +11405,6 @@ *tp = repl; info->modified = true; @@ -4332,7 +4629,7 @@ Index: gcc/omp-low.c return NULL_TREE; } -@@ -11358,7 +11415,7 @@ +@@ -11358,7 +11423,7 @@ tree retval_array, tree iter) { basic_block bb; @@ -4341,7 +4638,7 @@ Index: gcc/omp-low.c /* Re-use the adjustments array, but this time use it to replace every function argument use to an offset into the corresponding -@@ -11381,6 +11438,46 @@ +@@ -11381,6 +11446,46 @@ j += node->simdclone->simdlen / TYPE_VECTOR_SUBPARTS (vectype) - 1; } @@ -4419,11 +4716,270 @@ Index: gcc/ipa-inline-transform.c alias = next_alias; } else +Index: gcc/tree-ssa-sccvn.c +=================================================================== +--- a/src/gcc/tree-ssa-sccvn.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/tree-ssa-sccvn.c (.../branches/gcc-4_9-branch) +@@ -3074,33 +3074,12 @@ + /* If all value numbered to the same value, the phi node has that + value. */ + if (allsame) +- { +- if (is_gimple_min_invariant (sameval)) +- { +- VN_INFO (PHI_RESULT (phi))->has_constants = true; +- VN_INFO (PHI_RESULT (phi))->expr = sameval; +- } +- else +- { +- VN_INFO (PHI_RESULT (phi))->has_constants = false; +- VN_INFO (PHI_RESULT (phi))->expr = sameval; +- } ++ return set_ssa_val_to (PHI_RESULT (phi), sameval); + +- if (TREE_CODE (sameval) == SSA_NAME) +- return visit_copy (PHI_RESULT (phi), sameval); +- +- return set_ssa_val_to (PHI_RESULT (phi), sameval); +- } +- + /* Otherwise, see if it is equivalent to a phi node in this block. */ + result = vn_phi_lookup (phi); + if (result) +- { +- if (TREE_CODE (result) == SSA_NAME) +- changed = visit_copy (PHI_RESULT (phi), result); +- else +- changed = set_ssa_val_to (PHI_RESULT (phi), result); +- } ++ changed = set_ssa_val_to (PHI_RESULT (phi), result); + else + { + vn_phi_insert (phi, PHI_RESULT (phi)); +@@ -3214,24 +3193,18 @@ + catch those with constants. The goal here is to simultaneously + combine constants between expressions, but avoid infinite + expansion of expressions during simplification. */ +- if (TREE_CODE (op0) == SSA_NAME) +- { +- if (VN_INFO (op0)->has_constants ++ op0 = vn_valueize (op0); ++ if (TREE_CODE (op0) == SSA_NAME ++ && (VN_INFO (op0)->has_constants + || TREE_CODE_CLASS (code) == tcc_comparison +- || code == COMPLEX_EXPR) +- op0 = valueize_expr (vn_get_expr_for (op0)); +- else +- op0 = vn_valueize (op0); +- } ++ || code == COMPLEX_EXPR)) ++ op0 = valueize_expr (vn_get_expr_for (op0)); + +- if (TREE_CODE (op1) == SSA_NAME) +- { +- if (VN_INFO (op1)->has_constants +- || code == COMPLEX_EXPR) +- op1 = valueize_expr (vn_get_expr_for (op1)); +- else +- op1 = vn_valueize (op1); +- } ++ op1 = vn_valueize (op1); ++ if (TREE_CODE (op1) == SSA_NAME ++ && (VN_INFO (op1)->has_constants ++ || code == COMPLEX_EXPR)) ++ op1 = valueize_expr (vn_get_expr_for (op1)); + + /* Pointer plus constant can be represented as invariant address. + Do so to allow further propatation, see also tree forwprop. */ +@@ -3289,24 +3262,28 @@ + return NULL_TREE; + + orig_op0 = op0; +- if (VN_INFO (op0)->has_constants) +- op0 = valueize_expr (vn_get_expr_for (op0)); +- else if (CONVERT_EXPR_CODE_P (code) +- || code == REALPART_EXPR +- || code == IMAGPART_EXPR +- || code == VIEW_CONVERT_EXPR +- || code == BIT_FIELD_REF) ++ op0 = vn_valueize (op0); ++ if (TREE_CODE (op0) == SSA_NAME) + { +- /* We want to do tree-combining on conversion-like expressions. +- Make sure we feed only SSA_NAMEs or constants to fold though. */ +- tree tem = valueize_expr (vn_get_expr_for (op0)); +- if (UNARY_CLASS_P (tem) +- || BINARY_CLASS_P (tem) +- || TREE_CODE (tem) == VIEW_CONVERT_EXPR +- || TREE_CODE (tem) == SSA_NAME +- || TREE_CODE (tem) == CONSTRUCTOR +- || is_gimple_min_invariant (tem)) +- op0 = tem; ++ if (VN_INFO (op0)->has_constants) ++ op0 = valueize_expr (vn_get_expr_for (op0)); ++ else if (CONVERT_EXPR_CODE_P (code) ++ || code == REALPART_EXPR ++ || code == IMAGPART_EXPR ++ || code == VIEW_CONVERT_EXPR ++ || code == BIT_FIELD_REF) ++ { ++ /* We want to do tree-combining on conversion-like expressions. ++ Make sure we feed only SSA_NAMEs or constants to fold though. */ ++ tree tem = valueize_expr (vn_get_expr_for (op0)); ++ if (UNARY_CLASS_P (tem) ++ || BINARY_CLASS_P (tem) ++ || TREE_CODE (tem) == VIEW_CONVERT_EXPR ++ || TREE_CODE (tem) == SSA_NAME ++ || TREE_CODE (tem) == CONSTRUCTOR ++ || is_gimple_min_invariant (tem)) ++ op0 = tem; ++ } + } + + /* Avoid folding if nothing changed, but remember the expression. */ Index: gcc/ChangeLog =================================================================== --- a/src/gcc/ChangeLog (.../tags/gcc_4_9_0_release) +++ b/src/gcc/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,1015 @@ +@@ -1,3 +1,1153 @@ ++2014-06-18 Jakub Jelinek <jakub@redhat.com> ++ ++ PR plugins/45078 ++ * config.gcc (arm*-*-linux-*): Include vxworks-dummy.h in tm_file. ++ ++2014-06-13 Peter Bergner <bergner@vnet.ibm.com> ++ ++ Backport from mainline ++ ++ 2014-06-13 Peter Bergner <bergner@vnet.ibm.com> ++ PR target/61415 ++ * config/rs6000/rs6000-builtin.def (BU_MISC_1): Delete. ++ (BU_MISC_2): Rename to ... ++ (BU_LDBL128_2): ... this. ++ * config/rs6000/rs6000.h (RS6000_BTM_LDBL128): New define. ++ (RS6000_BTM_COMMON): Add RS6000_BTM_LDBL128. ++ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Handle ++ RS6000_BTM_LDBL128. ++ (rs6000_invalid_builtin): Add long double 128-bit builtin support. ++ (rs6000_builtin_mask_names): Add RS6000_BTM_LDBL128. ++ * config/rs6000/rs6000.md (unpacktf_0): Remove define)expand. ++ (unpacktf_1): Likewise. ++ * doc/extend.texi (__builtin_longdouble_dw0): Remove documentation. ++ (__builtin_longdouble_dw1): Likewise. ++ * doc/sourcebuild.texi (longdouble128): Document. ++ ++2014-06-13 Jeff Law <law@redhat.com> ++ ++ Backports from mainline: ++ 2014-06-13 Jeff Law <law@redhat.com> ++ ++ PR rtl-optimization/61094 ++ PR rtl-optimization/61446 ++ * ree.c (combine_reaching_defs): Get the mode for the copy from ++ the extension insn rather than the defining insn. ++ ++ 2014-06-02 Jeff Law <law@redhat.com> ++ ++ PR rtl-optimization/61094 ++ * ree.c (combine_reaching_defs): Do not reextend an insn if it ++ was marked as do_no_reextend. If a copy is needed to eliminate ++ an extension, then mark it as do_not_reextend. ++ ++2014-06-13 Martin Jambor <mjambor@suse.cz> ++ ++ PR ipa/61186 ++ * ipa-devirt.c (possible_polymorphic_call_targets): Store NULL to ++ cache_token if returning early. ++ ++2014-06-12 Jakub Jelinek <jakub@redhat.com> ++ ++ PR middle-end/61486 ++ * gimplify.c (struct gimplify_omp_ctx): Add distribute field. ++ (gimplify_adjust_omp_clauses): Don't or in GOVD_LASTPRIVATE ++ if outer combined construct is distribute. ++ (gimplify_omp_for): For OMP_DISTRIBUTE set ++ gimplify_omp_ctxp->distribute. ++ * omp-low.c (scan_sharing_clauses) <case OMP_CLAUSE_SHARED>: For ++ GIMPLE_OMP_TEAMS, if decl isn't global in outer context, record ++ mapping into decl map. ++ ++2014-06-12 Jeff Law <law@redhat.com> ++ ++ Backports from mainline: ++ ++ 2014-06-12 Jeff Law <law@redhat.com> ++ ++ PR tree-optimization/61009 ++ * tree-ssa-threadedge.c (thread_through_normal_block): Correct return ++ value when we stop processing a block due to problematic PHIs. ++ ++ ++ 2014-06-05 Jeff Law <law@redhat.com> ++ ++ PR tree-optimization/61289 ++ * tree-ssa-threadedge.c (invalidate_equivalences): Remove SRC_MAP and ++ DST_MAP parameters. Invalidate by walking all the SSA_NAME_VALUES ++ looking for those which match LHS. All callers changed. ++ (record_temporary_equivalences_from_phis): Remove SRC_MAP and DST_MAP ++ parameters and code which manipulated them. All callers changed. ++ (record_temporary_equivalences_from_stmts_at_dest): Remove SRC_MAP ++ and DST_MAP parameters. Simplify invalidation code by just calling ++ invalidate_equivalences. All callers changed. ++ (thread_across_edge): Simplify now that we don't need to maintain ++ the map of equivalences to invalidate. ++ ++2014-06-12 Eric Botcazou <ebotcazou@adacore.com> ++ ++ * tree-core.h (DECL_NONALIASED): Use proper spelling in comment. ++ ++2014-06-12 Georg-Johann Lay <avr@gjlay.de> ++ ++ Backport from 2014-05-14 trunk r210418 ++ * config/avr/avr.h (REG_CLASS_CONTENTS): Use unsigned suffix for ++ shifted values to avoid build warning. ++ ++2014-06-12 Georg-Johann Lay <avr@gjlay.de> ++ ++ Backport from 2014-05-09 trunk r210272 ++ ++ * config/avr/avr-fixed.md (round<mode>3): Use -1U instead of -1 in ++ unsigned int initializers for regno_in, regno_out. ++ ++ Backport from 2014-06-12 trunk r211491 ++ ++ PR target/61443 ++ * config/avr/avr.md (push<mode>1): Avoid (subreg(mem)) when ++ loading from address spaces. ++ ++2014-06-12 Alan Modra <amodra@gmail.com> ++ ++ PR target/61300 ++ * doc/tm.texi.in (INCOMING_REG_PARM_STACK_SPACE): Document. ++ * doc/tm.texi: Regenerate. ++ * function.c (INCOMING_REG_PARM_STACK_SPACE): Provide default. ++ Use throughout in place of REG_PARM_STACK_SPACE. ++ * config/rs6000/rs6000.c (rs6000_reg_parm_stack_space): Add ++ "incoming" param. Pass to rs6000_function_parms_need_stack. ++ (rs6000_function_parms_need_stack): Add "incoming" param, ignore ++ prototype_p when incoming. Use function decl when incoming ++ to handle K&R style functions. ++ * config/rs6000/rs6000.h (REG_PARM_STACK_SPACE): Adjust. ++ (INCOMING_REG_PARM_STACK_SPACE): Define. ++ ++2014-06-11 Richard Biener <rguenther@suse.de> ++ ++ PR tree-optimization/61452 ++ * tree-ssa-sccvn.c (visit_phi): Remove pointless setting of ++ expr and has_constants in case we found a leader. ++ (simplify_binary_expression): Always valueize operands first. ++ (simplify_unary_expression): Likewise. ++ ++2014-06-11 Richard Biener <rguenther@suse.de> ++ ++ PR middle-end/61456 ++ * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): ++ Do not use the main variant for the type comparison. ++ +2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + * doc/arm-acle-intrinsics.texi: Specify when CRC32 intrinsics are @@ -5439,7 +5995,7 @@ Index: gcc/ChangeLog 2014-04-22 Release Manager * GCC 4.9.0 released. -@@ -59,8 +1076,7 @@ +@@ -59,8 +1214,7 @@ 2014-04-11 Tobias Burnus <burnus@net-b.de> PR other/59055 @@ -5449,7 +6005,7 @@ Index: gcc/ChangeLog * doc/gcc.texi (Service): Update description in the @menu * doc/invoke.texi (Option Summary): Remove misplaced and duplicated @menu. -@@ -86,15 +1102,14 @@ +@@ -86,15 +1240,14 @@ 2014-04-11 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/60663 @@ -5468,7 +6024,7 @@ Index: gcc/ChangeLog 2014-04-10 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> -@@ -212,9 +1227,10 @@ +@@ -212,9 +1365,10 @@ 2014-04-05 Pitchumani Sivanupandi <Pitchumani.S@atmel.com> @@ -5482,7 +6038,7 @@ Index: gcc/ChangeLog * config/avr/avr-c.c (avr_cpu_cpp_builtins): use dev_attribute to check errata_skip. Add __AVR_ISA_RMW__ builtin macro if RMW ISA available. * config/avr/avr-devices.c (avr_mcu_types): Update AVR_MCU macro for -@@ -282,21 +1298,21 @@ +@@ -282,21 +1436,21 @@ 2014-04-04 Martin Jambor <mjambor@suse.cz> PR ipa/60640 @@ -5515,7 +6071,7 @@ Index: gcc/ChangeLog moved setting of a lot of flags to set_new_clone_decl_and_node_flags. 2014-04-04 Jeff Law <law@redhat.com> -@@ -334,8 +1350,8 @@ +@@ -334,8 +1488,8 @@ PR tree-optimization/60505 * tree-vectorizer.h (struct _stmt_vec_info): Add th field as the @@ -5526,7 +6082,7 @@ Index: gcc/ChangeLog * tree-vect-loop.c (new_loop_vec_info): Initialize LOOP_VINFO_COST_MODEL_THRESHOLD. * tree-vect-loop.c (vect_analyze_loop_operations): -@@ -347,8 +1363,7 @@ +@@ -347,8 +1501,7 @@ 2014-04-03 Richard Biener <rguenther@suse.de> @@ -5536,7 +6092,7 @@ Index: gcc/ChangeLog (streamer_tree_cache_create): Adjust. * tree-streamer.c (streamer_tree_cache_add_to_node_array): Adjust to allow optional nodes array. -@@ -359,8 +1374,7 @@ +@@ -359,8 +1512,7 @@ * lto-streamer-out.c (create_output_block): Avoid maintaining the node array in the writer cache. (DFS_write_tree): Remove assertion. @@ -5546,7 +6102,7 @@ Index: gcc/ChangeLog * lto-streamer-in.c (lto_data_in_create): Adjust for streamer_tree_cache_create prototype change. -@@ -381,24 +1395,6 @@ +@@ -381,24 +1533,6 @@ (Weffc++): Remove Scott's numbering, merge lists and reference Wnon-virtual-dtor. @@ -5571,7 +6127,7 @@ Index: gcc/ChangeLog 2014-04-03 Nick Clifton <nickc@redhat.com> * config/rl78/rl78-expand.md (movqi): Handle (SUBREG (SYMBOL_REF)) -@@ -414,8 +1410,8 @@ +@@ -414,8 +1548,8 @@ 2014-04-02 Jan Hubicka <hubicka@ucw.cz> PR ipa/60659 @@ -5582,7 +6138,7 @@ Index: gcc/ChangeLog (possible_polymorphic_call_targets): For inconsistent contexts return empty complete list. -@@ -519,8 +1515,7 @@ +@@ -519,8 +1653,7 @@ 2014-04-01 Richard Biener <rguenther@suse.de> @@ -5592,6 +6148,20 @@ Index: gcc/ChangeLog 2014-04-01 Sebastian Huber <sebastian.huber@embedded-brains.de> +@@ -1031,10 +2164,10 @@ + + PR tree-optimization/60577 + * tree-core.h (struct tree_base): Document nothrow_flag use +- in VAR_DECL_NONALIASED. +- * tree.h (VAR_DECL_NONALIASED): New. ++ in DECL_NONALIASED. ++ * tree.h (DECL_NONALIASED): New. + (may_be_aliased): Adjust. +- * coverage.c (build_var): Set VAR_DECL_NONALIASED. ++ * coverage.c (build_var): Set DECL_NONALIASED. + + 2014-03-20 Eric Botcazou <ebotcazou@adacore.com> + Index: gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c =================================================================== --- a/src/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c (.../tags/gcc_4_9_0_release) @@ -6157,15 +6727,28 @@ Index: gcc/testsuite/gcc.target/powerpc/bcd-3.c + + return ret; +} +Index: gcc/testsuite/gcc.target/powerpc/tfmode_off.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/powerpc/tfmode_off.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/gcc.target/powerpc/tfmode_off.c (.../branches/gcc-4_9-branch) +@@ -1,6 +1,7 @@ + /* { dg-do assemble } */ + /* { dg-skip-if "" { powerpc-ibm-aix* } { "*" } { "" } } */ + /* { dg-skip-if "no TFmode" { powerpc-*-eabi* } { "*" } { "" } } */ ++/* { dg-require-effective-target longdouble128 } */ + /* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps" } */ + + typedef float TFmode __attribute__ ((mode (TF))); Index: gcc/testsuite/gcc.target/powerpc/pack02.c =================================================================== --- a/src/gcc/testsuite/gcc.target/powerpc/pack02.c (.../tags/gcc_4_9_0_release) +++ b/src/gcc/testsuite/gcc.target/powerpc/pack02.c (.../branches/gcc-4_9-branch) -@@ -0,0 +1,95 @@ +@@ -0,0 +1,96 @@ +/* { dg-do run { target { powerpc*-*-linux* } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ +/* { dg-require-effective-target powerpc_fprs } */ ++/* { dg-require-effective-target longdouble128 } */ +/* { dg-options "-O2 -mhard-float" } */ + +#include <stddef.h> @@ -6496,6 +7079,145 @@ Index: gcc/testsuite/gcc.target/aarch64/pr61325.c + } + return count; +} +Index: gcc/testsuite/gcc.target/avr/torture/pr61443.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/avr/torture/pr61443.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/gcc.target/avr/torture/pr61443.c (.../branches/gcc-4_9-branch) +@@ -0,0 +1,134 @@ ++/* { dg-do run } */ ++/* { dg-options "-std=gnu99" } */ ++ ++#include <stdlib.h> ++#include <stdarg.h> ++ ++#define NC __attribute__((noinline,noclone)) ++ ++void NC vfun (char n, ...) ++{ ++ va_list ap; ++ ++ va_start (ap, n); ++ ++ switch (n) ++ { ++ default: ++ abort(); ++ case 1: ++ if (11 != va_arg (ap, int)) ++ abort(); ++ break; ++ case 2: ++ if (2222 != va_arg (ap, int)) ++ abort(); ++ break; ++ case 3: ++ if (333333 != va_arg (ap, __int24)) ++ abort(); ++ break; ++ case 4: ++ if (44444444 != va_arg (ap, long)) ++ abort(); ++ break; ++ case 8: ++ if (8888888888888888 != va_arg (ap, long long)) ++ abort(); ++ break; ++ } ++ ++ va_end (ap); ++} ++ ++ ++void NC boo_qi (const __flash char *p) ++{ ++ vfun (1, *p); ++} ++ ++void NC boox_qi (const __memx char *p) ++{ ++ vfun (1, *p); ++} ++ ++void NC boo_hi (const __flash int *p) ++{ ++ vfun (2, *p); ++} ++ ++void NC boox_hi (const __memx int *p) ++{ ++ vfun (2, *p); ++} ++ ++void NC boo_psi (const __flash __int24 *p) ++{ ++ vfun (3, *p); ++} ++ ++void NC boox_psi (const __memx __int24 *p) ++{ ++ vfun (3, *p); ++} ++ ++void NC boo_si (const __flash long *p) ++{ ++ vfun (4, *p); ++} ++ ++void NC boox_si (const __memx long *p) ++{ ++ vfun (4, *p); ++} ++ ++void NC boo_di (const __flash long long *p) ++{ ++ vfun (8, *p); ++} ++ ++void NC boox_di (const __memx long long *p) ++{ ++ vfun (8, *p); ++} ++ ++const __flash char f_qi = 11; ++const __flash int f_hi = 2222; ++const __flash __int24 f_psi = 333333; ++const __flash long f_si = 44444444; ++const __flash long long f_di = 8888888888888888; ++ ++const __memx char x_qi = 11; ++const __memx int x_hi = 2222; ++const __memx __int24 x_psi = 333333; ++const __memx long x_si = 44444444; ++const __memx long long x_di = 8888888888888888; ++ ++char r_qi = 11; ++int r_hi = 2222; ++__int24 r_psi = 333333; ++long r_si = 44444444; ++long long r_di = 8888888888888888; ++ ++int main (void) ++{ ++ boo_qi (&f_qi); ++ boo_hi (&f_hi); ++ boo_psi (&f_psi); ++ boo_si (&f_si); ++ boo_di (&f_di); ++ ++ boox_qi (&x_qi); ++ boox_hi (&x_hi); ++ boox_psi (&x_psi); ++ boox_si (&x_si); ++ boox_di (&x_di); ++ ++ boox_qi (&r_qi); ++ boox_hi (&r_hi); ++ boox_psi (&r_psi); ++ boox_si (&r_si); ++ boox_di (&r_di); ++ ++ exit (0); ++} Index: gcc/testsuite/gcc.target/avr/torture/pr61055.c =================================================================== --- a/src/gcc/testsuite/gcc.target/avr/torture/pr61055.c (.../tags/gcc_4_9_0_release) @@ -6821,6 +7543,25 @@ Index: gcc/testsuite/gcc.target/i386/pr60902.c + foo(); + exit (0); +} +Index: gcc/testsuite/gcc.target/i386/pr61446.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/pr61446.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/gcc.target/i386/pr61446.c (.../branches/gcc-4_9-branch) +@@ -0,0 +1,14 @@ ++/* PR rtl-optimization/61446 */ ++ ++/* { dg-do compile { target { ia32 } } } */ ++/* { dg-options "-O2 -march=corei7 -mfpmath=387" } */ ++ ++unsigned long long ++foo (float a) ++{ ++ const double dfa = a; ++ const unsigned int hi = dfa / 0x1p32f; ++ const unsigned int lo = dfa - (double) hi * 0x1p32f; ++ ++ return ((unsigned long long) hi << (4 * (8))) | lo; ++} Index: gcc/testsuite/gcc.target/i386/pr60909-2.c =================================================================== --- a/src/gcc/testsuite/gcc.target/i386/pr60909-2.c (.../tags/gcc_4_9_0_release) @@ -6986,7 +7727,23 @@ Index: gcc/testsuite/lib/target-supports.exp =================================================================== --- a/src/gcc/testsuite/lib/target-supports.exp (.../tags/gcc_4_9_0_release) +++ b/src/gcc/testsuite/lib/target-supports.exp (.../branches/gcc-4_9-branch) -@@ -1956,6 +1956,32 @@ +@@ -1862,6 +1862,15 @@ + }] + } + ++# Return 1 if the target supports long double of 128 bits, ++# 0 otherwise. ++ ++proc check_effective_target_longdouble128 { } { ++ return [check_no_compiler_messages longdouble128 object { ++ int dummy[sizeof(long double) == 16 ? 1 : -1]; ++ }] ++} ++ + # Return 1 if the target supports double of 64 bits, + # 0 otherwise. + +@@ -1956,6 +1965,32 @@ }] } @@ -7019,7 +7776,7 @@ Index: gcc/testsuite/lib/target-supports.exp # Return 1 if the target supports compiling and assembling UCN, 0 otherwise. proc check_effective_target_ucn_nocache { } { -@@ -4919,6 +4945,7 @@ +@@ -4919,6 +4954,7 @@ "vsx_hw" { set selected [check_vsx_hw_available] } "p8vector_hw" { set selected [check_p8vector_hw_available] } "ppc_recip_hw" { set selected [check_ppc_recip_hw_available] } @@ -7027,7 +7784,7 @@ Index: gcc/testsuite/lib/target-supports.exp "named_sections" { set selected [check_named_sections_available] } "gc_sections" { set selected [check_gc_sections_available] } "cxa_atexit" { set selected [check_cxa_atexit_available] } -@@ -4941,6 +4968,7 @@ +@@ -4941,6 +4977,7 @@ "vsx_hw" { return 1 } "p8vector_hw" { return 1 } "ppc_recip_hw" { return 1 } @@ -7035,6 +7792,29 @@ Index: gcc/testsuite/lib/target-supports.exp "named_sections" { return 1 } "gc_sections" { return 1 } "cxa_atexit" { return 1 } +Index: gcc/testsuite/gfortran.dg/cray_pointers_10.f90 +=================================================================== +--- a/src/gcc/testsuite/gfortran.dg/cray_pointers_10.f90 (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/gfortran.dg/cray_pointers_10.f90 (.../branches/gcc-4_9-branch) +@@ -0,0 +1,18 @@ ++! { dg-do run } ++! { dg-options "-fcray-pointer" } ++! ++! PR fortran/45187 ++! ++module foo ++ implicit none ++ real :: a ++ pointer(c_a, a) ++end module foo ++ ++program test ++ use foo ++ real :: z ++ c_a = loc(z) ++ a = 42 ++ if (z /= 42) call abort ++end program test Index: gcc/testsuite/gfortran.dg/arrayio_14.f90 =================================================================== --- a/src/gcc/testsuite/gfortran.dg/arrayio_14.f90 (.../tags/gcc_4_9_0_release) @@ -7812,6 +8592,42 @@ Index: gcc/testsuite/gcc.dg/torture/pr61010.c + unsigned b = (a * 64 & 192) | 63U; + return 0; +} +Index: gcc/testsuite/gcc.dg/torture/pr61452.c +=================================================================== +--- a/src/gcc/testsuite/gcc.dg/torture/pr61452.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/gcc.dg/torture/pr61452.c (.../branches/gcc-4_9-branch) +@@ -0,0 +1,31 @@ ++/* { dg-do run } */ ++ ++int a, b; ++short c, d; ++char e, f; ++ ++int ++fn1 (int p1, char p2) ++{ ++ return p1 || p2 ? 0 : p2; ++} ++ ++void ++fn2 () ++{ ++ for (; a;) ++ { ++ int g; ++ g = c = e; ++ for (; a;) ++ b = fn1 (g = d = e, g); ++ f = g; ++ } ++} ++ ++int ++main () ++{ ++ fn2 (); ++ return 0; ++} Index: gcc/testsuite/gcc.dg/torture/pr61383-1.c =================================================================== --- a/src/gcc/testsuite/gcc.dg/torture/pr61383-1.c (.../tags/gcc_4_9_0_release) @@ -8321,7 +9137,70 @@ Index: gcc/testsuite/ChangeLog =================================================================== --- a/src/gcc/testsuite/ChangeLog (.../tags/gcc_4_9_0_release) +++ b/src/gcc/testsuite/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,465 @@ +@@ -1,3 +1,528 @@ ++2014-06-15 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> ++ ++ Backport from trunk. ++ PR fortran/45187 ++ * gfortran.dg/cray_pointers_10.f90: New file. ++ ++2014-06-13 Peter Bergner <bergner@vnet.ibm.com> ++ ++ Backport from mainline ++ ++ 2014-06-13 Peter Bergner <bergner@vnet.ibm.com> ++ PR target/61415 ++ * lib/target-supports.exp (check_effective_target_longdouble128): New. ++ * gcc.target/powerpc/pack02.c: Use it. ++ * gcc.target/powerpc/tfmode_off.c: Likewise. ++ ++2014-06-13 Jeff Law <law@redhat.com> ++ ++ Backports from mainline: ++ ++ 2014-06-13 Ilya Enkovich <ilya.enkovich@intel.com> ++ ++ PR rtl-optimization/61094 ++ PR rtl-optimization/61446 ++ * gcc.target/i386/pr61446.c : New. ++ ++ 2014-06-02 Jeff Law <law@redhat.com> ++ ++ PR rtl-optimization/61094 ++ * g++.dg/pr61094: New test. ++ ++2014-06-12 Jakub Jelinek <jakub@redhat.com> ++ ++ PR middle-end/61486 ++ * c-c++-common/gomp/pr61486-1.c: New test. ++ * c-c++-common/gomp/pr61486-2.c: New test. ++ ++2014-06-12 Jeff Law <law@redhat.com> ++ ++ Backports from mainline: ++ 2014-06-05 Jeff Law <law@redhat.com> ++ ++ PR tree-optimization/61289 ++ * g++.dg/pr61289.C: New test. ++ * g++.dg/pr61289-2.C: New test. ++ ++2014-06-12 Georg-Johann Lay <avr@gjlay.de> ++ ++ Backport from 2014-06-12 trunk r211491 ++ ++ PR target/61443 ++ * gcc.target/avr/torture/pr61443.c: New test. ++ ++2014-06-11 Richard Biener <rguenther@suse.de> ++ ++ PR tree-optimization/61452 ++ * gcc.dg/torture/pr61452.c: New testcase. ++ ++2014-06-11 Richard Biener <rguenther@suse.de> ++ ++ PR middle-end/61456 ++ * g++.dg/opt/pr61456.C: New testcase. ++ +2014-06-09 Paul Thomas <pault@gcc.gnu.org> + + Backport from trunk. @@ -8787,7 +9666,7 @@ Index: gcc/testsuite/ChangeLog 2014-04-22 Release Manager * GCC 4.9.0 released. -@@ -51,7 +513,7 @@ +@@ -51,7 +576,7 @@ 2014-04-12 Jerry DeLisle <jvdelisle@gcc.gnu> PR libfortran/60810 @@ -8796,7 +9675,7 @@ Index: gcc/testsuite/ChangeLog 2014-04-11 Steve Ellcey <sellcey@mips.com> Jakub Jelinek <jakub@redhat.com> -@@ -135,8 +597,7 @@ +@@ -135,8 +660,7 @@ 2014-04-08 Jason Merrill <jason@redhat.com> @@ -8806,7 +9685,7 @@ Index: gcc/testsuite/ChangeLog 2014-04-08 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> -@@ -256,10 +717,10 @@ +@@ -256,10 +780,10 @@ 2014-04-04 Martin Jambor <mjambor@suse.cz> PR ipa/60640 @@ -8821,7 +9700,7 @@ Index: gcc/testsuite/ChangeLog 2014-04-04 Jeff Law <law@redhat.com> -@@ -371,7 +832,7 @@ +@@ -371,7 +895,7 @@ 2014-04-01 Fabien Chêne <fabien@gcc.gnu.org> @@ -8830,7 +9709,7 @@ Index: gcc/testsuite/ChangeLog * g++.dg/init/ctor4-1.C: New. * g++.dg/cpp0x/defaulted2.C: Adjust. -@@ -459,8 +920,8 @@ +@@ -459,8 +983,8 @@ 2014-03-27 Jeff Law <law@redhat.com> @@ -8841,7 +9720,7 @@ Index: gcc/testsuite/ChangeLog 2014-03-28 Adam Butcher <adam@jessamine.co.uk> -@@ -493,14 +954,13 @@ +@@ -493,14 +1017,13 @@ 2014-03-28 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> @@ -8859,7 +9738,7 @@ Index: gcc/testsuite/ChangeLog of second source operand. * gcc.target/i386/avx512f-vshuff64x2-2.c: Ditto. * gcc.target/i386/avx512f-vshufi32x4-2.c: Ditto. -@@ -635,8 +1095,8 @@ +@@ -635,8 +1158,8 @@ 2014-03-24 Marek Polacek <polacek@redhat.com> @@ -8870,7 +9749,7 @@ Index: gcc/testsuite/ChangeLog * c-c++-common/ubsan/overflow-1.c: Check for unwanted output. * c-c++-common/ubsan/overflow-add-1.c: Likewise. * c-c++-common/ubsan/overflow-mul-1.c: Likewise. -@@ -721,8 +1181,7 @@ +@@ -721,8 +1244,7 @@ 2014-03-21 Tobias Burnus <burnus@net-b.de> PR fortran/60599 @@ -8880,7 +9759,7 @@ Index: gcc/testsuite/ChangeLog 2014-03-20 Jakub Jelinek <jakub@redhat.com> -@@ -1540,8 +1999,7 @@ +@@ -1540,8 +2062,7 @@ 2014-02-19 Paul Pluzhnikov <ppluzhnikov@google.com> @@ -8890,7 +9769,7 @@ Index: gcc/testsuite/ChangeLog 2014-02-19 Jakub Jelinek <jakub@redhat.com> -@@ -1850,8 +2308,7 @@ +@@ -1850,8 +2371,7 @@ 2014-02-10 Jakub Jelinek <jakub@redhat.com> @@ -8900,7 +9779,7 @@ Index: gcc/testsuite/ChangeLog 2014-02-09 Paul Thomas <pault@gcc.gnu.org> -@@ -3098,8 +3555,8 @@ +@@ -3098,8 +3618,8 @@ * gfortran.dg/vect/fast-math-mgrid-resid.f: Change -fdump-tree-optimized to -fdump-tree-pcom-details in dg-options and cleanup-tree-dump from optimized to pcom. Remove scan-tree-dump-times @@ -8973,6 +9852,37 @@ Index: gcc/testsuite/g++.dg/opt/pr60849.C + if (xx(a)) + g++; +} +Index: gcc/testsuite/g++.dg/opt/pr61456.C +=================================================================== +--- a/src/gcc/testsuite/g++.dg/opt/pr61456.C (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/g++.dg/opt/pr61456.C (.../branches/gcc-4_9-branch) +@@ -0,0 +1,26 @@ ++// { dg-do compile } ++// { dg-options "-O2 -std=c++11 -Werror=uninitialized" } ++ ++int rand (); ++ ++class Funcs ++{ ++public: ++ int *f1 (); ++ int *f2 (); ++}; ++typedef decltype (&Funcs::f1) pfunc; ++ ++static int Set (Funcs * f, const pfunc & fp) ++{ ++ (f->*fp) (); ++} ++ ++void ++Foo () ++{ ++ pfunc fp = &Funcs::f1; ++ if (rand ()) ++ fp = &Funcs::f2; ++ Set (0, fp); ++} Index: gcc/testsuite/g++.dg/opt/typeinfo1.C =================================================================== --- a/src/gcc/testsuite/g++.dg/opt/typeinfo1.C (.../tags/gcc_4_9_0_release) @@ -9028,6 +9938,73 @@ Index: gcc/testsuite/g++.dg/opt/pr60912.C + (new Bar ())->Foo (); + return 0; +} +Index: gcc/testsuite/g++.dg/pr61289-2.c +=================================================================== +--- a/src/gcc/testsuite/g++.dg/pr61289-2.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/g++.dg/pr61289-2.c (.../branches/gcc-4_9-branch) +@@ -0,0 +1,62 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -fno-exceptions" } */ ++struct S ++{ ++ inline int fn1 () const { return s; } ++ __attribute__ ((noinline, noclone)) S *fn2 (int); ++ __attribute__ ((noinline, noclone)) void fn3 (); ++ __attribute__ ((noinline, noclone)) static S *fn4 (int); ++ S (int i) : s (i) {} ++ int s; ++}; ++ ++int a = 0; ++S *b = 0; ++ ++S * ++S::fn2 (int i) ++{ ++ a++; ++ if (a == 1) ++ return b; ++ if (a > 3) ++ __builtin_abort (); ++ b = this; ++ return new S (i + s); ++} ++ ++S * ++S::fn4 (int i) ++{ ++ b = new S (i); ++ return b; ++} ++ ++void ++S::fn3 () ++{ ++ delete this; ++} ++ ++void ++foo () ++{ ++ S *c = S::fn4 (20); ++ for (int i = 0; i < 2;) ++ { ++ S *d = c->fn2 (c->fn1 () + 10); ++ if (c != d) ++{ ++ c->fn3 (); ++ c = d; ++ ++i; ++} ++ } ++ c->fn3 (); ++} ++ ++int ++main () ++{ ++ foo (); ++} Index: gcc/testsuite/g++.dg/init/copy7.C =================================================================== --- a/src/gcc/testsuite/g++.dg/init/copy7.C (.../tags/gcc_4_9_0_release) @@ -9042,6 +10019,74 @@ Index: gcc/testsuite/g++.dg/init/copy7.C + A(const C&); +}; +const volatile A a = c; // Okay +Index: gcc/testsuite/g++.dg/pr61289.C +=================================================================== +--- a/src/gcc/testsuite/g++.dg/pr61289.C (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/g++.dg/pr61289.C (.../branches/gcc-4_9-branch) +@@ -0,0 +1,63 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -fno-exceptions" } */ ++ ++struct S ++{ ++ inline int fn1 () const { return s; } ++ __attribute__ ((noinline, noclone)) S *fn2 (int); ++ __attribute__ ((noinline, noclone)) void fn3 (); ++ __attribute__ ((noinline, noclone)) static S *fn4 (int); ++ S (int i) : s (i) {} ++ int s; ++}; ++ ++int a = 0; ++S *b = 0; ++ ++S * ++S::fn2 (int i) ++{ ++ a++; ++ if (a == 1) ++ return b; ++ if (a > 3) ++ __builtin_abort (); ++ b = this; ++ return new S (i + s); ++} ++ ++S * ++S::fn4 (int i) ++{ ++ b = new S (i); ++ return b; ++} ++ ++void ++S::fn3 () ++{ ++ delete this; ++} ++ ++void ++foo () ++{ ++ S *c = S::fn4 (20); ++ for (int i = 0; i < 2;) ++ { ++ S *d = c->fn2 (c->fn1 () + 10); ++ if (d != c) ++{ ++ c->fn3 (); ++ c = d; ++ ++i; ++} ++ } ++ c->fn3 (); ++} ++ ++int ++main () ++{ ++ foo (); ++} Index: gcc/testsuite/g++.dg/tree-ssa/pr61009.C =================================================================== --- a/src/gcc/testsuite/g++.dg/tree-ssa/pr61009.C (.../tags/gcc_4_9_0_release) @@ -9128,6 +10173,42 @@ Index: gcc/testsuite/g++.dg/tls/thread_local9.C +int main() { + UseA(); +} +Index: gcc/testsuite/g++.dg/pr61094.C +=================================================================== +--- a/src/gcc/testsuite/g++.dg/pr61094.C (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/g++.dg/pr61094.C (.../branches/gcc-4_9-branch) +@@ -0,0 +1,31 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O3" } */ ++ ++template <typename> struct A { ++ unsigned _width, _height, _depth, _spectrum; ++ template <typename t> A(t p1) { ++ int a = p1.size(); ++ if (a) { ++ _width = p1._width; ++ _depth = _height = _spectrum = p1._spectrum; ++ } ++ } ++ long size() { return (long)_width * _height * _depth * _spectrum; } ++}; ++ ++int d; ++void fn1(void *); ++A<int> *fn2(); ++void fn3() { ++ int b; ++ for (;;) { ++ A<char> c(*fn2()); ++ fn1(&c); ++ if (d || !b) ++ throw; ++ } ++} ++ ++ ++ ++ Index: gcc/testsuite/g++.dg/pr60969.C =================================================================== --- a/src/gcc/testsuite/g++.dg/pr60969.C (.../tags/gcc_4_9_0_release) @@ -9713,6 +10794,487 @@ Index: gcc/testsuite/c-c++-common/gomp/atomic-16.c + #pragma omp atomic capture, seq_cst v = x += 2; } +Index: gcc/testsuite/c-c++-common/gomp/pr61486-1.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/gomp/pr61486-1.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/c-c++-common/gomp/pr61486-1.c (.../branches/gcc-4_9-branch) +@@ -0,0 +1,13 @@ ++/* PR middle-end/61486 */ ++/* { dg-do compile } */ ++/* { dg-options "-fopenmp" } */ ++ ++int ++foo (int *a) ++{ ++ int i, j = 0; ++ #pragma omp target teams distribute simd linear(i, j) map(a[:10]) ++ for (i = 0; i < 10; i++) ++ a[i] = j++; ++ return i + j; ++} +Index: gcc/testsuite/c-c++-common/gomp/pr61486-2.c +=================================================================== +--- a/src/gcc/testsuite/c-c++-common/gomp/pr61486-2.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/testsuite/c-c++-common/gomp/pr61486-2.c (.../branches/gcc-4_9-branch) +@@ -0,0 +1,458 @@ ++/* PR middle-end/61486 */ ++/* { dg-do compile } */ ++/* { dg-options "-fopenmp" } */ ++ ++#pragma omp declare target ++void dosomething (int *a, int n, int m); ++#pragma omp end declare target ++ ++void ++test (int n, int o, int p, int q, int r, int s, int *pp) ++{ ++ int a[o], i, j; ++ #pragma omp target data device (n + 1) if (n != 6) map (tofrom: n, r) ++ { ++ #pragma omp target device (n + 1) if (n != 6) map (from: n) map (alloc: a[2:o-2]) ++ dosomething (a, n, 0); ++ #pragma omp target teams device (n + 1) num_teams (n + 4) thread_limit (n * 2) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target teams distribute device (n + 1) num_teams (n + 4) collapse (2) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target teams distribute device (n + 1) num_teams (n + 4) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target teams distribute parallel for device (n + 1) num_teams (n + 4) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ #pragma omp ordered ++ p = q; ++ s = i * 10 + j; ++ } ++ #pragma omp target teams distribute parallel for device (n + 1) num_teams (n + 4) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ ++ proc_bind (master) lastprivate (s) ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ { ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp ordered ++ p = q; ++ s = i * 10; ++ } ++ #pragma omp target teams distribute parallel for simd device (n + 1) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ schedule (static, 8) num_teams (n + 4) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp target teams distribute parallel for simd device (n + 1) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ ++ proc_bind (master) lastprivate (s) schedule (static, 8) \ ++ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++ #pragma omp target teams distribute simd device (n + 1) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ ++ lastprivate (s) num_teams (n + 4) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp target teams distribute simd device (n + 1) \ ++ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) \ ++ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams num_teams (n + 4) thread_limit (n * 2) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute num_teams (n + 4) collapse (2) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute num_teams (n + 4) default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute parallel for num_teams (n + 4) if (n != 6) \ ++ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ #pragma omp ordered ++ p = q; ++ s = i * 10 + j; ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute parallel for num_teams (n + 4) if (n != 6) \ ++ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ ++ proc_bind (master) lastprivate (s) ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ { ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp ordered ++ p = q; ++ s = i * 10; ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute parallel for simd if (n != 6)default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ schedule (static, 8) num_teams (n + 4) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute parallel for simd if (n != 6)default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \ ++ proc_bind (master) lastprivate (s) schedule (static, 8) \ ++ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute simd default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \ ++ lastprivate (s) num_teams (n + 4) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) ++ #pragma omp teams distribute simd default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) \ ++ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2)default(shared) shared(n) \ ++ private (p) reduction (+: r) ++ #pragma omp distribute collapse (2) dist_schedule (static, 4) firstprivate (q) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2) shared(n) private(p) reduction (+ : r) \ ++ default(shared) ++ #pragma omp distribute dist_schedule (static, 4) firstprivate (q) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2) ++ #pragma omp distribute parallel for if (n != 6) \ ++ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ collapse (2) dist_schedule (static, 4) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ #pragma omp ordered ++ p = q; ++ s = i * 10 + j; ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2) ++ #pragma omp distribute parallel for if (n != 6) \ ++ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ num_threads (n + 4) dist_schedule (static, 4) \ ++ proc_bind (master) lastprivate (s) ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ { ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp ordered ++ p = q; ++ s = i * 10; ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2) ++ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ collapse (2) dist_schedule (static, 4) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ schedule (static, 8) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2) ++ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ num_threads (n + 4) dist_schedule (static, 4) \ ++ proc_bind (master) lastprivate (s) schedule (static, 8) \ ++ safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2) default(shared) shared(n) private(p) \ ++ reduction(+:r) ++ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ ++ collapse (2) dist_schedule (static, 4) lastprivate (s) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \ ++ num_teams (n + 4) thread_limit (n * 2) default(shared) shared(n) private(p) \ ++ reduction(+:r) ++ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ ++ lastprivate (s) dist_schedule (static, 4) safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++ } ++} ++ ++int q, i, j; ++ ++void ++test2 (int n, int o, int p, int r, int s, int *pp) ++{ ++ int a[o]; ++ #pragma omp distribute collapse (2) dist_schedule (static, 4) firstprivate (q) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp distribute dist_schedule (static, 4) firstprivate (q) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp distribute parallel for if (n != 6) \ ++ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ collapse (2) dist_schedule (static, 4) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ #pragma omp ordered ++ p = q; ++ s = i * 10 + j; ++ } ++ #pragma omp distribute parallel for if (n != 6) \ ++ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ num_threads (n + 4) dist_schedule (static, 4) \ ++ proc_bind (master) lastprivate (s) ordered schedule (static, 8) ++ for (i = 0; i < 10; i++) ++ { ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ dosomething (a, n, p + q); ++ } ++ #pragma omp ordered ++ p = q; ++ s = i * 10; ++ } ++ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ collapse (2) dist_schedule (static, 4) \ ++ num_threads (n + 4) proc_bind (spread) lastprivate (s) \ ++ schedule (static, 8) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp distribute parallel for simd if (n != 6)default(shared) \ ++ private (p) firstprivate (q) shared (n) reduction (+: r) \ ++ num_threads (n + 4) dist_schedule (static, 4) \ ++ proc_bind (master) lastprivate (s) schedule (static, 8) \ ++ safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ ++ collapse (2) dist_schedule (static, 4) lastprivate (s) safelen(8) ++ for (i = 0; i < 10; i++) ++ for (j = 0; j < 10; j++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i*10+j] = p + q; ++ s = i * 10 + j; ++ } ++ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \ ++ lastprivate (s) dist_schedule (static, 4) safelen(16) linear(i:1) aligned (pp:4) ++ for (i = 0; i < 10; i++) ++ { ++ r = r + 1; ++ p = q; ++ a[2+i] = p + q; ++ s = i * 10; ++ } ++} Index: gcc/testsuite/c-c++-common/gomp/pr60823-1.c =================================================================== --- a/src/gcc/testsuite/c-c++-common/gomp/pr60823-1.c (.../tags/gcc_4_9_0_release) @@ -10507,6 +12069,21 @@ Index: gcc/tree-ssa-propagate.c if (!is_gimple_val (TREE_OPERAND (expr, 0)) || !is_gimple_val (TREE_OPERAND (expr, 1))) return false; +Index: gcc/tree-ssa-alias.c +=================================================================== +--- a/src/gcc/tree-ssa-alias.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/tree-ssa-alias.c (.../branches/gcc-4_9-branch) +@@ -835,8 +835,8 @@ + /* ??? We cannot simply use the type of operand #0 of the refs here + as the Fortran compiler smuggles type punning into COMPONENT_REFs + for common blocks instead of using unions like everyone else. */ +- tree type1 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field1)); +- tree type2 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field2)); ++ tree type1 = DECL_CONTEXT (field1); ++ tree type2 = DECL_CONTEXT (field2); + + /* We cannot disambiguate fields in a union or qualified union. */ + if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE) Index: gcc/loop-init.c =================================================================== --- a/src/gcc/loop-init.c (.../tags/gcc_4_9_0_release) @@ -11924,7 +13501,14 @@ Index: gcc/fortran/ChangeLog =================================================================== --- a/src/gcc/fortran/ChangeLog (.../tags/gcc_4_9_0_release) +++ b/src/gcc/fortran/ChangeLog (.../branches/gcc-4_9-branch) -@@ -1,3 +1,46 @@ +@@ -1,3 +1,53 @@ ++2014-06-15 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> ++ ++ Backport from trunk. ++ PR fortran/45187 ++ * trans-decl.c (gfc_create_module_variable): Don't create ++ Cray-pointee decls twice. ++ +2014-06-09 Paul Thomas <pault@gcc.gnu.org> + + Backport from trunk. @@ -12218,6 +13802,21 @@ Index: gcc/fortran/resolve.c return false; if (sym->attr.is_class && sym->ts.u.derived == NULL) +Index: gcc/fortran/trans-decl.c +=================================================================== +--- a/src/gcc/fortran/trans-decl.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/fortran/trans-decl.c (.../branches/gcc-4_9-branch) +@@ -4237,8 +4237,8 @@ + } + + /* Don't generate variables from other modules. Variables from +- COMMONs will already have been generated. */ +- if (sym->attr.use_assoc || sym->attr.in_common) ++ COMMONs and Cray pointees will already have been generated. */ ++ if (sym->attr.use_assoc || sym->attr.in_common || sym->attr.cray_pointee) + return; + + /* Equivalenced variables arrive here after creation. */ Index: gcc/ipa-devirt.c =================================================================== --- a/src/gcc/ipa-devirt.c (.../tags/gcc_4_9_0_release) @@ -12240,6 +13839,33 @@ Index: gcc/ipa-devirt.c return false; } +@@ -1438,6 +1449,8 @@ + { + if (completep) + *completep = false; ++ if (cache_token) ++ *cache_token = NULL; + if (nonconstruction_targetsp) + *nonconstruction_targetsp = 0; + return nodes; +@@ -1448,6 +1461,8 @@ + { + if (completep) + *completep = true; ++ if (cache_token) ++ *cache_token = NULL; + if (nonconstruction_targetsp) + *nonconstruction_targetsp = 0; + return nodes; +@@ -1461,6 +1476,8 @@ + { + if (completep) + *completep = false; ++ if (cache_token) ++ *cache_token = NULL; + if (nonconstruction_targetsp) + *nonconstruction_targetsp = 0; + return nodes; Index: gcc/configure.ac =================================================================== --- a/src/gcc/configure.ac (.../tags/gcc_4_9_0_release) @@ -12275,6 +13901,52 @@ Index: gcc/configure.ac case "$target:$tm_file" in powerpc64-*-freebsd* | powerpc64*-*-linux* | powerpc*-*-linux*rs6000/biarch64.h*) case "$target" in +Index: gcc/function.c +=================================================================== +--- a/src/gcc/function.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/function.c (.../branches/gcc-4_9-branch) +@@ -1347,9 +1347,13 @@ + #define STACK_POINTER_OFFSET 0 + #endif + ++#if defined (REG_PARM_STACK_SPACE) && !defined (INCOMING_REG_PARM_STACK_SPACE) ++#define INCOMING_REG_PARM_STACK_SPACE REG_PARM_STACK_SPACE ++#endif ++ + /* If not defined, pick an appropriate default for the offset of dynamically + allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS, +- REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE. */ ++ INCOMING_REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE. */ + + #ifndef STACK_DYNAMIC_OFFSET + +@@ -1361,12 +1365,12 @@ + `crtl->outgoing_args_size'. Nevertheless, we must allow + for it when allocating stack dynamic objects. */ + +-#if defined(REG_PARM_STACK_SPACE) ++#ifdef INCOMING_REG_PARM_STACK_SPACE + #define STACK_DYNAMIC_OFFSET(FNDECL) \ + ((ACCUMULATE_OUTGOING_ARGS \ + ? (crtl->outgoing_args_size \ + + (OUTGOING_REG_PARM_STACK_SPACE ((!(FNDECL) ? NULL_TREE : TREE_TYPE (FNDECL))) ? 0 \ +- : REG_PARM_STACK_SPACE (FNDECL))) \ ++ : INCOMING_REG_PARM_STACK_SPACE (FNDECL))) \ + : 0) + (STACK_POINTER_OFFSET)) + #else + #define STACK_DYNAMIC_OFFSET(FNDECL) \ +@@ -2221,8 +2225,9 @@ + #endif + all->args_so_far = pack_cumulative_args (&all->args_so_far_v); + +-#ifdef REG_PARM_STACK_SPACE +- all->reg_parm_stack_space = REG_PARM_STACK_SPACE (current_function_decl); ++#ifdef INCOMING_REG_PARM_STACK_SPACE ++ all->reg_parm_stack_space ++ = INCOMING_REG_PARM_STACK_SPACE (current_function_decl); + #endif + } + Index: gcc/tree-vectorizer.h =================================================================== --- a/src/gcc/tree-vectorizer.h (.../tags/gcc_4_9_0_release) @@ -12430,7 +14102,15 @@ Index: gcc/gimplify.c =================================================================== --- a/src/gcc/gimplify.c (.../tags/gcc_4_9_0_release) +++ b/src/gcc/gimplify.c (.../branches/gcc-4_9-branch) -@@ -5793,7 +5793,7 @@ +@@ -138,6 +138,7 @@ + enum omp_clause_default_kind default_kind; + enum omp_region_type region_type; + bool combined_loop; ++ bool distribute; + }; + + static struct gimplify_ctx *gimplify_ctxp; +@@ -5793,7 +5794,7 @@ to the contrary in the innermost scope, generate an error. */ static bool @@ -12439,7 +14119,7 @@ Index: gcc/gimplify.c { splay_tree_node n; -@@ -5827,13 +5827,13 @@ +@@ -5827,13 +5828,13 @@ else if ((n->value & GOVD_REDUCTION) != 0) error ("iteration variable %qE should not be reduction", DECL_NAME (decl)); @@ -12455,7 +14135,7 @@ Index: gcc/gimplify.c error ("iteration variable %qE is predetermined linear", DECL_NAME (decl)); } -@@ -6270,9 +6270,17 @@ +@@ -6270,9 +6271,17 @@ OMP_CLAUSE_CHAIN (clause) = nc; } } @@ -12474,7 +14154,7 @@ Index: gcc/gimplify.c return 0; } -@@ -6311,10 +6319,10 @@ +@@ -6311,10 +6320,10 @@ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR && ctx->outer_context && !(OMP_CLAUSE_LINEAR_NO_COPYIN (c) @@ -12488,17 +14168,21 @@ Index: gcc/gimplify.c { n = splay_tree_lookup (ctx->outer_context->variables, (splay_tree_key) decl); -@@ -6321,8 +6329,7 @@ +@@ -6321,8 +6330,11 @@ if (n == NULL || (n->value & GOVD_DATA_SHARE_CLASS) == 0) { - int flags = OMP_CLAUSE_LINEAR_NO_COPYIN (c) - ? GOVD_LASTPRIVATE : GOVD_SHARED; -+ int flags = GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE; ++ int flags = GOVD_FIRSTPRIVATE; ++ /* #pragma omp distribute does not allow ++ lastprivate clause. */ ++ if (!ctx->outer_context->distribute) ++ flags |= GOVD_LASTPRIVATE; if (n == NULL) omp_add_variable (ctx->outer_context, decl, flags | GOVD_SEEN); -@@ -6330,7 +6337,7 @@ +@@ -6330,7 +6342,7 @@ n->value |= flags | GOVD_SEEN; } } @@ -12507,7 +14191,7 @@ Index: gcc/gimplify.c omp_notice_variable (ctx->outer_context, decl, true); } } -@@ -6599,8 +6606,8 @@ +@@ -6599,10 +6611,12 @@ orig_for_stmt = for_stmt = *expr_p; @@ -12517,8 +14201,12 @@ Index: gcc/gimplify.c + || TREE_CODE (for_stmt) == CILK_SIMD); gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, simd ? ORT_SIMD : ORT_WORKSHARE); ++ if (TREE_CODE (for_stmt) == OMP_DISTRIBUTE) ++ gimplify_omp_ctxp->distribute = true; -@@ -6656,6 +6663,7 @@ + /* Handle OMP_FOR_INIT. */ + for_pre_body = NULL; +@@ -6656,6 +6670,7 @@ /* Make sure the iteration variable is private. */ tree c = NULL_TREE; @@ -12526,7 +14214,7 @@ Index: gcc/gimplify.c if (orig_for_stmt != for_stmt) /* Do this only on innermost construct for combined ones. */; else if (simd) -@@ -6662,7 +6670,9 @@ +@@ -6662,7 +6677,9 @@ { splay_tree_node n = splay_tree_lookup (gimplify_omp_ctxp->variables, (splay_tree_key)decl); @@ -12537,7 +14225,7 @@ Index: gcc/gimplify.c if (n != NULL && (n->value & GOVD_DATA_SHARE_CLASS) != 0) omp_notice_variable (gimplify_omp_ctxp, decl, true); else if (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1) -@@ -6688,13 +6698,14 @@ +@@ -6688,13 +6705,14 @@ : OMP_CLAUSE_PRIVATE); OMP_CLAUSE_DECL (c) = decl; OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt); @@ -12554,7 +14242,7 @@ Index: gcc/gimplify.c omp_notice_variable (gimplify_omp_ctxp, decl, true); else omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN); -@@ -6711,7 +6722,25 @@ +@@ -6711,7 +6729,25 @@ gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var)); @@ -12581,7 +14269,7 @@ Index: gcc/gimplify.c } else var = decl; -@@ -6814,13 +6843,22 @@ +@@ -6814,13 +6850,22 @@ gcc_unreachable (); } @@ -12607,7 +14295,7 @@ Index: gcc/gimplify.c { t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i); gcc_assert (TREE_CODE (t) == MODIFY_EXPR); -@@ -6832,8 +6870,12 @@ +@@ -6832,8 +6877,12 @@ gcc_assert (TREE_OPERAND (t, 0) == var); t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl, TREE_OPERAND (t, 1)); @@ -24432,6 +26120,15 @@ Index: gcc/config.gcc =================================================================== --- a/src/gcc/config.gcc (.../tags/gcc_4_9_0_release) +++ b/src/gcc/config.gcc (.../branches/gcc-4_9-branch) +@@ -1021,7 +1021,7 @@ + ;; + esac + tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" +- tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h arm/arm.h" ++ tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h vxworks-dummy.h arm/arm.h" + # Define multilib configuration for arm-linux-androideabi. + case ${target} in + *-androideabi) @@ -2131,7 +2131,6 @@ tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}" c_target_objs="msp430-c.o" @@ -24523,6 +26220,19 @@ Index: gcc/tree-ssa-structalias.c { /* We need to accumulate all clobbers/uses of all possible callees. */ +Index: gcc/tree-core.h +=================================================================== +--- a/src/gcc/tree-core.h (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/tree-core.h (.../branches/gcc-4_9-branch) +@@ -987,7 +987,7 @@ + SSA_NAME_IN_FREELIST in + SSA_NAME + +- VAR_DECL_NONALIASED in ++ DECL_NONALIASED in + VAR_DECL + + deprecated_flag: Index: gcc/passes.c =================================================================== --- a/src/gcc/passes.c (.../tags/gcc_4_9_0_release) @@ -24576,6 +26286,96 @@ Index: gcc/passes.c if (applied) symtab_remove_unreachable_nodes (true, dump_file); /* Restore current_pass. */ +Index: gcc/ree.c +=================================================================== +--- a/src/gcc/ree.c (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/ree.c (.../branches/gcc-4_9-branch) +@@ -507,6 +507,8 @@ + /* Kind of modification of the insn. */ + ENUM_BITFIELD(ext_modified_kind) kind : 2; + ++ unsigned int do_not_reextend : 1; ++ + /* True if the insn is scheduled to be deleted. */ + unsigned int deleted : 1; + }; +@@ -712,8 +714,10 @@ + register than the source operand, then additional restrictions + are needed. Note we have to handle cases where we have nested + extensions in the source operand. */ +- if (REGNO (SET_DEST (PATTERN (cand->insn))) +- != REGNO (get_extended_src_reg (SET_SRC (PATTERN (cand->insn))))) ++ bool copy_needed ++ = (REGNO (SET_DEST (PATTERN (cand->insn))) ++ != REGNO (get_extended_src_reg (SET_SRC (PATTERN (cand->insn))))); ++ if (copy_needed) + { + /* In theory we could handle more than one reaching def, it + just makes the code to update the insn stream more complex. */ +@@ -722,7 +726,7 @@ + + /* We require the candidate not already be modified. It may, + for example have been changed from a (sign_extend (reg)) +- into (zero_extend (sign_extend (reg)). ++ into (zero_extend (sign_extend (reg))). + + Handling that case shouldn't be terribly difficult, but the code + here and the code to emit copies would need auditing. Until +@@ -777,6 +781,34 @@ + || reg_set_between_p (SET_DEST (PATTERN (cand->insn)), + def_insn, cand->insn)) + return false; ++ ++ /* We must be able to copy between the two registers. Generate, ++ recognize and verify constraints of the copy. Also fail if this ++ generated more than one insn. ++ ++ This generates garbage since we throw away the insn when we're ++ done, only to recreate it later if this test was successful. ++ ++ Make sure to get the mode from the extension (cand->insn). This ++ is different than in the code to emit the copy as we have not ++ modified the defining insn yet. */ ++ start_sequence (); ++ rtx pat = PATTERN (cand->insn); ++ rtx new_dst = gen_rtx_REG (GET_MODE (SET_DEST (pat)), ++ REGNO (XEXP (SET_SRC (pat), 0))); ++ rtx new_src = gen_rtx_REG (GET_MODE (SET_DEST (pat)), ++ REGNO (SET_DEST (pat))); ++ emit_move_insn (new_dst, new_src); ++ ++ rtx insn = get_insns(); ++ end_sequence (); ++ if (NEXT_INSN (insn)) ++ return false; ++ if (recog_memoized (insn) == -1) ++ return false; ++ extract_insn (insn); ++ if (!constrain_operands (1)) ++ return false; + } + + +@@ -843,11 +875,15 @@ + fprintf (dump_file, "All merges were successful.\n"); + + FOR_EACH_VEC_ELT (state->modified_list, i, def_insn) +- if (state->modified[INSN_UID (def_insn)].kind == EXT_MODIFIED_NONE) +- state->modified[INSN_UID (def_insn)].kind +- = (cand->code == ZERO_EXTEND +- ? EXT_MODIFIED_ZEXT : EXT_MODIFIED_SEXT); ++ { ++ ext_modified *modified = &state->modified[INSN_UID (def_insn)]; ++ if (modified->kind == EXT_MODIFIED_NONE) ++ modified->kind = (cand->code == ZERO_EXTEND ? EXT_MODIFIED_ZEXT ++ : EXT_MODIFIED_SEXT); + ++ if (copy_needed) ++ modified->do_not_reextend = 1; ++ } + return true; + } + else Index: gcc/tree-ssa-reassoc.c =================================================================== --- a/src/gcc/tree-ssa-reassoc.c (.../tags/gcc_4_9_0_release) @@ -25474,6 +27274,21 @@ Index: gcc/config/initfini-array.h <http://www.gnu.org/licenses/>. */ #ifdef HAVE_INITFINI_ARRAY_SUPPORT +Index: gcc/config/avr/avr-fixed.md +=================================================================== +--- a/src/gcc/config/avr/avr-fixed.md (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/config/avr/avr-fixed.md (.../branches/gcc-4_9-branch) +@@ -430,8 +430,8 @@ + } + + // Input and output of the libgcc function +- const unsigned int regno_in[] = { -1, 22, 22, -1, 18 }; +- const unsigned int regno_out[] = { -1, 24, 24, -1, 22 }; ++ const unsigned int regno_in[] = { -1U, 22, 22, -1U, 18 }; ++ const unsigned int regno_out[] = { -1U, 24, 24, -1U, 22 }; + + operands[3] = gen_rtx_REG (<MODE>mode, regno_out[(size_t) GET_MODE_SIZE (<MODE>mode)]); + operands[4] = gen_rtx_REG (<MODE>mode, regno_in[(size_t) GET_MODE_SIZE (<MODE>mode)]); Index: gcc/config/avr/avr.md =================================================================== --- a/src/gcc/config/avr/avr.md (.../tags/gcc_4_9_0_release) @@ -25487,7 +27302,23 @@ Index: gcc/config/avr/avr.md plus,ldi" (const_string "none")) -@@ -1098,7 +1098,7 @@ +@@ -368,6 +368,15 @@ + "" + { + int i; ++ ++ // Avoid (subreg (mem)) for non-generic address spaces below. Because ++ // of the poor addressing capabilities of these spaces it's better to ++ // load them in one chunk. And it avoids PR61443. ++ ++ if (MEM_P (operands[0]) ++ && !ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (operands[0]))) ++ operands[0] = copy_to_mode_reg (<MODE>mode, operands[0]); ++ + for (i = GET_MODE_SIZE (<MODE>mode) - 1; i >= 0; --i) + { + rtx part = simplify_gen_subreg (QImode, operands[0], <MODE>mode, i); +@@ -1098,7 +1107,7 @@ inc %0\;inc %0 dec %0\;dec %0" [(set_attr "length" "1,1,1,1,2,2") @@ -25496,7 +27327,7 @@ Index: gcc/config/avr/avr.md ;; "addhi3" ;; "addhq3" "adduhq3" -@@ -1369,7 +1369,7 @@ +@@ -1369,7 +1378,7 @@ dec %0\;dec %0 inc %0\;inc %0" [(set_attr "length" "1,1,1,1,2,2") @@ -25505,7 +27336,7 @@ Index: gcc/config/avr/avr.md ;; "subhi3" ;; "subhq3" "subuhq3" -@@ -3992,7 +3992,7 @@ +@@ -3992,7 +4001,7 @@ "" "neg %0" [(set_attr "length" "1") @@ -25579,6 +27410,36 @@ Index: gcc/config/avr/avr.c break; } +Index: gcc/config/avr/avr.h +=================================================================== +--- a/src/gcc/config/avr/avr.h (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/config/avr/avr.h (.../branches/gcc-4_9-branch) +@@ -251,18 +251,18 @@ + #define REG_CLASS_CONTENTS { \ + {0x00000000,0x00000000}, /* NO_REGS */ \ + {0x00000001,0x00000000}, /* R0_REG */ \ +- {3 << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \ +- {3 << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \ +- {3 << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \ ++ {3u << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \ ++ {3u << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \ ++ {3u << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \ + {0x00000000,0x00000003}, /* STACK_REG, STACK */ \ +- {(3 << REG_Y) | (3 << REG_Z), \ ++ {(3u << REG_Y) | (3u << REG_Z), \ + 0x00000000}, /* BASE_POINTER_REGS, r28 - r31 */ \ +- {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z), \ ++ {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z), \ + 0x00000000}, /* POINTER_REGS, r26 - r31 */ \ +- {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z) | (3 << REG_W), \ ++ {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z) | (3u << REG_W), \ + 0x00000000}, /* ADDW_REGS, r24 - r31 */ \ + {0x00ff0000,0x00000000}, /* SIMPLE_LD_REGS r16 - r23 */ \ +- {(3 << REG_X)|(3 << REG_Y)|(3 << REG_Z)|(3 << REG_W)|(0xff << 16), \ ++ {(3u << REG_X)|(3u << REG_Y)|(3u << REG_Z)|(3u << REG_W)|(0xffu << 16),\ + 0x00000000}, /* LD_REGS, r16 - r31 */ \ + {0x0000ffff,0x00000000}, /* NO_LD_REGS r0 - r15 */ \ + {0xffffffff,0x00000000}, /* GENERAL_REGS, r0 - r31 */ \ Index: gcc/config/dbx.h =================================================================== --- a/src/gcc/config/dbx.h (.../tags/gcc_4_9_0_release) @@ -25787,6 +27648,19 @@ Index: gcc/config/rs6000/htm.md (parallel [(set (match_operand:SI 0 "int_reg_operand" "") (and:SI (match_dup 3) (const_int 15))) (clobber (scratch:CC))])] +Index: gcc/config/rs6000/rs6000-protos.h +=================================================================== +--- a/src/gcc/config/rs6000/rs6000-protos.h (.../tags/gcc_4_9_0_release) ++++ b/src/gcc/config/rs6000/rs6000-protos.h (.../branches/gcc-4_9-branch) +@@ -163,7 +163,7 @@ + extern rtx rs6000_libcall_value (enum machine_mode); + extern rtx rs6000_va_arg (tree, tree); + extern int function_ok_for_sibcall (tree); +-extern int rs6000_reg_parm_stack_space (tree); ++extern int rs6000_reg_parm_stack_space (tree, bool); + extern void rs6000_elf_declare_function_name (FILE *, const char *, tree); + extern bool rs6000_elf_in_small_data_p (const_tree); + #ifdef ARGS_SIZE_RTX Index: gcc/config/rs6000/htmxlintrin.h =================================================================== --- a/src/gcc/config/rs6000/htmxlintrin.h (.../tags/gcc_4_9_0_release) @@ -25823,7 +27697,7 @@ Index: gcc/config/rs6000/rs6000-builtin.def =================================================================== --- a/src/gcc/config/rs6000/rs6000-builtin.def (.../tags/gcc_4_9_0_release) +++ b/src/gcc/config/rs6000/rs6000-builtin.def (.../branches/gcc-4_9-branch) -@@ -570,6 +570,75 @@ +@@ -570,6 +570,68 @@ MASK, /* MASK */ \ (ATTR | RS6000_BTC_SPECIAL), /* ATTR */ \ CODE_FOR_nothing) /* ICODE */ @@ -25879,19 +27753,12 @@ Index: gcc/config/rs6000/rs6000-builtin.def + | RS6000_BTC_TERNARY), \ + CODE_FOR_ ## ICODE) /* ICODE */ + -+/* Miscellaneous builtins. */ -+#define BU_MISC_1(ENUM, NAME, ATTR, ICODE) \ ++/* 128-bit long double floating point builtins. */ ++#define BU_LDBL128_2(ENUM, NAME, ATTR, ICODE) \ + RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ + "__builtin_" NAME, /* NAME */ \ -+ RS6000_BTM_HARD_FLOAT, /* MASK */ \ -+ (RS6000_BTC_ ## ATTR /* ATTR */ \ -+ | RS6000_BTC_UNARY), \ -+ CODE_FOR_ ## ICODE) /* ICODE */ -+ -+#define BU_MISC_2(ENUM, NAME, ATTR, ICODE) \ -+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \ -+ "__builtin_" NAME, /* NAME */ \ -+ RS6000_BTM_HARD_FLOAT, /* MASK */ \ ++ (RS6000_BTM_HARD_FLOAT /* MASK */ \ ++ | RS6000_BTM_LDBL128), \ + (RS6000_BTC_ ## ATTR /* ATTR */ \ + | RS6000_BTC_BINARY), \ + CODE_FOR_ ## ICODE) /* ICODE */ @@ -25899,7 +27766,7 @@ Index: gcc/config/rs6000/rs6000-builtin.def #endif /* Insure 0 is not a legitimate index. */ -@@ -1412,10 +1481,10 @@ +@@ -1412,10 +1474,10 @@ BU_P8V_AV_2 (ORC_V2DF, "orc_v2df", CONST, orcv2df3) /* 3 argument altivec instructions added in ISA 2.07. */ @@ -25914,7 +27781,7 @@ Index: gcc/config/rs6000/rs6000-builtin.def /* Vector comparison instructions added in ISA 2.07. */ BU_P8V_AV_2 (VCMPEQUD, "vcmpequd", CONST, vector_eqv2di) -@@ -1475,6 +1544,64 @@ +@@ -1475,6 +1537,62 @@ BU_P8V_OVERLOAD_3 (VSUBEUQM, "vsubeuqm") @@ -25967,10 +27834,8 @@ Index: gcc/config/rs6000/rs6000-builtin.def +BU_DFP_MISC_2 (PACK_TD, "pack_dec128", CONST, packtd) +BU_DFP_MISC_2 (UNPACK_TD, "unpack_dec128", CONST, unpacktd) + -+BU_MISC_2 (PACK_TF, "pack_longdouble", CONST, packtf) -+BU_MISC_2 (UNPACK_TF, "unpack_longdouble", CONST, unpacktf) -+BU_MISC_1 (UNPACK_TF_0, "longdouble_dw0", CONST, unpacktf_0) -+BU_MISC_1 (UNPACK_TF_1, "longdouble_dw1", CONST, unpacktf_1) ++BU_LDBL128_2 (PACK_TF, "pack_longdouble", CONST, packtf) ++BU_LDBL128_2 (UNPACK_TF, "unpack_longdouble", CONST, unpacktf) + +BU_P7_MISC_2 (PACK_V1TI, "pack_vector_int128", CONST, packv1ti) +BU_P7_MISC_2 (UNPACK_V1TI, "unpack_vector_int128", CONST, unpackv1ti) @@ -26008,18 +27873,19 @@ Index: gcc/config/rs6000/rs6000.c if (TARGET_LINK_STACK) fprintf (stderr, DEBUG_FMT_S, "link_stack", "true"); -@@ -3017,7 +3035,9 @@ +@@ -3017,7 +3035,10 @@ | ((rs6000_cpu == PROCESSOR_CELL) ? RS6000_BTM_CELL : 0) | ((TARGET_P8_VECTOR) ? RS6000_BTM_P8_VECTOR : 0) | ((TARGET_CRYPTO) ? RS6000_BTM_CRYPTO : 0) - | ((TARGET_HTM) ? RS6000_BTM_HTM : 0)); + | ((TARGET_HTM) ? RS6000_BTM_HTM : 0) + | ((TARGET_DFP) ? RS6000_BTM_DFP : 0) -+ | ((TARGET_HARD_FLOAT) ? RS6000_BTM_HARD_FLOAT : 0)); ++ | ((TARGET_HARD_FLOAT) ? RS6000_BTM_HARD_FLOAT : 0) ++ | ((TARGET_LONG_DOUBLE_128) ? RS6000_BTM_LDBL128 : 0)); } /* Override command line options. Mostly we process the processor type and -@@ -3374,6 +3394,13 @@ +@@ -3374,6 +3395,13 @@ rs6000_isa_flags &= ~OPTION_MASK_VSX_TIMODE; } @@ -26033,7 +27899,7 @@ Index: gcc/config/rs6000/rs6000.c /* The quad memory instructions only works in 64-bit mode. In 32-bit mode, silently turn off quad memory mode. */ if ((TARGET_QUAD_MEMORY || TARGET_QUAD_MEMORY_ATOMIC) && !TARGET_POWERPC64) -@@ -6091,7 +6118,8 @@ +@@ -6091,7 +6119,8 @@ return false; extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD; @@ -26043,7 +27909,105 @@ Index: gcc/config/rs6000/rs6000.c if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that -@@ -12381,7 +12409,15 @@ +@@ -10450,10 +10479,9 @@ + list, or passes any parameter in memory. */ + + static bool +-rs6000_function_parms_need_stack (tree fun) ++rs6000_function_parms_need_stack (tree fun, bool incoming) + { +- function_args_iterator args_iter; +- tree arg_type; ++ tree fntype, result; + CUMULATIVE_ARGS args_so_far_v; + cumulative_args_t args_so_far; + +@@ -10460,26 +10488,57 @@ + if (!fun) + /* Must be a libcall, all of which only use reg parms. */ + return false; ++ ++ fntype = fun; + if (!TYPE_P (fun)) +- fun = TREE_TYPE (fun); ++ fntype = TREE_TYPE (fun); + + /* Varargs functions need the parameter save area. */ +- if (!prototype_p (fun) || stdarg_p (fun)) ++ if ((!incoming && !prototype_p (fntype)) || stdarg_p (fntype)) + return true; + +- INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fun, NULL_RTX); ++ INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fntype, NULL_RTX); + args_so_far = pack_cumulative_args (&args_so_far_v); + +- if (aggregate_value_p (TREE_TYPE (fun), fun)) ++ /* When incoming, we will have been passed the function decl. ++ It is necessary to use the decl to handle K&R style functions, ++ where TYPE_ARG_TYPES may not be available. */ ++ if (incoming) + { +- tree type = build_pointer_type (TREE_TYPE (fun)); +- rs6000_parm_needs_stack (args_so_far, type); ++ gcc_assert (DECL_P (fun)); ++ result = DECL_RESULT (fun); + } ++ else ++ result = TREE_TYPE (fntype); + +- FOREACH_FUNCTION_ARGS (fun, arg_type, args_iter) +- if (rs6000_parm_needs_stack (args_so_far, arg_type)) +- return true; ++ if (result && aggregate_value_p (result, fntype)) ++ { ++ if (!TYPE_P (result)) ++ result = TREE_TYPE (result); ++ result = build_pointer_type (result); ++ rs6000_parm_needs_stack (args_so_far, result); ++ } + ++ if (incoming) ++ { ++ tree parm; ++ ++ for (parm = DECL_ARGUMENTS (fun); ++ parm && parm != void_list_node; ++ parm = TREE_CHAIN (parm)) ++ if (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (parm))) ++ return true; ++ } ++ else ++ { ++ function_args_iterator args_iter; ++ tree arg_type; ++ ++ FOREACH_FUNCTION_ARGS (fntype, arg_type, args_iter) ++ if (rs6000_parm_needs_stack (args_so_far, arg_type)) ++ return true; ++ } ++ + return false; + } + +@@ -10490,7 +10549,7 @@ + all parameters in registers. */ + + int +-rs6000_reg_parm_stack_space (tree fun) ++rs6000_reg_parm_stack_space (tree fun, bool incoming) + { + int reg_parm_stack_space; + +@@ -10508,7 +10567,7 @@ + case ABI_ELFv2: + /* ??? Recomputing this every time is a bit expensive. Is there + a place to cache this information? */ +- if (rs6000_function_parms_need_stack (fun)) ++ if (rs6000_function_parms_need_stack (fun, incoming)) + reg_parm_stack_space = TARGET_64BIT ? 64 : 32; + else + reg_parm_stack_space = 0; +@@ -12381,7 +12440,15 @@ } } else if (icode == CODE_FOR_vsx_set_v2df @@ -26060,7 +28024,7 @@ Index: gcc/config/rs6000/rs6000.c { /* Only allow 1-bit unsigned literals. */ STRIP_NOPS (arg2); -@@ -12392,6 +12428,44 @@ +@@ -12392,6 +12459,44 @@ return const0_rtx; } } @@ -26105,24 +28069,28 @@ Index: gcc/config/rs6000/rs6000.c else if (icode == CODE_FOR_crypto_vshasigmaw || icode == CODE_FOR_crypto_vshasigmad) { -@@ -13483,6 +13557,16 @@ +@@ -13483,6 +13588,20 @@ error ("Builtin function %s requires the -mpaired option", name); else if ((fnmask & RS6000_BTM_SPE) != 0) error ("Builtin function %s requires the -mspe option", name); + else if ((fnmask & (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR)) + == (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR)) + error ("Builtin function %s requires the -mhard-dfp and" -+ "-mpower8-vector options", name); ++ " -mpower8-vector options", name); + else if ((fnmask & RS6000_BTM_DFP) != 0) + error ("Builtin function %s requires the -mhard-dfp option", name); + else if ((fnmask & RS6000_BTM_P8_VECTOR) != 0) + error ("Builtin function %s requires the -mpower8-vector option", name); ++ else if ((fnmask & (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128)) ++ == (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128)) ++ error ("Builtin function %s requires the -mhard-float and" ++ " -mlong-double-128 options", name); + else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0) + error ("Builtin function %s requires the -mhard-float option", name); else error ("Builtin function %s is not supported with the current options", name); -@@ -13671,7 +13755,10 @@ +@@ -13671,7 +13790,10 @@ return ret; } @@ -26134,7 +28102,7 @@ Index: gcc/config/rs6000/rs6000.c /* Handle simple unary operations. */ d = bdesc_1arg; -@@ -13762,6 +13849,9 @@ +@@ -13762,6 +13884,9 @@ uintTI_type_internal_node = unsigned_intTI_type_node; float_type_internal_node = float_type_node; double_type_internal_node = double_type_node; @@ -26144,7 +28112,7 @@ Index: gcc/config/rs6000/rs6000.c void_type_internal_node = void_type_node; /* Initialize the modes for builtin_function_type, mapping a machine mode to -@@ -13776,6 +13866,9 @@ +@@ -13776,6 +13901,9 @@ builtin_mode_to_type[TImode][1] = unsigned_intTI_type_node; builtin_mode_to_type[SFmode][0] = float_type_node; builtin_mode_to_type[DFmode][0] = double_type_node; @@ -26154,7 +28122,7 @@ Index: gcc/config/rs6000/rs6000.c builtin_mode_to_type[V1TImode][0] = V1TI_type_node; builtin_mode_to_type[V1TImode][1] = unsigned_V1TI_type_node; builtin_mode_to_type[V2SImode][0] = V2SI_type_node; -@@ -14868,6 +14961,8 @@ +@@ -14868,6 +14996,8 @@ /* unsigned 1 argument functions. */ case CRYPTO_BUILTIN_VSBOX: case P8V_BUILTIN_VGBBD: @@ -26163,7 +28131,7 @@ Index: gcc/config/rs6000/rs6000.c h.uns_p[0] = 1; h.uns_p[1] = 1; break; -@@ -14886,6 +14981,11 @@ +@@ -14886,6 +15016,11 @@ case CRYPTO_BUILTIN_VPMSUMW: case CRYPTO_BUILTIN_VPMSUMD: case CRYPTO_BUILTIN_VPMSUM: @@ -26175,7 +28143,7 @@ Index: gcc/config/rs6000/rs6000.c h.uns_p[0] = 1; h.uns_p[1] = 1; h.uns_p[2] = 1; -@@ -14947,9 +15047,18 @@ +@@ -14947,9 +15082,18 @@ /* signed args, unsigned return. */ case VSX_BUILTIN_XVCVDPUXDS_UNS: case ALTIVEC_BUILTIN_FIXUNS_V4SF_V4SI: @@ -26194,12 +28162,13 @@ Index: gcc/config/rs6000/rs6000.c default: break; } -@@ -31203,6 +31312,8 @@ +@@ -31203,6 +31347,9 @@ { "power8-vector", RS6000_BTM_P8_VECTOR, false, false }, { "crypto", RS6000_BTM_CRYPTO, false, false }, { "htm", RS6000_BTM_HTM, false, false }, + { "hard-dfp", RS6000_BTM_DFP, false, false }, + { "hard-float", RS6000_BTM_HARD_FLOAT, false, false }, ++ { "long-double-128", RS6000_BTM_LDBL128, false, false }, }; /* Option variables that we want to support inside attribute((target)) and @@ -26346,27 +28315,57 @@ Index: gcc/config/rs6000/rs6000.h /* E500 cores only support plain "sync", not lwsync. */ #define TARGET_NO_LWSYNC (rs6000_cpu == PROCESSOR_PPC8540 \ -@@ -2516,6 +2517,8 @@ +@@ -1601,8 +1602,15 @@ + /* Define this if stack space is still allocated for a parameter passed + in a register. The value is the number of bytes allocated to this + area. */ +-#define REG_PARM_STACK_SPACE(FNDECL) rs6000_reg_parm_stack_space((FNDECL)) ++#define REG_PARM_STACK_SPACE(FNDECL) \ ++ rs6000_reg_parm_stack_space ((FNDECL), false) + ++/* Define this macro if space guaranteed when compiling a function body ++ is different to space required when making a call, a situation that ++ can arise with K&R style function definitions. */ ++#define INCOMING_REG_PARM_STACK_SPACE(FNDECL) \ ++ rs6000_reg_parm_stack_space ((FNDECL), true) ++ + /* Define this if the above stack space is to be considered part of the + space allocated by the caller. */ + #define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1 +@@ -2500,8 +2508,8 @@ + #define RS6000_BTC_SAT RS6000_BTC_MISC /* saturate sets VSCR. */ + + /* Builtin targets. For now, we reuse the masks for those options that are in +- target flags, and pick two random bits for SPE and paired which aren't in +- target_flags. */ ++ target flags, and pick three random bits for SPE, paired and ldbl128 which ++ aren't in target_flags. */ + #define RS6000_BTM_ALWAYS 0 /* Always enabled. */ + #define RS6000_BTM_ALTIVEC MASK_ALTIVEC /* VMX/altivec vectors. */ + #define RS6000_BTM_VSX MASK_VSX /* VSX (vector/scalar). */ +@@ -2516,6 +2524,9 @@ #define RS6000_BTM_FRSQRTES MASK_POPCNTB /* FRSQRTES instruction. */ #define RS6000_BTM_POPCNTD MASK_POPCNTD /* Target supports ISA 2.06. */ #define RS6000_BTM_CELL MASK_FPRND /* Target is cell powerpc. */ +#define RS6000_BTM_DFP MASK_DFP /* Decimal floating point. */ +#define RS6000_BTM_HARD_FLOAT MASK_SOFT_FLOAT /* Hardware floating point. */ ++#define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */ #define RS6000_BTM_COMMON (RS6000_BTM_ALTIVEC \ | RS6000_BTM_VSX \ -@@ -2527,7 +2530,9 @@ +@@ -2527,7 +2538,10 @@ | RS6000_BTM_FRSQRTES \ | RS6000_BTM_HTM \ | RS6000_BTM_POPCNTD \ - | RS6000_BTM_CELL) + | RS6000_BTM_CELL \ + | RS6000_BTM_DFP \ -+ | RS6000_BTM_HARD_FLOAT) ++ | RS6000_BTM_HARD_FLOAT \ ++ | RS6000_BTM_LDBL128) /* Define builtin enum index. */ -@@ -2622,6 +2627,9 @@ +@@ -2622,6 +2636,9 @@ RS6000_BTI_UINTTI, /* unsigned_intTI_type_node */ RS6000_BTI_float, /* float_type_node */ RS6000_BTI_double, /* double_type_node */ @@ -26376,7 +28375,7 @@ Index: gcc/config/rs6000/rs6000.h RS6000_BTI_void, /* void_type_node */ RS6000_BTI_MAX }; -@@ -2673,6 +2681,9 @@ +@@ -2673,6 +2690,9 @@ #define uintTI_type_internal_node (rs6000_builtin_types[RS6000_BTI_UINTTI]) #define float_type_internal_node (rs6000_builtin_types[RS6000_BTI_float]) #define double_type_internal_node (rs6000_builtin_types[RS6000_BTI_double]) @@ -26885,7 +28884,7 @@ Index: gcc/config/rs6000/rs6000.md && (gpc_reg_operand (operands[0], <MODE>mode) || gpc_reg_operand (operands[1], <MODE>mode))" "#" -@@ -15691,7 +15743,192 @@ +@@ -15691,7 +15743,172 @@ }) @@ -26952,26 +28951,6 @@ Index: gcc/config/rs6000/rs6000.md + "" + "") + -+;; The Advance Toolchain 7.0-3 added private builtins: __builtin_longdouble_dw0 -+;; and __builtin_longdouble_dw1 to optimize glibc. Add support for these -+;; builtins here. -+ -+(define_expand "unpacktf_0" -+ [(set (match_operand:DF 0 "nonimmediate_operand" "") -+ (unspec:DF [(match_operand:TF 1 "register_operand" "") -+ (const_int 0)] -+ UNSPEC_UNPACK_128BIT))] -+ "" -+ "") -+ -+(define_expand "unpacktf_1" -+ [(set (match_operand:DF 0 "nonimmediate_operand" "") -+ (unspec:DF [(match_operand:TF 1 "register_operand" "") -+ (const_int 1)] -+ UNSPEC_UNPACK_128BIT))] -+ "" -+ "") -+ +(define_insn_and_split "unpack<mode>_dm" + [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m,d,r,m") + (unspec:<FP128_64> @@ -28177,7 +30156,81 @@ Index: gcc/tree-ssa-threadedge.c =================================================================== --- a/src/gcc/tree-ssa-threadedge.c (.../tags/gcc_4_9_0_release) +++ b/src/gcc/tree-ssa-threadedge.c (.../branches/gcc-4_9-branch) -@@ -387,8 +387,35 @@ +@@ -199,9 +199,7 @@ + traversing back edges less painful. */ + + static bool +-record_temporary_equivalences_from_phis (edge e, vec<tree> *stack, +- bool backedge_seen, +- bitmap src_map, bitmap dst_map) ++record_temporary_equivalences_from_phis (edge e, vec<tree> *stack) + { + gimple_stmt_iterator gsi; + +@@ -229,14 +227,6 @@ + stmt_count++; + + record_temporary_equivalence (dst, src, stack); +- +- /* If we have crossed a backedge, then start recording equivalences +- we might need to invalidate. */ +- if (backedge_seen && TREE_CODE (src) == SSA_NAME) +- { +- bitmap_set_bit (src_map, SSA_NAME_VERSION (src)); +- bitmap_set_bit (dst_map, SSA_NAME_VERSION (dst)); +- } + } + return true; + } +@@ -294,29 +284,15 @@ + /* A new value has been assigned to LHS. If necessary, invalidate any + equivalences that are no longer valid. */ + static void +-invalidate_equivalences (tree lhs, vec<tree> *stack, +- bitmap src_map, bitmap dst_map) ++invalidate_equivalences (tree lhs, vec<tree> *stack) + { +- /* SRC_MAP contains the source SSA_NAMEs for equivalences created by PHI +- nodes. If an entry in SRC_MAP changes, there's some destination that +- has been recorded as equivalent to the source and that equivalency +- needs to be eliminated. */ +- if (bitmap_bit_p (src_map, SSA_NAME_VERSION (lhs))) +- { +- unsigned int i; +- bitmap_iterator bi; + +- /* We know that the LHS of STMT was used as the RHS in an equivalency +- created by a PHI. All the LHS of such PHIs were recorded into DST_MAP. +- So we can iterate over them to see if any have the LHS of STMT as +- an equivalence, and if so, remove the equivalence as it is no longer +- valid. */ +- EXECUTE_IF_SET_IN_BITMAP (dst_map, 0, i, bi) +- { +- if (SSA_NAME_VALUE (ssa_name (i)) == lhs) +- record_temporary_equivalence (ssa_name (i), NULL_TREE, stack); +- } +- } ++ for (unsigned int i = 1; i < num_ssa_names; i++) ++ if (ssa_name (i) && SSA_NAME_VALUE (ssa_name (i)) == lhs) ++ record_temporary_equivalence (ssa_name (i), NULL_TREE, stack); ++ ++ if (SSA_NAME_VALUE (lhs)) ++ record_temporary_equivalence (lhs, NULL_TREE, stack); + } + + /* Try to simplify each statement in E->dest, ultimately leading to +@@ -341,9 +317,7 @@ + vec<tree> *stack, + tree (*simplify) (gimple, + gimple), +- bool backedge_seen, +- bitmap src_map, +- bitmap dst_map) ++ bool backedge_seen) + { + gimple stmt = NULL; + gimple_stmt_iterator gsi; +@@ -387,8 +361,23 @@ && (gimple_code (stmt) != GIMPLE_CALL || gimple_call_lhs (stmt) == NULL_TREE || TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME)) @@ -28194,19 +30247,7 @@ Index: gcc/tree-ssa-threadedge.c + + if (backedge_seen) + FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF) -+ { -+ /* This call only invalidates equivalences created by -+ PHI nodes. This is by design to keep the cost of -+ of invalidation reasonable. */ -+ invalidate_equivalences (op, stack, src_map, dst_map); -+ -+ /* However, conditionals can imply values for real -+ operands as well. And those won't be recorded in the -+ maps. In fact, those equivalences may be recorded totally -+ outside the threading code. We can just create a new -+ temporary NULL equivalence here. */ -+ record_temporary_equivalence (op, NULL_TREE, stack); -+ } ++ invalidate_equivalences (op, stack); + + continue; + } @@ -28214,7 +30255,30 @@ Index: gcc/tree-ssa-threadedge.c /* The result of __builtin_object_size depends on all the arguments of a phi node. Temporarily using only one edge produces invalid results. For example -@@ -939,9 +966,14 @@ +@@ -424,8 +413,7 @@ + if (backedge_seen) + { + tree lhs = gimple_get_lhs (stmt); +- record_temporary_equivalence (lhs, NULL_TREE, stack); +- invalidate_equivalences (lhs, stack, src_map, dst_map); ++ invalidate_equivalences (lhs, stack); + } + continue; + } +@@ -503,11 +491,7 @@ + || is_gimple_min_invariant (cached_lhs))) + record_temporary_equivalence (gimple_get_lhs (stmt), cached_lhs, stack); + else if (backedge_seen) +- record_temporary_equivalence (gimple_get_lhs (stmt), NULL_TREE, stack); +- +- if (backedge_seen) +- invalidate_equivalences (gimple_get_lhs (stmt), stack, +- src_map, dst_map); ++ invalidate_equivalences (gimple_get_lhs (stmt), stack); + } + return stmt; + } +@@ -939,9 +923,14 @@ SIMPLIFY is a pass-specific function used to simplify statements. Our caller is responsible for restoring the state of the expression @@ -28231,19 +30295,39 @@ Index: gcc/tree-ssa-threadedge.c thread_through_normal_block (edge e, gimple dummy_cond, bool handle_dominating_asserts, -@@ -963,7 +995,7 @@ - /* PHIs create temporary equivalences. */ - if (!record_temporary_equivalences_from_phis (e, stack, *backedge_seen_p, - src_map, dst_map)) +@@ -949,9 +938,7 @@ + tree (*simplify) (gimple, gimple), + vec<jump_thread_edge *> *path, + bitmap visited, +- bool *backedge_seen_p, +- bitmap src_map, +- bitmap dst_map) ++ bool *backedge_seen_p) + { + /* If we have traversed a backedge, then we do not want to look + at certain expressions in the table that can not be relied upon. +@@ -960,19 +947,28 @@ + if (*backedge_seen_p) + simplify = dummy_simplify; + +- /* PHIs create temporary equivalences. */ +- if (!record_temporary_equivalences_from_phis (e, stack, *backedge_seen_p, +- src_map, dst_map)) - return false; -+ return 0; ++ /* PHIs create temporary equivalences. ++ Note that if we found a PHI that made the block non-threadable, then ++ we need to bubble that up to our caller in the same manner we do ++ when we prematurely stop processing statements below. */ ++ if (!record_temporary_equivalences_from_phis (e, stack)) ++ return -1; /* Now walk each statement recording any context sensitive temporary equivalences we can detect. */ -@@ -971,8 +1003,16 @@ + gimple stmt = record_temporary_equivalences_from_stmts_at_dest (e, stack, simplify, - *backedge_seen_p, - src_map, dst_map); +- *backedge_seen_p, +- src_map, dst_map); ++ *backedge_seen_p); + + /* If we didn't look at all the statements, the most likely reason is + there were too many and thus duplicating this block is not profitable. @@ -28258,7 +30342,7 @@ Index: gcc/tree-ssa-threadedge.c /* If we stopped at a COND_EXPR or SWITCH_EXPR, see if we know which arm will be taken. */ -@@ -996,7 +1036,7 @@ +@@ -996,7 +992,7 @@ if (dest == NULL || dest == e->dest || bitmap_bit_p (visited, dest->index)) @@ -28267,7 +30351,7 @@ Index: gcc/tree-ssa-threadedge.c /* Only push the EDGE_START_JUMP_THREAD marker if this is first edge on the path. */ -@@ -1030,10 +1070,10 @@ +@@ -1030,10 +1026,10 @@ visited, path, backedge_seen_p); @@ -28280,7 +30364,16 @@ Index: gcc/tree-ssa-threadedge.c } /* We are exiting E->src, see if E->dest ends with a conditional -@@ -1085,9 +1125,12 @@ +@@ -1071,8 +1067,6 @@ + tree (*simplify) (gimple, gimple)) + { + bitmap visited = BITMAP_ALLOC (NULL); +- bitmap src_map = BITMAP_ALLOC (NULL); +- bitmap dst_map = BITMAP_ALLOC (NULL); + bool backedge_seen; + + stmt_count = 0; +@@ -1085,25 +1079,40 @@ if (backedge_seen) simplify = dummy_simplify; @@ -28290,13 +30383,17 @@ Index: gcc/tree-ssa-threadedge.c + int threaded = thread_through_normal_block (e, dummy_cond, + handle_dominating_asserts, + stack, simplify, path, -+ visited, &backedge_seen, -+ src_map, dst_map); ++ visited, &backedge_seen); + if (threaded > 0) { propagate_threaded_block_debug_into (path->last ()->e->dest, e->dest); -@@ -1100,10 +1143,27 @@ + remove_temporary_equivalences (stack); + BITMAP_FREE (visited); +- BITMAP_FREE (src_map); +- BITMAP_FREE (dst_map); + register_jump_thread (path); + return; } else { @@ -28318,23 +30415,61 @@ Index: gcc/tree-ssa-threadedge.c + if (threaded < 0) + { + BITMAP_FREE (visited); -+ BITMAP_FREE (src_map); -+ BITMAP_FREE (dst_map); + remove_temporary_equivalences (stack); + return; + } } /* We were unable to determine what out edge from E->dest is taken. However, -@@ -1185,7 +1245,7 @@ +@@ -1129,18 +1138,9 @@ + { + remove_temporary_equivalences (stack); + BITMAP_FREE (visited); +- BITMAP_FREE (src_map); +- BITMAP_FREE (dst_map); + return; + } + +- /* We need to restore the state of the maps to this point each loop +- iteration. */ +- bitmap src_map_copy = BITMAP_ALLOC (NULL); +- bitmap dst_map_copy = BITMAP_ALLOC (NULL); +- bitmap_copy (src_map_copy, src_map); +- bitmap_copy (dst_map_copy, dst_map); +- + /* Look at each successor of E->dest to see if we can thread through it. */ + FOR_EACH_EDGE (taken_edge, ei, e->dest->succs) + { +@@ -1147,8 +1147,6 @@ + /* Push a fresh marker so we can unwind the equivalences created + for each of E->dest's successors. */ + stack->safe_push (NULL_TREE); +- bitmap_copy (src_map, src_map_copy); +- bitmap_copy (dst_map, dst_map_copy); + + /* Avoid threading to any block we have already visited. */ + bitmap_clear (visited); +@@ -1184,8 +1182,7 @@ + found = thread_through_normal_block (path->last ()->e, dummy_cond, handle_dominating_asserts, stack, simplify, path, visited, - &backedge_seen, +- &backedge_seen, - src_map, dst_map); -+ src_map, dst_map) > 0; ++ &backedge_seen) > 0; /* If we were able to thread through a successor of E->dest, then record the jump threading opportunity. */ +@@ -1204,10 +1201,6 @@ + remove_temporary_equivalences (stack); + } + BITMAP_FREE (visited); +- BITMAP_FREE (src_map); +- BITMAP_FREE (dst_map); +- BITMAP_FREE (src_map_copy); +- BITMAP_FREE (dst_map_copy); + } + + remove_temporary_equivalences (stack); Index: libgo/configure =================================================================== --- a/src/libgo/configure (.../tags/gcc_4_9_0_release) |