summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authordoko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca>2014-06-16 09:03:56 +0000
committerdoko <doko@6ca36cf4-e1d1-0310-8c6f-e303bb2178ca>2014-06-16 09:03:56 +0000
commit16354269ab365409fdd5c8e4d571abac09995b6b (patch)
treeeaab6e61e5552a86b4b3a10bb238bff900fdc52a /debian
parent887e2b58571a2d1035b56a6e9ddb78143104fad7 (diff)
downloadgcc-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/changelog4
-rw-r--r--debian/patches/svn-updates.diff2463
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)