]> TLD Linux GIT Repositories - packages/gcc.git/commitdiff
- updated
authorMarcin Krol <hawk@tld-linux.org>
Wed, 5 Nov 2014 11:12:01 +0000 (11:12 +0000)
committerMarcin Krol <hawk@tld-linux.org>
Wed, 5 Nov 2014 11:12:01 +0000 (11:12 +0000)
gcc-branch.diff [new file with mode: 0644]

diff --git a/gcc-branch.diff b/gcc-branch.diff
new file mode 100644 (file)
index 0000000..9ac75af
--- /dev/null
@@ -0,0 +1,24106 @@
+Index: libstdc++-v3/python/libstdcxx/v6/printers.py
+===================================================================
+--- libstdc++-v3/python/libstdcxx/v6/printers.py       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/python/libstdcxx/v6/printers.py       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,4 +1,4 @@
+-# Pretty-printers for libstc++.
++# Pretty-printers for libstdc++.
+ # Copyright (C) 2008-2013 Free Software Foundation, Inc.
+@@ -18,7 +18,51 @@
+ import gdb
+ import itertools
+ import re
++import sys
++### Python 2 + Python 3 compatibility code
++
++# Resources about compatibility:
++#
++#  * <http://pythonhosted.org/six/>: Documentation of the "six" module
++
++# FIXME: The handling of e.g. std::basic_string (at least on char)
++# probably needs updating to work with Python 3's new string rules.
++#
++# In particular, Python 3 has a separate type (called byte) for
++# bytestrings, and a special b"" syntax for the byte literals; the old
++# str() type has been redefined to always store Unicode text.
++#
++# We probably can't do much about this until this GDB PR is addressed:
++# <https://sourceware.org/bugzilla/show_bug.cgi?id=17138>
++
++if sys.version_info[0] > 2:
++    ### Python 3 stuff
++    Iterator = object
++    # Python 3 folds these into the normal functions.
++    imap = map
++    izip = zip
++    # Also, int subsumes long
++    long = int
++else:
++    ### Python 2 stuff
++    class Iterator:
++        """Compatibility mixin for iterators
++
++        Instead of writing next() methods for iterators, write
++        __next__() methods and use this mixin to make them work in
++        Python 2 as well as Python 3.
++
++        Idea stolen from the "six" documentation:
++        <http://pythonhosted.org/six/#six.Iterator>
++        """
++
++        def next(self):
++            return self.__next__()
++
++    # In Python 2, we still need these from itertools
++    from itertools import imap, izip
++
+ # Try to use the new-style pretty-printing if available.
+ _use_gdb_pp = True
+ try:
+@@ -51,7 +95,7 @@
+         # anything fancier here.
+         field = typ.fields()[0]
+         if not field.is_base_class:
+-            raise ValueError, "Cannot find type %s::%s" % (str(orig), name)
++            raise ValueError("Cannot find type %s::%s" % (str(orig), name))
+         typ = field.type
+ class SharedPointerPrinter:
+@@ -87,7 +131,7 @@
+ class StdListPrinter:
+     "Print a std::list"
+-    class _iterator:
++    class _iterator(Iterator):
+         def __init__(self, nodetype, head):
+             self.nodetype = nodetype
+             self.base = head['_M_next']
+@@ -97,7 +141,7 @@
+         def __iter__(self):
+             return self
+-        def next(self):
++        def __next__(self):
+             if self.base == self.head:
+                 raise StopIteration
+             elt = self.base.cast(self.nodetype).dereference()
+@@ -135,7 +179,7 @@
+ class StdSlistPrinter:
+     "Print a __gnu_cxx::slist"
+-    class _iterator:
++    class _iterator(Iterator):
+         def __init__(self, nodetype, head):
+             self.nodetype = nodetype
+             self.base = head['_M_head']['_M_next']
+@@ -144,7 +188,7 @@
+         def __iter__(self):
+             return self
+-        def next(self):
++        def __next__(self):
+             if self.base == 0:
+                 raise StopIteration
+             elt = self.base.cast(self.nodetype).dereference()
+@@ -180,7 +224,7 @@
+ class StdVectorPrinter:
+     "Print a std::vector"
+-    class _iterator:
++    class _iterator(Iterator):
+         def __init__ (self, start, finish, bitvec):
+             self.bitvec = bitvec
+             if bitvec:
+@@ -198,7 +242,7 @@
+         def __iter__(self):
+             return self
+-        def next(self):
++        def __next__(self):
+             count = self.count
+             self.count = self.count + 1
+             if self.bitvec:
+@@ -265,7 +309,7 @@
+ class StdTuplePrinter:
+     "Print a std::tuple"
+-    class _iterator:
++    class _iterator(Iterator):
+         def __init__ (self, head):
+             self.head = head
+@@ -276,13 +320,13 @@
+                 # Set the actual head to the first pair.
+                 self.head  = self.head.cast (nodes[0].type)
+             elif len (nodes) != 0:
+-                raise ValueError, "Top of tuple tree does not consist of a single node."
++                raise ValueError("Top of tuple tree does not consist of a single node.")
+             self.count = 0
+         def __iter__ (self):
+             return self
+-        def next (self):
++        def __next__ (self):
+             nodes = self.head.type.fields ()
+             # Check for further recursions in the inheritance tree.
+             if len (nodes) == 0:
+@@ -289,7 +333,7 @@
+                 raise StopIteration
+             # Check that this iteration has an expected structure.
+             if len (nodes) != 2:
+-                raise ValueError, "Cannot parse more than 2 nodes in a tuple tree."
++                raise ValueError("Cannot parse more than 2 nodes in a tuple tree.")
+             # - Left node is the next recursion parent.
+             # - Right node is the actual class contained in the tuple.
+@@ -341,7 +385,7 @@
+             return self.visualizer.display_hint ()
+         return None
+-class RbtreeIterator:
++class RbtreeIterator(Iterator):
+     def __init__(self, rbtree):
+         self.size = rbtree['_M_t']['_M_impl']['_M_node_count']
+         self.node = rbtree['_M_t']['_M_impl']['_M_header']['_M_left']
+@@ -353,7 +397,7 @@
+     def __len__(self):
+         return int (self.size)
+-    def next(self):
++    def __next__(self):
+         if self.count == self.size:
+             raise StopIteration
+         result = self.node
+@@ -405,7 +449,7 @@
+     "Print a std::map or std::multimap"
+     # Turn an RbtreeIterator into a pretty-print iterator.
+-    class _iter:
++    class _iter(Iterator):
+         def __init__(self, rbiter, type):
+             self.rbiter = rbiter
+             self.count = 0
+@@ -414,9 +458,9 @@
+         def __iter__(self):
+             return self
+-        def next(self):
++        def __next__(self):
+             if self.count % 2 == 0:
+-                n = self.rbiter.next()
++                n = next(self.rbiter)
+                 n = n.cast(self.type).dereference()['_M_value_field']
+                 self.pair = n
+                 item = n['first']
+@@ -447,7 +491,7 @@
+     "Print a std::set or std::multiset"
+     # Turn an RbtreeIterator into a pretty-print iterator.
+-    class _iter:
++    class _iter(Iterator):
+         def __init__(self, rbiter, type):
+             self.rbiter = rbiter
+             self.count = 0
+@@ -456,8 +500,8 @@
+         def __iter__(self):
+             return self
+-        def next(self):
+-            item = self.rbiter.next()
++        def __next__(self):
++            item = next(self.rbiter)
+             item = item.cast(self.type).dereference()['_M_value_field']
+             # FIXME: this is weird ... what to do?
+             # Maybe a 'set' display hint?
+@@ -522,7 +566,7 @@
+ class StdDequePrinter:
+     "Print a std::deque"
+-    class _iter:
++    class _iter(Iterator):
+         def __init__(self, node, start, end, last, buffer_size):
+             self.node = node
+             self.p = start
+@@ -534,7 +578,7 @@
+         def __iter__(self):
+             return self
+-        def next(self):
++        def __next__(self):
+             if self.p == self.last:
+                 raise StopIteration
+@@ -619,7 +663,7 @@
+     def display_hint (self):
+         return 'string'
+-class Tr1HashtableIterator:
++class Tr1HashtableIterator(Iterator):
+     def __init__ (self, hash):
+         self.node = hash['_M_bbegin']['_M_node']['_M_nxt']
+         self.node_type = find_type(hash.type, '__node_type').pointer()
+@@ -627,7 +671,7 @@
+     def __iter__ (self):
+         return self
+-    def next (self):
++    def __next__ (self):
+         if self.node == 0:
+             raise StopIteration
+         node = self.node.cast(self.node_type)
+@@ -655,8 +699,8 @@
+         return '[%d]' % i
+     def children (self):
+-        counter = itertools.imap (self.format_count, itertools.count())
+-        return itertools.izip (counter, Tr1HashtableIterator (self.hashtable()))
++        counter = imap (self.format_count, itertools.count())
++        return izip (counter, Tr1HashtableIterator (self.hashtable()))
+ class Tr1UnorderedMapPrinter:
+     "Print a tr1::unordered_map"
+@@ -688,11 +732,11 @@
+         return '[%d]' % i
+     def children (self):
+-        counter = itertools.imap (self.format_count, itertools.count())
++        counter = imap (self.format_count, itertools.count())
+         # Map over the hash table and flatten the result.
+-        data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.hashtable())))
++        data = self.flatten (imap (self.format_one, Tr1HashtableIterator (self.hashtable())))
+         # Zip the two iterators together.
+-        return itertools.izip (counter, data)
++        return izip (counter, data)
+     def display_hint (self):
+         return 'map'
+@@ -700,7 +744,7 @@
+ class StdForwardListPrinter:
+     "Print a std::forward_list"
+-    class _iterator:
++    class _iterator(Iterator):
+         def __init__(self, nodetype, head):
+             self.nodetype = nodetype
+             self.base = head['_M_next']
+@@ -709,7 +753,7 @@
+         def __iter__(self):
+             return self
+-        def next(self):
++        def __next__(self):
+             if self.base == 0:
+                 raise StopIteration
+             elt = self.base.cast(self.nodetype).dereference()
+@@ -764,7 +808,7 @@
+         # A small sanity check.
+         # FIXME
+         if not self.compiled_rx.match(name + '<>'):
+-            raise ValueError, 'libstdc++ programming error: "%s" does not match' % name
++            raise ValueError('libstdc++ programming error: "%s" does not match' % name)
+         printer = RxPrinter(name, function)
+         self.subprinters.append(printer)
+         self.lookup[name] = printer
+Index: libstdc++-v3/scripts/run_doxygen
+===================================================================
+--- libstdc++-v3/scripts/run_doxygen   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/scripts/run_doxygen   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -193,8 +193,15 @@
+ if $do_latex; then
+     cd ${outdir}/${mode}
+-    # Also drop in the header file and style sheet
+-    doxygen -w latex header.tex doxygen.sty
++    # Grrr, Doxygen 1.8.x changed the -w latex options.
++    need_footer=`doxygen -h | sed -n -e '/-w latex/s=.*footer.*=true=p'`
++
++    # Also drop in the header file (maybe footer file) and style sheet
++    if $need_footer; then
++      doxygen -w latex header.tex footer.tex doxygen.sty
++    else
++      doxygen -w latex header.tex doxygen.sty
++    fi
+     
+     echo ::
+     echo :: LaTeX pages begin with
+Index: libstdc++-v3/doc/xml/manual/containers.xml
+===================================================================
+--- libstdc++-v3/doc/xml/manual/containers.xml (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/xml/manual/containers.xml (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -25,8 +25,9 @@
+   <section xml:id="sequences.list.size" xreflabel="list::size() is O(n)"><info><title>list::size() is O(n)</title></info>
+     
+    <para>
+-     Yes it is, and that's okay.  This is a decision that we preserved
+-     when we imported SGI's STL implementation.  The following is
++     Yes it is, and that was okay until the 2011 edition of the C++ standard.
++     In future GCC will change it to O(1) but O(N) was a decision that we
++     preserved when we imported SGI's STL implementation.  The following is
+      quoted from <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.sgi.com/tech/stl/FAQ.html">their FAQ</link>:
+    </para>
+    <blockquote>
+@@ -72,26 +73,6 @@
+   </section>
+ </section>
+-<section xml:id="containers.sequences.vector" xreflabel="vector"><info><title>vector</title></info>
+-<?dbhtml filename="vector.html"?>
+-  
+-  <para>
+-  </para>
+-  <section xml:id="sequences.vector.management" xreflabel="Space Overhead Management"><info><title>Space Overhead Management</title></info>
+-    
+-   <para>
+-     In <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2002-04/msg00105.html">this
+-     message to the list</link>, Daniel Kostecky announced work on an
+-     alternate form of <code>std::vector</code> that would support
+-     hints on the number of elements to be over-allocated.  The design
+-     was also described, along with possible implementation choices.
+-   </para>
+-   <para>
+-     The first two alpha releases were announced <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2002-07/msg00048.html">here</link>
+-     and <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2002-07/msg00111.html">here</link>.
+-   </para>
+-
+-  </section></section>
+ </section>
+ <!-- Sect1 02 : Associative -->
+Index: libstdc++-v3/doc/xml/manual/status_cxx2011.xml
+===================================================================
+--- libstdc++-v3/doc/xml/manual/status_cxx2011.xml     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/xml/manual/status_cxx2011.xml     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -226,10 +226,12 @@
+       <entry/>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>18.8.6</entry>
+       <entry><code>nested_exception</code></entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry>Follows an earlier C++0x draft, not the final specification.
++      </entry>
+     </row>
+     <row>
+       <entry>18.9</entry>
+@@ -612,10 +614,11 @@
+       <entry/>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>20.6.12.4</entry>
+       <entry><code>uninitialized_fill_n</code></entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry>Returns <code>void</code>.</entry>
+     </row>
+     <row>
+       <entry>20.6.13</entry>
+@@ -1119,10 +1122,13 @@
+       <entry/>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>21.4</entry>
+       <entry>Class template <code>basic_string</code></entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry>Non-conforming Copy-On-Write implementation.
++             Missing <code>getline</code> overloads for rvalue streams.
++      </entry>
+     </row>
+     <row>
+       <entry>21.5</entry>
+@@ -1190,10 +1196,11 @@
+       <entry/>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>22.3.3.1</entry>
+       <entry>Character classification</entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry>Missing <code>isblank</code>.</entry>
+     </row>
+     <row>
+       <entry>22.3.3.2</entry>
+@@ -1272,16 +1279,18 @@
+       <entry/>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>22.4.5.1</entry>
+       <entry>Class template <code>time_get</code></entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry>Missing <code>get</code> and <code>do_get</code></entry>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>22.4.5.2</entry>
+       <entry>Class template <code>time_get_byname</code></entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry>Likewise</entry>
+     </row>
+     <row>
+       <entry>22.4.5.3</entry>
+@@ -1434,8 +1443,10 @@
+       <entry>23.3.5</entry>
+       <entry>Class template <code>list</code></entry>
+       <entry>Partial</entry>
+-      <entry><code>insert</code> and <code>erase</code> members do not
+-             take <code>const_iterator</code> arguments (N2350).</entry>
++      <entry>O(N) size.
++             <code>insert</code> and <code>erase</code> members do not
++             take <code>const_iterator</code> arguments (N2350).
++      </entry>
+     </row>
+     <row>
+       <?dbhtml bgcolor="#B0B0B0" ?>
+@@ -1650,10 +1661,11 @@
+       <entry/>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>25.3</entry>
+       <entry>Mutating sequence operations</entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry><code>rotate</code> returns <code>void</code>.</entry>
+     </row>
+     <row>
+       <entry>25.4</entry>
+@@ -2060,10 +2072,13 @@
+       <entry/>
+     </row>
+     <row>
++      <?dbhtml bgcolor="#B0B0B0" ?>
+       <entry>26.8</entry>
+       <entry>C Library</entry>
+-      <entry>Y</entry>
+-      <entry/>
++      <entry>Partial</entry>
++      <entry><code>&lt;ctgmath&gt;</code> doesn't include
++      <code>&lt;ccomplex&gt;</code>
++      </entry>
+     </row>
+     <row>
+       <entry>
+@@ -2143,6 +2158,7 @@
+         Missing move and swap operations on <code>basic_ios</code>.
+         Missing <code>io_errc</code> and <code>iostream_category</code>.
+         <code>ios_base::failure</code> is not derived from <code>system_error</code>.
++      Missing <code>ios_base::hexfloat</code>.
+       </entry>
+     </row>
+     <row>
+Index: libstdc++-v3/doc/html/index.html
+===================================================================
+--- libstdc++-v3/doc/html/index.html   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/html/index.html   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -43,7 +43,7 @@
+ </a></span></dt><dd><dl><dt><span class="section"><a href="manual/localization.html#std.localization.locales">Locales</a></span></dt><dd><dl><dt><span class="section"><a href="manual/localization.html#std.localization.locales.locale">locale</a></span></dt><dd><dl><dt><span class="section"><a href="manual/localization.html#locales.locale.req">Requirements</a></span></dt><dt><span class="section"><a href="manual/localization.html#locales.locale.design">Design</a></span></dt><dt><span class="section"><a href="manual/localization.html#locales.locale.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="manual/localization.html#locale.impl.c">Interacting with "C" locales</a></span></dt></dl></dd><dt><span class="section"><a href="manual/localization.html#locales.locale.future">Future</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="manual/facets.html">Facets</a></span></dt><dd><dl><dt><span class="section"><a href="manual/facets.html#std.localization.facet.ctype">ctype</a></span></dt><dd><dl><dt><span class="section"><a href="manual/facets.html#facet.ctype.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="manual/facets.html#idm269999753024">Specializations</a></span></dt></dl></dd><dt><span class="section"><a href="manual/facets.html#facet.ctype.future">Future</a></span></dt></dl></dd><dt><span class="section"><a href="manual/facets.html#std.localization.facet.codecvt">codecvt</a></span></dt><dd><dl><dt><span class="section"><a href="manual/facets.html#facet.codecvt.req">Requirements</a></span></dt><dt><span class="section"><a href="manual/facets.html#facet.codecvt.design">Design</a></span></dt><dd><dl><dt><span class="section"><a href="manual/facets.html#codecvt.design.wchar_t_size"><span class="type">wchar_t</span> Size</a></span></dt><dt><span class="section"><a href="manual/facets.html#codecvt.design.unicode">Support for Unicode</a></span></dt><dt><span class="section"><a href="manual/facets.html#codecvt.design.issues">Other Issues</a></span></dt></dl></dd><dt><span class="section"><a href="manual/facets.html#facet.codecvt.impl">Implementation</a></span></dt><dt><span class="section"><a href="manual/facets.html#facet.codecvt.use">Use</a></span></dt><dt><span class="section"><a href="manual/facets.html#facet.codecvt.future">Future</a></span></dt></dl></dd><dt><span class="section"><a href="manual/facets.html#manual.localization.facet.messages">messages</a></span></dt><dd><dl><dt><span class="section"><a href="manual/facets.html#facet.messages.req">Requirements</a></span></dt><dt><span class="section"><a href="manual/facets.html#facet.messages.design">Design</a></span></dt><dt><span class="section"><a href="manual/facets.html#facet.messages.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="manual/facets.html#messages.impl.models">Models</a></span></dt><dt><span class="section"><a href="manual/facets.html#messages.impl.gnu">The GNU Model</a></span></dt></dl></dd><dt><span class="section"><a href="manual/facets.html#facet.messages.use">Use</a></span></dt><dt><span class="section"><a href="manual/facets.html#facet.messages.future">Future</a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="chapter"><a href="manual/containers.html">9. 
+   Containers
+   
+-</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd><dt><span class="section"><a href="manual/containers.html#containers.sequences.vector">vector</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers.html#sequences.vector.management">Space Overhead Management</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="manual/associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="manual/associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="manual/associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="manual/associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="manual/associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="manual/unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="manual/unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="manual/unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="manual/containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="manual/iterators.html">10. 
++</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="manual/associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="manual/associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="manual/associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="manual/associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="manual/associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="manual/unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="manual/unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="manual/unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="manual/containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="manual/containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="manual/iterators.html">10. 
+   Iterators
+   
+ </a></span></dt><dd><dl><dt><span class="section"><a href="manual/iterators.html#std.iterators.predefined">Predefined</a></span></dt><dd><dl><dt><span class="section"><a href="manual/iterators.html#iterators.predefined.vs_pointers">Iterators vs. Pointers</a></span></dt><dt><span class="section"><a href="manual/iterators.html#iterators.predefined.end">One Past the End</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="manual/algorithms.html">11. 
+@@ -162,4 +162,4 @@
+   
+ </a></span></dt><dt><span class="appendix"><a href="manual/appendix_gpl.html">D. 
+     <acronym class="acronym">GNU</acronym> General Public License version 3
+-  </a></span></dt><dt><span class="appendix"><a href="manual/appendix_gfdl.html">E. GNU Free Documentation License</a></span></dt></dl></dd></dl></dd><dt><span class="book"><a href="bk02.html"></a></span></dt><dd><dl><dt><span class="article"><a href="api.html">The GNU C++ Library API Reference</a></span></dt></dl></dd><dt><span class="book"><a href="bk03.html"></a></span></dt><dd><dl><dt><span class="article"><a href="faq.html">Frequently Asked Questions</a></span></dt></dl></dd></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="manual/index.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> The GNU C++ Library Manual</td></tr></table></div></body></html>
+\ No newline at end of file
++  </a></span></dt><dt><span class="appendix"><a href="manual/appendix_gfdl.html">E. GNU Free Documentation License</a></span></dt></dl></dd></dl></dd><dt><span class="book"><a href="bk02.html"></a></span></dt><dd><dl><dt><span class="article"><a href="api.html">The GNU C++ Library API Reference</a></span></dt></dl></dd><dt><span class="book"><a href="bk03.html"></a></span></dt><dd><dl><dt><span class="article"><a href="faq.html">Frequently Asked Questions</a></span></dt></dl></dd></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="manual/index.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> The GNU C++ Library Manual</td></tr></table></div></body></html>
+Index: libstdc++-v3/doc/html/manual/status.html
+===================================================================
+--- libstdc++-v3/doc/html/manual/status.html   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/html/manual/status.html   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -165,7 +165,8 @@
+              <code class="code">set_new_handler</code> is not thread-safe.
+       </td></tr><tr><td align="left">18.7</td><td align="left">Type identification</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">18.7.1</td><td align="left">Class type_info</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.7.2</td><td align="left">Class bad_cast</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.7.3</td><td align="left">Class bad_typeid</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.8</td><td align="left">Exception handling</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">18.8.1</td><td align="left">Class exception</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.8.2</td><td align="left">Class bad_exception</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">18.8.3</td><td align="left">Abnormal termination</td><td align="left">Partial</td><td align="left">Missing <code class="code">get_terminate</code>.
+              <code class="code">set_terminate</code> is not thread-safe.
+-      </td></tr><tr><td align="left">18.8.4</td><td align="left"><code class="code">uncaught_exception</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.8.5</td><td align="left">Exception Propagation</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.8.6</td><td align="left"><code class="code">nested_exception</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.9</td><td align="left">Initializer lists</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">18.9.1</td><td align="left">Initializer list constructors</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.9.2</td><td align="left">Initializer list access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.9.3</td><td align="left">Initializer list range access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.10</td><td align="left">Other runtime support</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
++      </td></tr><tr><td align="left">18.8.4</td><td align="left"><code class="code">uncaught_exception</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.8.5</td><td align="left">Exception Propagation</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">18.8.6</td><td align="left"><code class="code">nested_exception</code></td><td align="left">Partial</td><td align="left">Follows an earlier C++0x draft, not the final specification.
++      </td></tr><tr><td align="left">18.9</td><td align="left">Initializer lists</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">18.9.1</td><td align="left">Initializer list constructors</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.9.2</td><td align="left">Initializer list access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.9.3</td><td align="left">Initializer list range access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">18.10</td><td align="left">Other runtime support</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
+       <span class="emphasis"><em>19</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>Diagnostics</em></span>
+@@ -173,7 +174,7 @@
+       <span class="emphasis"><em>20</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>General utilities</em></span>
+-      </td></tr><tr><td align="left">20.1</td><td align="left">General</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.2</td><td align="left">Utility components</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.2.1</td><td align="left">Operators</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.2.2</td><td align="left">Swap</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.2.3</td><td align="left"><code class="code">forward</code> and <code class="code">move</code> helpers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.2.4</td><td align="left">Function template <code class="code">declval</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3</td><td align="left">Pairs</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.3.1</td><td align="left">In general</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.3.2</td><td align="left">Class template <code class="code">pair</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3.3</td><td align="left">Specialized algorithms</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3.4</td><td align="left">Tuple-like access to <code class="code">pair</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3.5</td><td align="left">Piecewise construction</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4</td><td align="left">Tuples</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.4.1</td><td align="left">In general</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.4.2</td><td align="left">Class template <code class="code">tuple</code></td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.4.2.1</td><td align="left">Construction</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.2</td><td align="left">Assignment</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.3</td><td align="left">Swap</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.4</td><td align="left">Tuple creation functions</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.5</td><td align="left">Tuple helper classes</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.6</td><td align="left">Element access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.7</td><td align="left">Relational operators</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.8</td><td align="left">Tuple traits</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.9</td><td align="left">Tuple specialized algorithms</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5</td><td align="left">Class template <code class="code">bitset</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.1</td><td align="left"><code class="code">bitset</code> constructors</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.2</td><td align="left"><code class="code">bitset</code> members</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.3</td><td align="left"><code class="code">bitset</code> hash support</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.4</td><td align="left"><code class="code">bitset</code> operators</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6</td><td align="left">Memory</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.1</td><td align="left">In general</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.2</td><td align="left">Header <code class="code">&lt;memory&gt;</code> synopsis</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.3</td><td align="left">Pointer traits</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">20.6.4</td><td align="left">Pointer safety</td><td align="left">Partial</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">20.6.5</td><td align="left">Align</td><td align="left">N</td><td align="left"> </td></tr><tr><td align="left">20.6.6</td><td align="left">Allocator argument tag</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.7</td><td align="left"><code class="code">uses_allocator</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.8</td><td align="left">Allocator traits</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.9</td><td align="left">The default allocator</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.10</td><td align="left">Raw storage iterator</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.11</td><td align="left">Temporary buffers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.12</td><td align="left">Specialized algorithms</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.12.1</td><td align="left"><code class="code">addressof</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.12.2</td><td align="left"><code class="code">uninitialized_copy</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.12.3</td><td align="left"><code class="code">uninitialized_fill</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.12.4</td><td align="left"><code class="code">uninitialized_fill_n</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.13</td><td align="left">C library</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7</td><td align="left">Smart pointers</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.7.1</td><td align="left">Class template <code class="code">unique_ptr</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7.2</td><td align="left">Shared-ownership pointers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7.2.1</td><td align="left">Class <code class="code">bad_weak_ptr</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7.2.2</td><td align="left">Class template <code class="code">shared_ptr</code></td><td align="left">Y</td><td align="left">
++      </td></tr><tr><td align="left">20.1</td><td align="left">General</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.2</td><td align="left">Utility components</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.2.1</td><td align="left">Operators</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.2.2</td><td align="left">Swap</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.2.3</td><td align="left"><code class="code">forward</code> and <code class="code">move</code> helpers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.2.4</td><td align="left">Function template <code class="code">declval</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3</td><td align="left">Pairs</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.3.1</td><td align="left">In general</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.3.2</td><td align="left">Class template <code class="code">pair</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3.3</td><td align="left">Specialized algorithms</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3.4</td><td align="left">Tuple-like access to <code class="code">pair</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.3.5</td><td align="left">Piecewise construction</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4</td><td align="left">Tuples</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.4.1</td><td align="left">In general</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.4.2</td><td align="left">Class template <code class="code">tuple</code></td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.4.2.1</td><td align="left">Construction</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.2</td><td align="left">Assignment</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.3</td><td align="left">Swap</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.4</td><td align="left">Tuple creation functions</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.5</td><td align="left">Tuple helper classes</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.6</td><td align="left">Element access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.7</td><td align="left">Relational operators</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.8</td><td align="left">Tuple traits</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.4.2.9</td><td align="left">Tuple specialized algorithms</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5</td><td align="left">Class template <code class="code">bitset</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.1</td><td align="left"><code class="code">bitset</code> constructors</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.2</td><td align="left"><code class="code">bitset</code> members</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.3</td><td align="left"><code class="code">bitset</code> hash support</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.5.4</td><td align="left"><code class="code">bitset</code> operators</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6</td><td align="left">Memory</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.1</td><td align="left">In general</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.2</td><td align="left">Header <code class="code">&lt;memory&gt;</code> synopsis</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.3</td><td align="left">Pointer traits</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">20.6.4</td><td align="left">Pointer safety</td><td align="left">Partial</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">20.6.5</td><td align="left">Align</td><td align="left">N</td><td align="left"> </td></tr><tr><td align="left">20.6.6</td><td align="left">Allocator argument tag</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.7</td><td align="left"><code class="code">uses_allocator</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.8</td><td align="left">Allocator traits</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.9</td><td align="left">The default allocator</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.10</td><td align="left">Raw storage iterator</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.11</td><td align="left">Temporary buffers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.12</td><td align="left">Specialized algorithms</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.6.12.1</td><td align="left"><code class="code">addressof</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.12.2</td><td align="left"><code class="code">uninitialized_copy</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.6.12.3</td><td align="left"><code class="code">uninitialized_fill</code></td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">20.6.12.4</td><td align="left"><code class="code">uninitialized_fill_n</code></td><td align="left">Partial</td><td align="left">Returns <code class="code">void</code>.</td></tr><tr><td align="left">20.6.13</td><td align="left">C library</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7</td><td align="left">Smart pointers</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">20.7.1</td><td align="left">Class template <code class="code">unique_ptr</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7.2</td><td align="left">Shared-ownership pointers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7.2.1</td><td align="left">Class <code class="code">bad_weak_ptr</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">20.7.2.2</td><td align="left">Class template <code class="code">shared_ptr</code></td><td align="left">Y</td><td align="left">
+       <p>
+         Uses code from
+         <a class="link" href="http://www.boost.org/libs/smart_ptr/shared_ptr.htm" target="_top">boost::shared_ptr</a>.
+@@ -187,14 +188,16 @@
+       <span class="emphasis"><em>21</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>Strings</em></span>
+-      </td></tr><tr><td align="left">21.1</td><td align="left">General</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2</td><td align="left">Character traits</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">21.2.1</td><td align="left">Character traits requirements</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2.2</td><td align="left">traits typedefs</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2.3</td><td align="left"><code class="code">char_traits</code> specializations</td><td align="left"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">21.2.3.1</td><td align="left">struct <code class="code">char_traits&lt;char&gt;</code></td><td align="left">Partial</td><td align="left">Missing constexpr</td></tr><tr bgcolor="#B0B0B0"><td align="left">21.2.3.2</td><td align="left">struct <code class="code">char_traits&lt;char16_t&gt;</code></td><td align="left">Partial</td><td align="left">Missing constexpr</td></tr><tr><td align="left">21.2.3.3</td><td align="left">struct <code class="code">char_traits&lt;char32_t&gt;</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2.3.4</td><td align="left">struct <code class="code">char_traits&lt;wchar_t&gt;</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.3</td><td align="left">String classes</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.4</td><td align="left">Class template <code class="code">basic_string</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.5</td><td align="left">Numeric Conversions</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.6</td><td align="left">Hash support</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">21.7</td><td align="left">Null-terminated sequence utilities</td><td align="left">Partial</td><td align="left">C library dependency.
++      </td></tr><tr><td align="left">21.1</td><td align="left">General</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2</td><td align="left">Character traits</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">21.2.1</td><td align="left">Character traits requirements</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2.2</td><td align="left">traits typedefs</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2.3</td><td align="left"><code class="code">char_traits</code> specializations</td><td align="left"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">21.2.3.1</td><td align="left">struct <code class="code">char_traits&lt;char&gt;</code></td><td align="left">Partial</td><td align="left">Missing constexpr</td></tr><tr bgcolor="#B0B0B0"><td align="left">21.2.3.2</td><td align="left">struct <code class="code">char_traits&lt;char16_t&gt;</code></td><td align="left">Partial</td><td align="left">Missing constexpr</td></tr><tr><td align="left">21.2.3.3</td><td align="left">struct <code class="code">char_traits&lt;char32_t&gt;</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.2.3.4</td><td align="left">struct <code class="code">char_traits&lt;wchar_t&gt;</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.3</td><td align="left">String classes</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">21.4</td><td align="left">Class template <code class="code">basic_string</code></td><td align="left">Partial</td><td align="left">Non-conforming Copy-On-Write implementation.
++             Missing <code class="code">getline</code> overloads for rvalue streams.
++      </td></tr><tr><td align="left">21.5</td><td align="left">Numeric Conversions</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">21.6</td><td align="left">Hash support</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">21.7</td><td align="left">Null-terminated sequence utilities</td><td align="left">Partial</td><td align="left">C library dependency.
+       Missing <code class="filename">&lt;cuchar&gt;</code>
+       </td></tr><tr><td align="left">
+               <span class="emphasis"><em>22</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>Localization</em></span>
+-      </td></tr><tr><td align="left">22.1</td><td align="left">General</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.2</td><td align="left">Header <code class="code">&lt;locale&gt;</code> synopsis</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.3</td><td align="left">Locales</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.3.1</td><td align="left">Class <code class="code">locale</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.3.2</td><td align="left"><code class="code">locale</code> globals</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.3.3</td><td align="left">Convenience interfaces</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.3.3.1</td><td align="left">Character classification</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.3.3.2</td><td align="left">Conversions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.3.3.2.1</td><td align="left">Character conversions</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">22.3.3.2.2</td><td align="left"><code class="code">string</code> conversions</td><td align="left">N</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">22.3.3.2.3</td><td align="left">Buffer conversions</td><td align="left">N</td><td align="left"> </td></tr><tr><td align="left">22.4</td><td align="left">Standard <code class="code">locale</code> categories</td><td align="left"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">22.4.1</td><td align="left">The <code class="code">ctype</code> category</td><td align="left">Partial</td><td align="left">Missing <code class="code">codecvt&lt;char16_t&gt;</code> and
+-             <code class="code">codecvt&lt;char32_t&gt;</code></td></tr><tr><td align="left">22.4.2</td><td align="left">The numeric category</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.4.2.1</td><td align="left"><code class="code">num_get</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.2.2</td><td align="left"><code class="code">num_put</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.3</td><td align="left">The numeric punctuation facet</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.4</td><td align="left">The collate category</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.5</td><td align="left">The time category</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.4.5.1</td><td align="left">Class template <code class="code">time_get</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.5.2</td><td align="left">Class template <code class="code">time_get_byname</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.5.3</td><td align="left">Class template <code class="code">time_put</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.5.3</td><td align="left">Class template <code class="code">time_put_byname</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6</td><td align="left">The monetary category</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.4.6.1</td><td align="left">Class template <code class="code">money_get</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6.2</td><td align="left">Class template <code class="code">money_put</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6.3</td><td align="left">Class template <code class="code">money_punct</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6.4</td><td align="left">Class template <code class="code">money_punct_byname</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.7</td><td align="left">The message retrieval category</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.8</td><td align="left">Program-defined facets</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">22.5</td><td align="left">Standard code conversion facets</td><td align="left">N</td><td align="left"> </td></tr><tr><td align="left">22.6</td><td align="left">C Library Locales</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
++      </td></tr><tr><td align="left">22.1</td><td align="left">General</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.2</td><td align="left">Header <code class="code">&lt;locale&gt;</code> synopsis</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.3</td><td align="left">Locales</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.3.1</td><td align="left">Class <code class="code">locale</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.3.2</td><td align="left"><code class="code">locale</code> globals</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.3.3</td><td align="left">Convenience interfaces</td><td align="left"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">22.3.3.1</td><td align="left">Character classification</td><td align="left">Partial</td><td align="left">Missing <code class="code">isblank</code>.</td></tr><tr><td align="left">22.3.3.2</td><td align="left">Conversions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.3.3.2.1</td><td align="left">Character conversions</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">22.3.3.2.2</td><td align="left"><code class="code">string</code> conversions</td><td align="left">N</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">22.3.3.2.3</td><td align="left">Buffer conversions</td><td align="left">N</td><td align="left"> </td></tr><tr><td align="left">22.4</td><td align="left">Standard <code class="code">locale</code> categories</td><td align="left"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">22.4.1</td><td align="left">The <code class="code">ctype</code> category</td><td align="left">Partial</td><td align="left">Missing <code class="code">codecvt&lt;char16_t&gt;</code> and
++             <code class="code">codecvt&lt;char32_t&gt;</code></td></tr><tr><td align="left">22.4.2</td><td align="left">The numeric category</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.4.2.1</td><td align="left"><code class="code">num_get</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.2.2</td><td align="left"><code class="code">num_put</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.3</td><td align="left">The numeric punctuation facet</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.4</td><td align="left">The collate category</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.5</td><td align="left">The time category</td><td align="left"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">22.4.5.1</td><td align="left">Class template <code class="code">time_get</code></td><td align="left">Partial</td><td align="left">Missing <code class="code">get</code> and <code class="code">do_get</code></td></tr><tr bgcolor="#B0B0B0"><td align="left">22.4.5.2</td><td align="left">Class template <code class="code">time_get_byname</code></td><td align="left">Partial</td><td align="left">Likewise</td></tr><tr><td align="left">22.4.5.3</td><td align="left">Class template <code class="code">time_put</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.5.3</td><td align="left">Class template <code class="code">time_put_byname</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6</td><td align="left">The monetary category</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">22.4.6.1</td><td align="left">Class template <code class="code">money_get</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6.2</td><td align="left">Class template <code class="code">money_put</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6.3</td><td align="left">Class template <code class="code">money_punct</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.6.4</td><td align="left">Class template <code class="code">money_punct_byname</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.7</td><td align="left">The message retrieval category</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">22.4.8</td><td align="left">Program-defined facets</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#C8B0B0"><td align="left">22.5</td><td align="left">Standard code conversion facets</td><td align="left">N</td><td align="left"> </td></tr><tr><td align="left">22.6</td><td align="left">C Library Locales</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
+       <span class="emphasis"><em>23</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>Containers</em></span>
+@@ -201,8 +204,10 @@
+       </td></tr><tr><td align="left">23.1</td><td align="left">General</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">23.2</td><td align="left">Container requirements</td><td align="left"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">23.2.1</td><td align="left">General container requirements</td><td align="left">Partial</td><td align="left">Only <code class="code">vector</code> and <code class="code">forward_list</code>
+              meet the requirements
+              relating to allocator use and propagation.</td></tr><tr><td align="left">23.2.2</td><td align="left">Container data races</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.2.3</td><td align="left">Sequence containers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.2.4</td><td align="left">Associative containers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.2.5</td><td align="left">Unordered associative containers</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.3</td><td align="left">Sequence containers</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">23.3.2</td><td align="left">Class template <code class="code">array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">23.3.3</td><td align="left">Class template <code class="code">deque</code></td><td align="left">Partial</td><td align="left"><code class="code">insert</code> and <code class="code">erase</code> members do not
+-             take <code class="code">const_iterator</code> arguments (N2350).</td></tr><tr><td align="left">23.3.4</td><td align="left">Class template <code class="code">forward_list</code></td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">23.3.5</td><td align="left">Class template <code class="code">list</code></td><td align="left">Partial</td><td align="left"><code class="code">insert</code> and <code class="code">erase</code> members do not
+-             take <code class="code">const_iterator</code> arguments (N2350).</td></tr><tr bgcolor="#B0B0B0"><td align="left">23.3.6</td><td align="left">Class template <code class="code">vector</code></td><td align="left">Partial</td><td align="left"><code class="code">insert</code> and <code class="code">erase</code> members do not
++             take <code class="code">const_iterator</code> arguments (N2350).</td></tr><tr><td align="left">23.3.4</td><td align="left">Class template <code class="code">forward_list</code></td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">23.3.5</td><td align="left">Class template <code class="code">list</code></td><td align="left">Partial</td><td align="left">O(N) size.
++             <code class="code">insert</code> and <code class="code">erase</code> members do not
++             take <code class="code">const_iterator</code> arguments (N2350).
++      </td></tr><tr bgcolor="#B0B0B0"><td align="left">23.3.6</td><td align="left">Class template <code class="code">vector</code></td><td align="left">Partial</td><td align="left"><code class="code">insert</code> and <code class="code">erase</code> members do not
+              take <code class="code">const_iterator</code> arguments (N2350).</td></tr><tr bgcolor="#B0B0B0"><td align="left">23.3.7</td><td align="left">Class <code class="code">vector&lt;bool&gt;</code></td><td align="left">Partial</td><td align="left"><code class="code">insert</code> and <code class="code">erase</code> members do not
+              take <code class="code">const_iterator</code> arguments (N2350).</td></tr><tr><td align="left">23.4</td><td align="left">Associative containers</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">23.4.4</td><td align="left">Class template <code class="code">map</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.4.5</td><td align="left">Class template <code class="code">multimap</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.4.6</td><td align="left">Class template <code class="code">set</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.4.7</td><td align="left">Class template <code class="code">multiset</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.5</td><td align="left">Unordered associative containers</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">23.5.4</td><td align="left">Class template <code class="code">unordered_map</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.5.5</td><td align="left">Class template <code class="code">unordered_multimap</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.5.6</td><td align="left">Class template <code class="code">unordered_set</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.5.7</td><td align="left">Class template <code class="code">unordered_multiset</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.6</td><td align="left">Container adaptors</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">23.6.1</td><td align="left">Class template <code class="code">queue</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.6.2</td><td align="left">Class template <code class="code">priority_queue</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">23.6.3</td><td align="left">Class template <code class="code">stack</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
+       <span class="emphasis"><em>24</em></span>
+@@ -212,11 +217,13 @@
+       <span class="emphasis"><em>25</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>Algorithms</em></span>
+-      </td></tr><tr><td align="left">25.1</td><td align="left">General</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">25.2</td><td align="left">Non-modifying sequence operations</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">25.3</td><td align="left">Mutating sequence operations</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">25.4</td><td align="left">Sorting and related operations</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">25.5</td><td align="left">C library algorithms</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
++      </td></tr><tr><td align="left">25.1</td><td align="left">General</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">25.2</td><td align="left">Non-modifying sequence operations</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">25.3</td><td align="left">Mutating sequence operations</td><td align="left">Partial</td><td align="left"><code class="code">rotate</code> returns <code class="code">void</code>.</td></tr><tr><td align="left">25.4</td><td align="left">Sorting and related operations</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">25.5</td><td align="left">C library algorithms</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
+       <span class="emphasis"><em>26</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>Numerics</em></span>
+-      </td></tr><tr><td align="left">26.1</td><td align="left">General</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.2</td><td align="left">Numeric type requirements</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.3</td><td align="left">The floating-point environment</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.4</td><td align="left">Complex numbers</td><td align="left">Partial</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5</td><td align="left">Random number generation</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.1</td><td align="left">Requirements</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.2</td><td align="left">Header <code class="code">&lt;random&gt;</code> synopsis</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.3</td><td align="left">Random number engine class templates</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.3.1</td><td align="left">Class template <code class="code">linear_congruential_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.3.2</td><td align="left">Class template <code class="code">mersenne_twister_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.3.3</td><td align="left">Class template <code class="code">subtract_with_carry_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.4</td><td align="left">Random number engine adaptor class templates</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.4.2</td><td align="left">Class template <code class="code">discard_block_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.4.3</td><td align="left">Class template <code class="code">independent_bits_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.4.4</td><td align="left">Class template <code class="code">shuffle_order_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.5</td><td align="left">Engines and engine adaptors with predefined parameters</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.6</td><td align="left">Class <code class="code">random_device</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.7</td><td align="left">Utilities</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.7.1</td><td align="left">Class <code class="code">seed_seq</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.7.2</td><td align="left">Function template <code class="code">generate_canonical</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8</td><td align="left">Random number distribution class templates</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.2</td><td align="left">Uniform distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.2.1</td><td align="left">Class template <code class="code">uniform_int_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.2.2</td><td align="left">Class template <code class="code">uniform_real_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3</td><td align="left">Bernoulli distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.1</td><td align="left">Class <code class="code">bernoulli_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.2</td><td align="left">Class template <code class="code">binomial_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.3</td><td align="left">Class template <code class="code">geometric_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.4</td><td align="left">Class template <code class="code">negative_binomial_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4</td><td align="left">Poisson distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.1</td><td align="left">Class template <code class="code">poisson_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.2</td><td align="left">Class template <code class="code">exponential_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.3</td><td align="left">Class template <code class="code">gamma_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.4</td><td align="left">Class template <code class="code">weibull_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.5</td><td align="left">Class template <code class="code">extreme_value_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5</td><td align="left">Normal distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.1</td><td align="left">Class template <code class="code">normal_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.2</td><td align="left">Class template <code class="code">lognormal_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.3</td><td align="left">Class template <code class="code">chi_squared_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.4</td><td align="left">Class template <code class="code">cauchy_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.5</td><td align="left">Class template <code class="code">fisher_f_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.6</td><td align="left">Class template <code class="code">student_t_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.6</td><td align="left">Sampling distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.6.1</td><td align="left">Class template <code class="code">discrete_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.6.2</td><td align="left">Class template <code class="code">piecewise_constant_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.6.3</td><td align="left">Class template <code class="code">piecewise_linear_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6</td><td align="left">Numeric arrays</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.6.1</td><td align="left">Header <code class="code">&lt;valarray&gt;</code> synopsis</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.2</td><td align="left">Class template <code class="code">valarray</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.3</td><td align="left"><code class="code">valarray</code> non-member operations</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.4</td><td align="left">Class <code class="code">slice</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.5</td><td align="left">Class template <code class="code">slice_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.6</td><td align="left">The <code class="code">gslice</code> class</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.7</td><td align="left">Class template <code class="code">gslice_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.8</td><td align="left">Class template <code class="code">mask_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.9</td><td align="left">Class template <code class="code">indirect_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.10</td><td align="left"><code class="code">valarray</code> range access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7</td><td align="left">Generalized numeric operations</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.7.1</td><td align="left">Header <code class="code">&lt;numeric&gt;</code> synopsis</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.2</td><td align="left"><code class="code">accumulate</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.3</td><td align="left"><code class="code">inner_product</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.4</td><td align="left"><code class="code">partial_sum</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.5</td><td align="left"><code class="code">adjacent_difference</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.6</td><td align="left">iota</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.8</td><td align="left">C Library</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">
++      </td></tr><tr><td align="left">26.1</td><td align="left">General</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.2</td><td align="left">Numeric type requirements</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.3</td><td align="left">The floating-point environment</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.4</td><td align="left">Complex numbers</td><td align="left">Partial</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5</td><td align="left">Random number generation</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.1</td><td align="left">Requirements</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.2</td><td align="left">Header <code class="code">&lt;random&gt;</code> synopsis</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.3</td><td align="left">Random number engine class templates</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.3.1</td><td align="left">Class template <code class="code">linear_congruential_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.3.2</td><td align="left">Class template <code class="code">mersenne_twister_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.3.3</td><td align="left">Class template <code class="code">subtract_with_carry_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.4</td><td align="left">Random number engine adaptor class templates</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.4.2</td><td align="left">Class template <code class="code">discard_block_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.4.3</td><td align="left">Class template <code class="code">independent_bits_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.4.4</td><td align="left">Class template <code class="code">shuffle_order_engine</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.5</td><td align="left">Engines and engine adaptors with predefined parameters</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.6</td><td align="left">Class <code class="code">random_device</code></td><td align="left">Y</td><td align="left">Missing constexpr</td></tr><tr><td align="left">26.5.7</td><td align="left">Utilities</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.7.1</td><td align="left">Class <code class="code">seed_seq</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.7.2</td><td align="left">Function template <code class="code">generate_canonical</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8</td><td align="left">Random number distribution class templates</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.2</td><td align="left">Uniform distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.2.1</td><td align="left">Class template <code class="code">uniform_int_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.2.2</td><td align="left">Class template <code class="code">uniform_real_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3</td><td align="left">Bernoulli distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.1</td><td align="left">Class <code class="code">bernoulli_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.2</td><td align="left">Class template <code class="code">binomial_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.3</td><td align="left">Class template <code class="code">geometric_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.3.4</td><td align="left">Class template <code class="code">negative_binomial_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4</td><td align="left">Poisson distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.1</td><td align="left">Class template <code class="code">poisson_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.2</td><td align="left">Class template <code class="code">exponential_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.3</td><td align="left">Class template <code class="code">gamma_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.4</td><td align="left">Class template <code class="code">weibull_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.4.5</td><td align="left">Class template <code class="code">extreme_value_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5</td><td align="left">Normal distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.1</td><td align="left">Class template <code class="code">normal_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.2</td><td align="left">Class template <code class="code">lognormal_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.3</td><td align="left">Class template <code class="code">chi_squared_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.4</td><td align="left">Class template <code class="code">cauchy_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.5</td><td align="left">Class template <code class="code">fisher_f_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.5.6</td><td align="left">Class template <code class="code">student_t_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.6</td><td align="left">Sampling distributions</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.5.8.6.1</td><td align="left">Class template <code class="code">discrete_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.6.2</td><td align="left">Class template <code class="code">piecewise_constant_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.5.8.6.3</td><td align="left">Class template <code class="code">piecewise_linear_distribution</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6</td><td align="left">Numeric arrays</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.6.1</td><td align="left">Header <code class="code">&lt;valarray&gt;</code> synopsis</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.2</td><td align="left">Class template <code class="code">valarray</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.3</td><td align="left"><code class="code">valarray</code> non-member operations</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.4</td><td align="left">Class <code class="code">slice</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.5</td><td align="left">Class template <code class="code">slice_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.6</td><td align="left">The <code class="code">gslice</code> class</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.7</td><td align="left">Class template <code class="code">gslice_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.8</td><td align="left">Class template <code class="code">mask_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.9</td><td align="left">Class template <code class="code">indirect_array</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.6.10</td><td align="left"><code class="code">valarray</code> range access</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7</td><td align="left">Generalized numeric operations</td><td align="left"> </td><td align="left"> </td></tr><tr><td align="left">26.7.1</td><td align="left">Header <code class="code">&lt;numeric&gt;</code> synopsis</td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.2</td><td align="left"><code class="code">accumulate</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.3</td><td align="left"><code class="code">inner_product</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.4</td><td align="left"><code class="code">partial_sum</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.5</td><td align="left"><code class="code">adjacent_difference</code></td><td align="left">Y</td><td align="left"> </td></tr><tr><td align="left">26.7.6</td><td align="left">iota</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">26.8</td><td align="left">C Library</td><td align="left">Partial</td><td align="left"><code class="code">&lt;ctgmath&gt;</code> doesn't include
++      <code class="code">&lt;ccomplex&gt;</code>
++      </td></tr><tr><td align="left">
+       <span class="emphasis"><em>27</em></span>
+       </td><td colspan="3" align="left">
+       <span class="emphasis"><em>Input/output library</em></span>
+@@ -224,6 +231,7 @@
+         Missing move and swap operations on <code class="code">basic_ios</code>.
+         Missing <code class="code">io_errc</code> and <code class="code">iostream_category</code>.
+         <code class="code">ios_base::failure</code> is not derived from <code class="code">system_error</code>.
++      Missing <code class="code">ios_base::hexfloat</code>.
+       </td></tr><tr><td align="left">27.6</td><td align="left">Stream buffers</td><td align="left">Y</td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left">27.7</td><td align="left">Formatting and manipulators</td><td align="left">Partial</td><td align="left">
+         Missing move and swap operations
+         Missing <code class="code">get_time</code> and <code class="code">put_time</code> manipulators.
+Index: libstdc++-v3/doc/html/manual/abi.html
+===================================================================
+--- libstdc++-v3/doc/html/manual/abi.html      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/html/manual/abi.html      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -96,7 +96,7 @@
+    definitions, where the version definition is the maximum for a
+    particular release. Labels are cumulative. If a particular release
+    is not listed, it has the same version labels as the preceding
+-   release.</p><p>This corresponds to the mapfile: gcc/libgcc-std.ver</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>GCC 3.0.0: GCC_3.0</p></li><li class="listitem"><p>GCC 3.3.0: GCC_3.3</p></li><li class="listitem"><p>GCC 3.3.1: GCC_3.3.1</p></li><li class="listitem"><p>GCC 3.3.2: GCC_3.3.2</p></li><li class="listitem"><p>GCC 3.3.4: GCC_3.3.4</p></li><li class="listitem"><p>GCC 3.4.0: GCC_3.4</p></li><li class="listitem"><p>GCC 3.4.2: GCC_3.4.2</p></li><li class="listitem"><p>GCC 3.4.4: GCC_3.4.4</p></li><li class="listitem"><p>GCC 4.0.0: GCC_4.0.0</p></li><li class="listitem"><p>GCC 4.1.0: GCC_4.1.0</p></li><li class="listitem"><p>GCC 4.2.0: GCC_4.2.0</p></li><li class="listitem"><p>GCC 4.3.0: GCC_4.3.0</p></li><li class="listitem"><p>GCC 4.4.0: GCC_4.4.0</p></li><li class="listitem"><p>GCC 4.5.0: GCC_4.5.0</p></li><li class="listitem"><p>GCC 4.6.0: GCC_4.6.0</p></li><li class="listitem"><p>GCC 4.7.0: GCC_4.7.0</p></li></ul></div></li><li class="listitem"><p>
++   release.</p><p>This corresponds to the mapfile: gcc/libgcc-std.ver</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>GCC 3.0.0: GCC_3.0</p></li><li class="listitem"><p>GCC 3.3.0: GCC_3.3</p></li><li class="listitem"><p>GCC 3.3.1: GCC_3.3.1</p></li><li class="listitem"><p>GCC 3.3.2: GCC_3.3.2</p></li><li class="listitem"><p>GCC 3.3.4: GCC_3.3.4</p></li><li class="listitem"><p>GCC 3.4.0: GCC_3.4</p></li><li class="listitem"><p>GCC 3.4.2: GCC_3.4.2</p></li><li class="listitem"><p>GCC 3.4.4: GCC_3.4.4</p></li><li class="listitem"><p>GCC 4.0.0: GCC_4.0.0</p></li><li class="listitem"><p>GCC 4.1.0: GCC_4.1.0</p></li><li class="listitem"><p>GCC 4.2.0: GCC_4.2.0</p></li><li class="listitem"><p>GCC 4.3.0: GCC_4.3.0</p></li><li class="listitem"><p>GCC 4.4.0: GCC_4.4.0</p></li><li class="listitem"><p>GCC 4.5.0: GCC_4.5.0</p></li><li class="listitem"><p>GCC 4.6.0: GCC_4.6.0</p></li><li class="listitem"><p>GCC 4.7.0: GCC_4.7.0</p></li><li class="listitem"><p>GCC 4.8.0: GCC_4.8.0</p></li></ul></div></li><li class="listitem"><p>
+       Release versioning on the libstdc++.so binary, implemented in
+       the same way as the libgcc_s.so binary above. Listed is the
+       filename: <code class="constant">DT_SONAME</code> can be deduced from
+@@ -111,7 +111,7 @@
+       has the same filename and <code class="constant">DT_SONAME</code> as the
+       preceding release.
+       </p><p>It is versioned as follows:
+-    </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>GCC 3.0.0: libstdc++.so.3.0.0</p></li><li class="listitem"><p>GCC 3.0.1: libstdc++.so.3.0.1</p></li><li class="listitem"><p>GCC 3.0.2: libstdc++.so.3.0.2</p></li><li class="listitem"><p>GCC 3.0.3: libstdc++.so.3.0.2 (See Note 1)</p></li><li class="listitem"><p>GCC 3.0.4: libstdc++.so.3.0.4</p></li><li class="listitem"><p>GCC 3.1.0: libstdc++.so.4.0.0 <span class="emphasis"><em>(Incompatible with previous)</em></span></p></li><li class="listitem"><p>GCC 3.1.1: libstdc++.so.4.0.1</p></li><li class="listitem"><p>GCC 3.2.0: libstdc++.so.5.0.0 <span class="emphasis"><em>(Incompatible with previous)</em></span></p></li><li class="listitem"><p>GCC 3.2.1: libstdc++.so.5.0.1</p></li><li class="listitem"><p>GCC 3.2.2: libstdc++.so.5.0.2</p></li><li class="listitem"><p>GCC 3.2.3: libstdc++.so.5.0.3 (See Note 2)</p></li><li class="listitem"><p>GCC 3.3.0: libstdc++.so.5.0.4</p></li><li class="listitem"><p>GCC 3.3.1: libstdc++.so.5.0.5</p></li><li class="listitem"><p>GCC 3.4.0: libstdc++.so.6.0.0 <span class="emphasis"><em>(Incompatible with previous)</em></span></p></li><li class="listitem"><p>GCC 3.4.1: libstdc++.so.6.0.1</p></li><li class="listitem"><p>GCC 3.4.2: libstdc++.so.6.0.2</p></li><li class="listitem"><p>GCC 3.4.3: libstdc++.so.6.0.3</p></li><li class="listitem"><p>GCC 4.0.0: libstdc++.so.6.0.4</p></li><li class="listitem"><p>GCC 4.0.1: libstdc++.so.6.0.5</p></li><li class="listitem"><p>GCC 4.0.2: libstdc++.so.6.0.6</p></li><li class="listitem"><p>GCC 4.0.3: libstdc++.so.6.0.7</p></li><li class="listitem"><p>GCC 4.1.0: libstdc++.so.6.0.7</p></li><li class="listitem"><p>GCC 4.1.1: libstdc++.so.6.0.8</p></li><li class="listitem"><p>GCC 4.2.0: libstdc++.so.6.0.9</p></li><li class="listitem"><p>GCC 4.2.1: libstdc++.so.6.0.9 (See Note 3)</p></li><li class="listitem"><p>GCC 4.2.2: libstdc++.so.6.0.9</p></li><li class="listitem"><p>GCC 4.3.0: libstdc++.so.6.0.10</p></li><li class="listitem"><p>GCC 4.4.0: libstdc++.so.6.0.11</p></li><li class="listitem"><p>GCC 4.4.1: libstdc++.so.6.0.12</p></li><li class="listitem"><p>GCC 4.4.2: libstdc++.so.6.0.13</p></li><li class="listitem"><p>GCC 4.5.0: libstdc++.so.6.0.14</p></li><li class="listitem"><p>GCC 4.6.0: libstdc++.so.6.0.15</p></li><li class="listitem"><p>GCC 4.6.1: libstdc++.so.6.0.16</p></li><li class="listitem"><p>GCC 4.7.0: libstdc++.so.6.0.17</p></li><li class="listitem"><p>GCC 4.8.0: libstdc++.so.6.0.18</p></li></ul></div><p>
++    </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>GCC 3.0.0: libstdc++.so.3.0.0</p></li><li class="listitem"><p>GCC 3.0.1: libstdc++.so.3.0.1</p></li><li class="listitem"><p>GCC 3.0.2: libstdc++.so.3.0.2</p></li><li class="listitem"><p>GCC 3.0.3: libstdc++.so.3.0.2 (See Note 1)</p></li><li class="listitem"><p>GCC 3.0.4: libstdc++.so.3.0.4</p></li><li class="listitem"><p>GCC 3.1.0: libstdc++.so.4.0.0 <span class="emphasis"><em>(Incompatible with previous)</em></span></p></li><li class="listitem"><p>GCC 3.1.1: libstdc++.so.4.0.1</p></li><li class="listitem"><p>GCC 3.2.0: libstdc++.so.5.0.0 <span class="emphasis"><em>(Incompatible with previous)</em></span></p></li><li class="listitem"><p>GCC 3.2.1: libstdc++.so.5.0.1</p></li><li class="listitem"><p>GCC 3.2.2: libstdc++.so.5.0.2</p></li><li class="listitem"><p>GCC 3.2.3: libstdc++.so.5.0.3 (See Note 2)</p></li><li class="listitem"><p>GCC 3.3.0: libstdc++.so.5.0.4</p></li><li class="listitem"><p>GCC 3.3.1: libstdc++.so.5.0.5</p></li><li class="listitem"><p>GCC 3.4.0: libstdc++.so.6.0.0 <span class="emphasis"><em>(Incompatible with previous)</em></span></p></li><li class="listitem"><p>GCC 3.4.1: libstdc++.so.6.0.1</p></li><li class="listitem"><p>GCC 3.4.2: libstdc++.so.6.0.2</p></li><li class="listitem"><p>GCC 3.4.3: libstdc++.so.6.0.3</p></li><li class="listitem"><p>GCC 4.0.0: libstdc++.so.6.0.4</p></li><li class="listitem"><p>GCC 4.0.1: libstdc++.so.6.0.5</p></li><li class="listitem"><p>GCC 4.0.2: libstdc++.so.6.0.6</p></li><li class="listitem"><p>GCC 4.0.3: libstdc++.so.6.0.7</p></li><li class="listitem"><p>GCC 4.1.0: libstdc++.so.6.0.7</p></li><li class="listitem"><p>GCC 4.1.1: libstdc++.so.6.0.8</p></li><li class="listitem"><p>GCC 4.2.0: libstdc++.so.6.0.9</p></li><li class="listitem"><p>GCC 4.2.1: libstdc++.so.6.0.9 (See Note 3)</p></li><li class="listitem"><p>GCC 4.2.2: libstdc++.so.6.0.9</p></li><li class="listitem"><p>GCC 4.3.0: libstdc++.so.6.0.10</p></li><li class="listitem"><p>GCC 4.4.0: libstdc++.so.6.0.11</p></li><li class="listitem"><p>GCC 4.4.1: libstdc++.so.6.0.12</p></li><li class="listitem"><p>GCC 4.4.2: libstdc++.so.6.0.13</p></li><li class="listitem"><p>GCC 4.5.0: libstdc++.so.6.0.14</p></li><li class="listitem"><p>GCC 4.6.0: libstdc++.so.6.0.15</p></li><li class="listitem"><p>GCC 4.6.1: libstdc++.so.6.0.16</p></li><li class="listitem"><p>GCC 4.7.0: libstdc++.so.6.0.17</p></li><li class="listitem"><p>GCC 4.8.0: libstdc++.so.6.0.18</p></li><li class="listitem"><p>GCC 4.8.3: libstdc++.so.6.0.19</p></li></ul></div><p>
+       Note 1: Error should be libstdc++.so.3.0.3.
+     </p><p>
+       Note 2: Not strictly required.
+@@ -129,7 +129,7 @@
+    GLIBCPP_3.2 for symbols that were introduced in the GCC 3.2.0
+    release.) If a particular release is not listed, it has the same
+    version labels as the preceding release.
+-   </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>GCC 3.0.0: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.1: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.2: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.3: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.4: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.1.0: GLIBCPP_3.1, CXXABI_1</p></li><li class="listitem"><p>GCC 3.1.1: GLIBCPP_3.1, CXXABI_1</p></li><li class="listitem"><p>GCC 3.2.0: GLIBCPP_3.2, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.2.1: GLIBCPP_3.2.1, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.2.2: GLIBCPP_3.2.2, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.2.3: GLIBCPP_3.2.2, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.3.0: GLIBCPP_3.2.2, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.3.1: GLIBCPP_3.2.3, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.3.2: GLIBCPP_3.2.3, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.3.3: GLIBCPP_3.2.3, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.4.0: GLIBCXX_3.4, CXXABI_1.3</p></li><li class="listitem"><p>GCC 3.4.1: GLIBCXX_3.4.1, CXXABI_1.3</p></li><li class="listitem"><p>GCC 3.4.2: GLIBCXX_3.4.2</p></li><li class="listitem"><p>GCC 3.4.3: GLIBCXX_3.4.3</p></li><li class="listitem"><p>GCC 4.0.0: GLIBCXX_3.4.4, CXXABI_1.3.1</p></li><li class="listitem"><p>GCC 4.0.1: GLIBCXX_3.4.5</p></li><li class="listitem"><p>GCC 4.0.2: GLIBCXX_3.4.6</p></li><li class="listitem"><p>GCC 4.0.3: GLIBCXX_3.4.7</p></li><li class="listitem"><p>GCC 4.1.1: GLIBCXX_3.4.8</p></li><li class="listitem"><p>GCC 4.2.0: GLIBCXX_3.4.9</p></li><li class="listitem"><p>GCC 4.3.0: GLIBCXX_3.4.10, CXXABI_1.3.2</p></li><li class="listitem"><p>GCC 4.4.0: GLIBCXX_3.4.11, CXXABI_1.3.3</p></li><li class="listitem"><p>GCC 4.4.1: GLIBCXX_3.4.12, CXXABI_1.3.3</p></li><li class="listitem"><p>GCC 4.4.2: GLIBCXX_3.4.13, CXXABI_1.3.3</p></li><li class="listitem"><p>GCC 4.5.0: GLIBCXX_3.4.14, CXXABI_1.3.4</p></li><li class="listitem"><p>GCC 4.6.0: GLIBCXX_3.4.15, CXXABI_1.3.5</p></li><li class="listitem"><p>GCC 4.6.1: GLIBCXX_3.4.16, CXXABI_1.3.5</p></li><li class="listitem"><p>GCC 4.7.0: GLIBCXX_3.4.17, CXXABI_1.3.6</p></li><li class="listitem"><p>GCC 4.8.0: GLIBCXX_3.4.18, CXXABI_1.3.7</p></li></ul></div></li><li class="listitem"><p>Incremental bumping of a compiler pre-defined macro,
++   </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>GCC 3.0.0: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.1: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.2: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.3: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.0.4: (Error, not versioned)</p></li><li class="listitem"><p>GCC 3.1.0: GLIBCPP_3.1, CXXABI_1</p></li><li class="listitem"><p>GCC 3.1.1: GLIBCPP_3.1, CXXABI_1</p></li><li class="listitem"><p>GCC 3.2.0: GLIBCPP_3.2, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.2.1: GLIBCPP_3.2.1, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.2.2: GLIBCPP_3.2.2, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.2.3: GLIBCPP_3.2.2, CXXABI_1.2</p></li><li class="listitem"><p>GCC 3.3.0: GLIBCPP_3.2.2, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.3.1: GLIBCPP_3.2.3, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.3.2: GLIBCPP_3.2.3, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.3.3: GLIBCPP_3.2.3, CXXABI_1.2.1</p></li><li class="listitem"><p>GCC 3.4.0: GLIBCXX_3.4, CXXABI_1.3</p></li><li class="listitem"><p>GCC 3.4.1: GLIBCXX_3.4.1, CXXABI_1.3</p></li><li class="listitem"><p>GCC 3.4.2: GLIBCXX_3.4.2</p></li><li class="listitem"><p>GCC 3.4.3: GLIBCXX_3.4.3</p></li><li class="listitem"><p>GCC 4.0.0: GLIBCXX_3.4.4, CXXABI_1.3.1</p></li><li class="listitem"><p>GCC 4.0.1: GLIBCXX_3.4.5</p></li><li class="listitem"><p>GCC 4.0.2: GLIBCXX_3.4.6</p></li><li class="listitem"><p>GCC 4.0.3: GLIBCXX_3.4.7</p></li><li class="listitem"><p>GCC 4.1.1: GLIBCXX_3.4.8</p></li><li class="listitem"><p>GCC 4.2.0: GLIBCXX_3.4.9</p></li><li class="listitem"><p>GCC 4.3.0: GLIBCXX_3.4.10, CXXABI_1.3.2</p></li><li class="listitem"><p>GCC 4.4.0: GLIBCXX_3.4.11, CXXABI_1.3.3</p></li><li class="listitem"><p>GCC 4.4.1: GLIBCXX_3.4.12, CXXABI_1.3.3</p></li><li class="listitem"><p>GCC 4.4.2: GLIBCXX_3.4.13, CXXABI_1.3.3</p></li><li class="listitem"><p>GCC 4.5.0: GLIBCXX_3.4.14, CXXABI_1.3.4</p></li><li class="listitem"><p>GCC 4.6.0: GLIBCXX_3.4.15, CXXABI_1.3.5</p></li><li class="listitem"><p>GCC 4.6.1: GLIBCXX_3.4.16, CXXABI_1.3.5</p></li><li class="listitem"><p>GCC 4.7.0: GLIBCXX_3.4.17, CXXABI_1.3.6</p></li><li class="listitem"><p>GCC 4.8.0: GLIBCXX_3.4.18, CXXABI_1.3.7</p></li><li class="listitem"><p>GCC 4.8.3: GLIBCXX_3.4.19, CXXABI_1.3.7</p></li></ul></div></li><li class="listitem"><p>Incremental bumping of a compiler pre-defined macro,
+     __GXX_ABI_VERSION. This macro is defined as the version of the
+     compiler v3 ABI, with g++ 3.0 being version 100. This macro will
+     be automatically defined whenever g++ is used (the curious can
+Index: libstdc++-v3/doc/html/manual/std_contents.html
+===================================================================
+--- libstdc++-v3/doc/html/manual/std_contents.html     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/html/manual/std_contents.html     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -21,7 +21,7 @@
+ </a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#std.localization.locales">Locales</a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#std.localization.locales.locale">locale</a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#locales.locale.req">Requirements</a></span></dt><dt><span class="section"><a href="localization.html#locales.locale.design">Design</a></span></dt><dt><span class="section"><a href="localization.html#locales.locale.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#locale.impl.c">Interacting with "C" locales</a></span></dt></dl></dd><dt><span class="section"><a href="localization.html#locales.locale.future">Future</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="facets.html">Facets</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#std.localization.facet.ctype">ctype</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#facet.ctype.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#idm269999753024">Specializations</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#facet.ctype.future">Future</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#std.localization.facet.codecvt">codecvt</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#facet.codecvt.req">Requirements</a></span></dt><dt><span class="section"><a href="facets.html#facet.codecvt.design">Design</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#codecvt.design.wchar_t_size"><span class="type">wchar_t</span> Size</a></span></dt><dt><span class="section"><a href="facets.html#codecvt.design.unicode">Support for Unicode</a></span></dt><dt><span class="section"><a href="facets.html#codecvt.design.issues">Other Issues</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#facet.codecvt.impl">Implementation</a></span></dt><dt><span class="section"><a href="facets.html#facet.codecvt.use">Use</a></span></dt><dt><span class="section"><a href="facets.html#facet.codecvt.future">Future</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#manual.localization.facet.messages">messages</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#facet.messages.req">Requirements</a></span></dt><dt><span class="section"><a href="facets.html#facet.messages.design">Design</a></span></dt><dt><span class="section"><a href="facets.html#facet.messages.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#messages.impl.models">Models</a></span></dt><dt><span class="section"><a href="facets.html#messages.impl.gnu">The GNU Model</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#facet.messages.use">Use</a></span></dt><dt><span class="section"><a href="facets.html#facet.messages.future">Future</a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="chapter"><a href="containers.html">9. 
+   Containers
+   
+-</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd><dt><span class="section"><a href="containers.html#containers.sequences.vector">vector</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.vector.management">Space Overhead Management</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="iterators.html">10. 
++</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="iterators.html">10. 
+   Iterators
+   
+ </a></span></dt><dd><dl><dt><span class="section"><a href="iterators.html#std.iterators.predefined">Predefined</a></span></dt><dd><dl><dt><span class="section"><a href="iterators.html#iterators.predefined.vs_pointers">Iterators vs. Pointers</a></span></dt><dt><span class="section"><a href="iterators.html#iterators.predefined.end">One Past the End</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="algorithms.html">11. 
+@@ -42,4 +42,4 @@
+ </a></span></dt><dd><dl><dt><span class="section"><a href="concurrency.html#std.concurrency.api">API Reference</a></span></dt></dl></dd></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="debug.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="index.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="support.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Debugging Support </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 4. 
+   Support
+   
+-</td></tr></table></div></body></html>
+\ No newline at end of file
++</td></tr></table></div></body></html>
+Index: libstdc++-v3/doc/html/manual/containers.html
+===================================================================
+--- libstdc++-v3/doc/html/manual/containers.html       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/html/manual/containers.html       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -7,9 +7,10 @@
+   </th><td width="20%" align="right"> <a accesskey="n" href="associative.html">Next</a></td></tr></table><hr /></div><div class="chapter"><div class="titlepage"><div><div><h2 class="title"><a id="std.containers"></a>Chapter 9. 
+   Containers
+   <a id="idm269999493408" class="indexterm"></a>
+-</h2></div></div></div><div class="toc"><p><strong>Table of Contents</strong></p><dl class="toc"><dt><span class="section"><a href="containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd><dt><span class="section"><a href="containers.html#containers.sequences.vector">vector</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.vector.management">Space Overhead Management</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="std.containers.sequences"></a>Sequences</h2></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="containers.sequences.list"></a>list</h3></div></div></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="sequences.list.size"></a>list::size() is O(n)</h4></div></div></div><p>
+-     Yes it is, and that's okay.  This is a decision that we preserved
+-     when we imported SGI's STL implementation.  The following is
++</h2></div></div></div><div class="toc"><p><strong>Table of Contents</strong></p><dl class="toc"><dt><span class="section"><a href="containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="std.containers.sequences"></a>Sequences</h2></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="containers.sequences.list"></a>list</h3></div></div></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="sequences.list.size"></a>list::size() is O(n)</h4></div></div></div><p>
++     Yes it is, and that was okay until the 2011 edition of the C++ standard.
++     In future GCC will change it to O(1) but O(N) was a decision that we
++     preserved when we imported SGI's STL implementation.  The following is
+      quoted from <a class="link" href="http://www.sgi.com/tech/stl/FAQ.html" target="_top">their FAQ</a>:
+    </p><div class="blockquote"><blockquote class="blockquote"><p>
+        The size() member function, for list and slist, takes time
+@@ -41,14 +42,4 @@
+        </p><pre class="programlisting">
+        if (L.empty())
+            ...
+-       </pre></blockquote></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="containers.sequences.vector"></a>vector</h3></div></div></div><p>
+-  </p><div class="section"><div class="titlepage"><div><div><h4 class="title"><a id="sequences.vector.management"></a>Space Overhead Management</h4></div></div></div><p>
+-     In <a class="link" href="http://gcc.gnu.org/ml/libstdc++/2002-04/msg00105.html" target="_top">this
+-     message to the list</a>, Daniel Kostecky announced work on an
+-     alternate form of <code class="code">std::vector</code> that would support
+-     hints on the number of elements to be over-allocated.  The design
+-     was also described, along with possible implementation choices.
+-   </p><p>
+-     The first two alpha releases were announced <a class="link" href="http://gcc.gnu.org/ml/libstdc++/2002-07/msg00048.html" target="_top">here</a>
+-     and <a class="link" href="http://gcc.gnu.org/ml/libstdc++/2002-07/msg00111.html" target="_top">here</a>.
+-   </p></div></div></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="facets.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="std_contents.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="associative.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Facets </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Associative</td></tr></table></div></body></html>
+\ No newline at end of file
++       </pre></blockquote></div></div></div></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="facets.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="std_contents.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="associative.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Facets </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Associative</td></tr></table></div></body></html>
+Index: libstdc++-v3/doc/html/manual/index.html
+===================================================================
+--- libstdc++-v3/doc/html/manual/index.html    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/doc/html/manual/index.html    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -24,7 +24,7 @@
+ </a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#std.localization.locales">Locales</a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#std.localization.locales.locale">locale</a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#locales.locale.req">Requirements</a></span></dt><dt><span class="section"><a href="localization.html#locales.locale.design">Design</a></span></dt><dt><span class="section"><a href="localization.html#locales.locale.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="localization.html#locale.impl.c">Interacting with "C" locales</a></span></dt></dl></dd><dt><span class="section"><a href="localization.html#locales.locale.future">Future</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="facets.html">Facets</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#std.localization.facet.ctype">ctype</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#facet.ctype.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#idm269999753024">Specializations</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#facet.ctype.future">Future</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#std.localization.facet.codecvt">codecvt</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#facet.codecvt.req">Requirements</a></span></dt><dt><span class="section"><a href="facets.html#facet.codecvt.design">Design</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#codecvt.design.wchar_t_size"><span class="type">wchar_t</span> Size</a></span></dt><dt><span class="section"><a href="facets.html#codecvt.design.unicode">Support for Unicode</a></span></dt><dt><span class="section"><a href="facets.html#codecvt.design.issues">Other Issues</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#facet.codecvt.impl">Implementation</a></span></dt><dt><span class="section"><a href="facets.html#facet.codecvt.use">Use</a></span></dt><dt><span class="section"><a href="facets.html#facet.codecvt.future">Future</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#manual.localization.facet.messages">messages</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#facet.messages.req">Requirements</a></span></dt><dt><span class="section"><a href="facets.html#facet.messages.design">Design</a></span></dt><dt><span class="section"><a href="facets.html#facet.messages.impl">Implementation</a></span></dt><dd><dl><dt><span class="section"><a href="facets.html#messages.impl.models">Models</a></span></dt><dt><span class="section"><a href="facets.html#messages.impl.gnu">The GNU Model</a></span></dt></dl></dd><dt><span class="section"><a href="facets.html#facet.messages.use">Use</a></span></dt><dt><span class="section"><a href="facets.html#facet.messages.future">Future</a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="chapter"><a href="containers.html">9. 
+   Containers
+   
+-</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd><dt><span class="section"><a href="containers.html#containers.sequences.vector">vector</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.vector.management">Space Overhead Management</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="iterators.html">10. 
++</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#std.containers.sequences">Sequences</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#containers.sequences.list">list</a></span></dt><dd><dl><dt><span class="section"><a href="containers.html#sequences.list.size">list::size() is O(n)</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="associative.html">Associative</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#containers.associative.insert_hints">Insertion Hints</a></span></dt><dt><span class="section"><a href="associative.html#containers.associative.bitset">bitset</a></span></dt><dd><dl><dt><span class="section"><a href="associative.html#associative.bitset.size_variable">Size Variable</a></span></dt><dt><span class="section"><a href="associative.html#associative.bitset.type_string">Type String</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="unordered_associative.html">Unordered Associative</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.hash">Hash Code</a></span></dt><dd><dl><dt><span class="section"><a href="unordered_associative.html#containers.unordered.cache">Hash Code Caching Policy</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="containers_and_c.html">Interacting with C</a></span></dt><dd><dl><dt><span class="section"><a href="containers_and_c.html#containers.c.vs_array">Containers vs. Arrays</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="iterators.html">10. 
+   Iterators
+   
+ </a></span></dt><dd><dl><dt><span class="section"><a href="iterators.html#std.iterators.predefined">Predefined</a></span></dt><dd><dl><dt><span class="section"><a href="iterators.html#iterators.predefined.vs_pointers">Iterators vs. Pointers</a></span></dt><dt><span class="section"><a href="iterators.html#iterators.predefined.end">One Past the End</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="algorithms.html">11. 
+@@ -160,4 +160,4 @@
+             </a></dt></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="../index.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="intro.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">The GNU C++ Library </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Part I. 
+   Introduction
+   
+-</td></tr></table></div></body></html>
+\ No newline at end of file
++</td></tr></table></div></body></html>
+Index: libstdc++-v3/include/std/future
+===================================================================
+--- libstdc++-v3/include/std/future    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/include/std/future    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -351,12 +351,14 @@
+       void
+       _M_set_result(function<_Ptr_type()> __res, bool __ignore_failure = false)
+       {
+-        bool __set = __ignore_failure;
++        bool __set = false;
+         // all calls to this function are serialized,
+         // side-effects of invoking __res only happen once
+         call_once(_M_once, &_State_base::_M_do_set, this, ref(__res),
+             ref(__set));
+-        if (!__set)
++      if (__set)
++        _M_cond.notify_all();
++      else if (!__ignore_failure)
+           __throw_future_error(int(future_errc::promise_already_satisfied));
+       }
+@@ -471,7 +473,6 @@
+           lock_guard<mutex> __lock(_M_mutex);
+           _M_result.swap(__res);
+         }
+-        _M_cond.notify_all();
+         __set = true;
+       }
+@@ -983,22 +984,25 @@
+       void
+       set_value(const _Res& __r)
+       {
++      auto __future = _M_future;
+         auto __setter = _State::__setter(this, __r);
+-        _M_future->_M_set_result(std::move(__setter));
++        __future->_M_set_result(std::move(__setter));
+       }
+       void
+       set_value(_Res&& __r)
+       {
++      auto __future = _M_future;
+         auto __setter = _State::__setter(this, std::move(__r));
+-        _M_future->_M_set_result(std::move(__setter));
++        __future->_M_set_result(std::move(__setter));
+       }
+       void
+       set_exception(exception_ptr __p)
+       {
++      auto __future = _M_future;
+         auto __setter = _State::__setter(__p, this);
+-        _M_future->_M_set_result(std::move(__setter));
++        __future->_M_set_result(std::move(__setter));
+       }
+     };
+@@ -1081,15 +1085,17 @@
+       void
+       set_value(_Res& __r)
+       {
++      auto __future = _M_future;
+         auto __setter = _State::__setter(this, __r);
+-        _M_future->_M_set_result(std::move(__setter));
++        __future->_M_set_result(std::move(__setter));
+       }
+       void
+       set_exception(exception_ptr __p)
+       {
++      auto __future = _M_future;
+         auto __setter = _State::__setter(__p, this);
+-        _M_future->_M_set_result(std::move(__setter));
++        __future->_M_set_result(std::move(__setter));
+       }
+     };
+@@ -1166,8 +1172,9 @@
+       void
+       set_exception(exception_ptr __p)
+       {
++      auto __future = _M_future;
+         auto __setter = _State::__setter(__p, this);
+-        _M_future->_M_set_result(std::move(__setter));
++        __future->_M_set_result(std::move(__setter));
+       }
+     };
+@@ -1193,8 +1200,9 @@
+   inline void
+   promise<void>::set_value()
+   {
++    auto __future = _M_future;
+     auto __setter = _State::__setter(this);
+-    _M_future->_M_set_result(std::move(__setter));
++    __future->_M_set_result(std::move(__setter));
+   }
+Index: libstdc++-v3/include/ext/rope
+===================================================================
+--- libstdc++-v3/include/ext/rope      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/include/ext/rope      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1544,7 +1544,7 @@
+       typedef typename _Base::allocator_type allocator_type;
+       using _Base::_M_tree_ptr;
+       using _Base::get_allocator;
+-      using _Base::_M_get_allocator;      
++      using _Base::_M_get_allocator;
+       typedef __GC_CONST _CharT* _Cstrptr;
+       
+       static _CharT _S_empty_c_str[1];
+@@ -1876,8 +1876,9 @@
+          const allocator_type& __a = allocator_type())
+       : _Base(__a)
+       {
+-      this->_M_tree_ptr = (0 == __len) ?
+-        0 : _S_new_RopeFunction(__fn, __len, __delete_fn, __a);
++      this->_M_tree_ptr = (0 == __len)
++        ? 0
++        : _S_new_RopeFunction(__fn, __len, __delete_fn, _M_get_allocator());
+       }
+       rope(const rope& __x, const allocator_type& __a = allocator_type())
+Index: libstdc++-v3/include/bits/stl_tree.h
+===================================================================
+--- libstdc++-v3/include/bits/stl_tree.h       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/include/bits/stl_tree.h       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -510,11 +510,11 @@
+       _Link_type
+       _M_end()
+-      { return static_cast<_Link_type>(&this->_M_impl._M_header); }
++      { return reinterpret_cast<_Link_type>(&this->_M_impl._M_header); }
+       _Const_Link_type
+       _M_end() const
+-      { return static_cast<_Const_Link_type>(&this->_M_impl._M_header); }
++      { return reinterpret_cast<_Const_Link_type>(&this->_M_impl._M_header); }
+       static const_reference
+       _S_value(_Const_Link_type __x)
+Index: libstdc++-v3/include/tr2/bool_set
+===================================================================
+--- libstdc++-v3/include/tr2/bool_set  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/include/tr2/bool_set  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -44,7 +44,7 @@
+    *  bool_set
+    *
+    *  See N2136, Bool_set: multi-valued logic
+-   *  by Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion.
++   *  by Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion.
+    *
+    *  The implicit conversion to bool is slippery!  I may use the new
+    *  explicit conversion.  This has been specialized in the language
+Index: libstdc++-v3/ChangeLog
+===================================================================
+--- libstdc++-v3/ChangeLog     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/ChangeLog     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,96 @@
++2014-10-15  Jason Merrill  <jason@redhat.com>
++
++      * libsupc++/dyncast.cc (__dynamic_cast): Handle mid-destruction
++      dynamic_cast more gracefully.
++
++2014-10-14  Kai Tietz  <ktietz@redhat.com>
++
++      PR libstdc++/57440
++      * config/os/mingw32/os_defines.h (_GTHREAD_USE_MUTEX_INIT_FUNC):
++      Define to avoid leak.
++      * config/os/mingw32-w64/os_defines.h: Likewise.
++
++2014-10-03  Jonathan Wakely  <jwakely@redhat.com>
++
++      PR libstdc++/63449
++      * doc/xml/manual/containers.xml: Remove outdated section. Update
++      std::list notes.
++      * doc/html/*: Regenerate.
++
++2014-10-01  Jonathan Wakely  <jwakely@redhat.com>
++
++      * doc/xml/manual/status_cxx2011.xml: Corrections.
++      * doc/html/manual/status.html: Regenerate.
++
++2014-08-28  Samuel Bronson  <naesten@gmail.com>
++
++      Backport r212453 from trunk
++      2014-07-11  Samuel Bronson  <naesten@gmail.com>
++                  Matthias Klose  <doko@ubuntu.com>
++
++      PR libstdc++/58962
++      * python/libstdcxx/v6/printers.py: Port to Python 2+3
++      (imap): New compat function.
++      (izip): Likewise.
++      (Iterator): New mixin to allow writing iterators in Python 3 style
++      regardless of which version we're running on.
++      [Python3] (long) New compat alias for "int".
++      * testsuite/lib/gdb-test.exp: Port to Python 2+3 (print syntax)
++
++      Backport r210625 from trunk
++      2014-05-19  Jonathan Wakely  <jwakely@redhat.com>
++
++      * python/libstdcxx/v6/printers.py: Use Python3 raise syntax.
++
++2014-08-26  John David Anglin  <danglin@gcc.gnu.org>
++
++      * config/abi/post/hppa-linux-gnu/baseline_symbols.txt: Update.
++
++2014-08-26  Jonathan Wakely  <jwakely@redhat.com>
++
++      * doc/xml/manual/status_cxx2011.xml: Correct status table.
++      * doc/html/manual/*: Regenerate.
++
++2014-08-04  Jonathan Wakely  <jwakely@redhat.com>
++
++      Backported from mainline
++      2014-07-29  Jonathan Wakely  <jwakely@redhat.com>
++
++      PR libstdc++/61946
++      * include/ext/rope (rope::rope(char_producer<_CharT>*, size_t, bool,
++      const allocator_type&)): Pass non-const allocator to
++      _S_new_RopeFunction.
++      * testsuite/ext/rope/61946.cc: New.
++
++2014-08-04  Zifei Tong  <zifeitong@gmail.com>
++
++      * libsupc++/atexit_thread.cc (HAVE___CXA_THREAD_ATEXIT_IMPL): Add
++      _GLIBCXX_ prefix to macro.
++
++2014-06-03  Jonathan Wakely  <jwakely@redhat.com>
++
++      Backport from mainline
++      2014-04-15  Jonathan Wakely  <jwakely@redhat.com>
++
++      PR libstdc++/60734
++      * include/bits/stl_tree.h (_Rb_tree::_M_end): Fix invalid cast.
++
++      Backport from mainline
++      2014-05-16  Jonathan Wakely  <jwakely@redhat.com>
++
++      PR libstdc++/60966
++      * include/std/future (__future_base::_State_baseV2::_M_set_result):
++      Signal condition variable after call_once returns.
++      (__future_base::_State_baseV2::_M_do_set): Do not signal here.
++      (promise::set_value, promise::set_exception): Increment the reference
++      count on the shared state until the function returns.
++      * testsuite/30_threads/promise/60966.cc: New.
++
++2014-05-29  Jonathan Wakely  <jwakely@redhat.com>
++
++      * include/tr2/bool_set: Use UTF-8 for accented characters.
++      * scripts/run_doxygen: Handle Doxygen 1.8.x change.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libstdc++-v3/libsupc++/atexit_thread.cc
+===================================================================
+--- libstdc++-v3/libsupc++/atexit_thread.cc    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/libsupc++/atexit_thread.cc    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -26,7 +26,7 @@
+ #include <new>
+ #include "bits/gthr.h"
+-#if HAVE___CXA_THREAD_ATEXIT_IMPL
++#if _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL
+ extern "C" int __cxa_thread_atexit_impl (void (*func) (void *),
+                                        void *arg, void *d);
+@@ -38,7 +38,7 @@
+   return __cxa_thread_atexit_impl (dtor, obj, dso_handle);
+ }
+-#else /* HAVE___CXA_THREAD_ATEXIT_IMPL */
++#else /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */
+ namespace {
+   // One element in a singly-linked stack of cleanups.
+@@ -142,4 +142,4 @@
+   return 0;
+ }
+-#endif /* HAVE___CXA_THREAD_ATEXIT_IMPL */
++#endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */
+Index: libstdc++-v3/libsupc++/dyncast.cc
+===================================================================
+--- libstdc++-v3/libsupc++/dyncast.cc  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/libsupc++/dyncast.cc  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -55,6 +55,18 @@
+       adjust_pointer <void> (src_ptr, prefix->whole_object);
+   const __class_type_info *whole_type = prefix->whole_type;
+   __class_type_info::__dyncast_result result;
++
++  // If the whole object vptr doesn't refer to the whole object type, we're
++  // in the middle of constructing a primary base, and src is a separate
++  // base.  This has undefined behavior and we can't find anything outside
++  // of the base we're actually constructing, so fail now rather than
++  // segfault later trying to use a vbase offset that doesn't exist.
++  const void *whole_vtable = *static_cast <const void *const *> (whole_ptr);
++  const vtable_prefix *whole_prefix =
++    adjust_pointer <vtable_prefix> (whole_vtable,
++                                  -offsetof (vtable_prefix, origin));
++  if (whole_prefix->whole_type != whole_type)
++    return NULL;
+   
+   whole_type->__do_dyncast (src2dst, __class_type_info::__contained_public,
+                             dst_type, whole_ptr, src_type, src_ptr, result);
+Index: libstdc++-v3/testsuite/30_threads/promise/60966.cc
+===================================================================
+--- libstdc++-v3/testsuite/30_threads/promise/60966.cc (.../tags/gcc_4_8_3_release)    (revision 0)
++++ libstdc++-v3/testsuite/30_threads/promise/60966.cc (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,67 @@
++// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } }
++// { dg-options " -std=gnu++11 -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-gnu* powerpc-ibm-aix* } }
++// { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
++// { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-darwin* } }
++// { dg-require-cstdint "" }
++// { dg-require-gthreads "" }
++// { dg-require-atomic-builtins "" }
++
++// 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/>.
++
++// libstdc++/60966
++// This test hangs if std::promise::~promise() destroys the
++// shared state before std::promise::set_value() finishes using it.
++
++#include <future>
++#include <thread>
++#include <vector>
++
++const int THREADS = 10;
++
++void run_task(std::promise<void>* pr)
++{
++  std::this_thread::sleep_for(std::chrono::milliseconds(100));
++  pr->set_value();
++}
++
++int main()
++{
++  std::vector<std::promise<void>*> tasks(THREADS);
++  std::vector<std::thread> threads(THREADS);
++  std::vector<std::future<void>> futures(THREADS);
++
++  for (int i = 0; i < THREADS; ++i)
++  {
++    std::promise<void>* task = new std::promise<void>;
++    tasks[i] = task;
++    futures[i] = task->get_future();
++    threads[i] = std::thread(run_task, task);
++  }
++
++  for (int i = 0; i < THREADS; ++i)
++  {
++    // the temporary future releases the state as soon as wait() returns
++    std::future<void>(std::move(futures[i])).wait();
++    // state is ready, should now be safe to delete promise, so it
++    // releases the shared state too
++    delete tasks[i];
++  }
++
++  for (auto& t : threads)
++    t.join();
++}
+Index: libstdc++-v3/testsuite/ext/rope/61946.cc
+===================================================================
+--- libstdc++-v3/testsuite/ext/rope/61946.cc   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ libstdc++-v3/testsuite/ext/rope/61946.cc   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,31 @@
++// 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/>.
++
++// { dg-do compile }
++
++#include <ext/rope>
++
++struct empty_char_prod : __gnu_cxx::char_producer<char>
++{
++  virtual void operator()(size_t, size_t, char*) {}
++};
++
++int main ()
++{
++  empty_char_prod* ecp = new empty_char_prod;
++  __gnu_cxx::crope excrope( ecp, 10L, true );
++}
+Index: libstdc++-v3/testsuite/lib/gdb-test.exp
+===================================================================
+--- libstdc++-v3/testsuite/lib/gdb-test.exp    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/testsuite/lib/gdb-test.exp    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -91,7 +91,7 @@
+       }
+     }
+-    set do_whatis_tests [gdb_batch_check "python print gdb.type_printers" \
++    set do_whatis_tests [gdb_batch_check "python print(gdb.type_printers)" \
+                          "\\\[\\\]"]
+     if {!$do_whatis_tests} {
+       send_log "skipping 'whatis' tests - gdb too old"
+@@ -252,6 +252,6 @@
+ # but not earlier versions.
+ # Return 1 if the version is ok, 0 otherwise.
+ proc gdb_version_check {} {
+-    return [gdb_batch_check "python print gdb.lookup_global_symbol" \
++    return [gdb_batch_check "python print(gdb.lookup_global_symbol)" \
+             "<built-in function lookup_global_symbol>"]
+ }
+Index: libstdc++-v3/config/os/mingw32-w64/os_defines.h
+===================================================================
+--- libstdc++-v3/config/os/mingw32-w64/os_defines.h    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/config/os/mingw32-w64/os_defines.h    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -78,4 +78,7 @@
+ #define _GLIBCXX_LLP64 1
+ #endif
++// See libstdc++/59807
++#define _GTHREAD_USE_MUTEX_INIT_FUNC 1
++
+ #endif
+Index: libstdc++-v3/config/os/mingw32/os_defines.h
+===================================================================
+--- libstdc++-v3/config/os/mingw32/os_defines.h        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/config/os/mingw32/os_defines.h        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -75,4 +75,7 @@
+ #define _GLIBCXX_LLP64 1
+ #endif
++// See libstdc++/59807
++#define _GTHREAD_USE_MUTEX_INIT_FUNC 1
++
+ #endif
+Index: libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt
+===================================================================
+--- libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -400,6 +400,7 @@
+ FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@@GLIBCXX_3.4
+ FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+ FUNC:_ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
++FUNC:_ZNKSt17bad_function_call4whatEv@@GLIBCXX_3.4.18
+ FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+ FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+ FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+@@ -587,6 +588,8 @@
+ FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCXX_3.4
+ FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCXX_3.4
+ FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCXX_3.4
++FUNC:_ZNKSt8__detail20_Prime_rehash_policy11_M_next_bktEj@@GLIBCXX_3.4.18
++FUNC:_ZNKSt8__detail20_Prime_rehash_policy14_M_need_rehashEjjj@@GLIBCXX_3.4.18
+ FUNC:_ZNKSt8bad_cast4whatEv@@GLIBCXX_3.4.9
+ FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCXX_3.4
+ FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCXX_3.4
+@@ -1204,6 +1207,7 @@
+ FUNC:_ZNSt11regex_errorD0Ev@@GLIBCXX_3.4.15
+ FUNC:_ZNSt11regex_errorD1Ev@@GLIBCXX_3.4.15
+ FUNC:_ZNSt11regex_errorD2Ev@@GLIBCXX_3.4.15
++FUNC:_ZNSt11this_thread11__sleep_forENSt6chrono8durationIxSt5ratioILx1ELx1EEEENS1_IxS2_ILx1ELx1000000000EEEE@@GLIBCXX_3.4.18
+ FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCXX_3.4
+ FUNC:_ZNSt12__basic_fileIcE4fileEv@@GLIBCXX_3.4.1
+ FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCXX_3.4
+@@ -1471,6 +1475,11 @@
+ FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCXX_3.4
+ FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCXX_3.4
+ FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCXX_3.4
++FUNC:_ZNSt13random_device14_M_init_pretr1ERKSs@@GLIBCXX_3.4.18
++FUNC:_ZNSt13random_device16_M_getval_pretr1Ev@@GLIBCXX_3.4.18
++FUNC:_ZNSt13random_device7_M_finiEv@@GLIBCXX_3.4.18
++FUNC:_ZNSt13random_device7_M_initERKSs@@GLIBCXX_3.4.18
++FUNC:_ZNSt13random_device9_M_getvalEv@@GLIBCXX_3.4.18
+ FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCXX_3.4
+ FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCXX_3.4
+ FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCXX_3.4
+@@ -1900,6 +1909,8 @@
+ FUNC:_ZNSt6__norm15_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4.9
+ FUNC:_ZNSt6__norm15_List_node_base9_M_unhookEv@@GLIBCXX_3.4.14
+ FUNC:_ZNSt6chrono12system_clock3nowEv@@GLIBCXX_3.4.11
++FUNC:_ZNSt6chrono3_V212steady_clock3nowEv@@GLIBCXX_3.4.19
++FUNC:_ZNSt6chrono3_V212system_clock3nowEv@@GLIBCXX_3.4.19
+ FUNC:_ZNSt6gslice8_IndexerC1EjRKSt8valarrayIjES4_@@GLIBCXX_3.4
+ FUNC:_ZNSt6gslice8_IndexerC2EjRKSt8valarrayIjES4_@@GLIBCXX_3.4
+ FUNC:_ZNSt6locale11_M_coalesceERKS_S1_i@@GLIBCXX_3.4
+@@ -2436,6 +2447,7 @@
+ FUNC:__cxa_guard_release@@CXXABI_1.3
+ FUNC:__cxa_pure_virtual@@CXXABI_1.3
+ FUNC:__cxa_rethrow@@CXXABI_1.3
++FUNC:__cxa_thread_atexit@@CXXABI_1.3.7
+ FUNC:__cxa_throw@@CXXABI_1.3
+ FUNC:__cxa_tm_cleanup@@CXXABI_TM_1
+ FUNC:__cxa_vec_cctor@@CXXABI_1.3
+@@ -2482,6 +2494,7 @@
+ OBJECT:0:CXXABI_1.3.4
+ OBJECT:0:CXXABI_1.3.5
+ OBJECT:0:CXXABI_1.3.6
++OBJECT:0:CXXABI_1.3.7
+ OBJECT:0:CXXABI_TM_1
+ OBJECT:0:GLIBCXX_3.4
+ OBJECT:0:GLIBCXX_3.4.1
+@@ -2493,6 +2506,8 @@
+ OBJECT:0:GLIBCXX_3.4.15
+ OBJECT:0:GLIBCXX_3.4.16
+ OBJECT:0:GLIBCXX_3.4.17
++OBJECT:0:GLIBCXX_3.4.18
++OBJECT:0:GLIBCXX_3.4.19
+ OBJECT:0:GLIBCXX_3.4.2
+ OBJECT:0:GLIBCXX_3.4.3
+ OBJECT:0:GLIBCXX_3.4.4
+@@ -2992,6 +3007,8 @@
+ OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCXX_3.4
+ OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCXX_3.4
+ OBJECT:1:_ZNSt6chrono12system_clock12is_monotonicE@@GLIBCXX_3.4.11
++OBJECT:1:_ZNSt6chrono3_V212steady_clock9is_steadyE@@GLIBCXX_3.4.19
++OBJECT:1:_ZNSt6chrono3_V212system_clock9is_steadyE@@GLIBCXX_3.4.19
+ OBJECT:1:_ZSt10adopt_lock@@GLIBCXX_3.4.11
+ OBJECT:1:_ZSt10defer_lock@@GLIBCXX_3.4.11
+ OBJECT:1:_ZSt11try_to_lock@@GLIBCXX_3.4.11
+Index: configure.ac
+===================================================================
+--- configure.ac       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ configure.ac       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1154,6 +1154,9 @@
+   *-mingw*)
+     host_makefile_frag="config/mh-mingw"
+     ;;
++  alpha*-*-linux*)
++    host_makefile_frag="config/mh-alpha-linux"
++    ;;
+   hppa*-hp-hpux10*)
+     host_makefile_frag="config/mh-pa-hpux10"
+     ;;
+Index: ChangeLog
+===================================================================
+--- ChangeLog  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ ChangeLog  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,9 @@
++2014-07-26  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/47230
++      * configure.ac (alpha*-*-linux*): Use mh-alpha-linux.
++      * configure: Regenerate.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: contrib/ChangeLog
+===================================================================
+--- contrib/ChangeLog  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ contrib/ChangeLog  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,7 @@
++2014-07-07  Richard Biener  <rguenther@suse.de>
++
++        * gennews: Use gcc-3.0/index.html.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: contrib/gennews
+===================================================================
+--- contrib/gennews    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ contrib/gennews    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -37,7 +37,7 @@
+     gcc-3.3/index.html gcc-3.3/changes.html
+     gcc-3.2/index.html gcc-3.2/changes.html
+     gcc-3.1/index.html gcc-3.1/changes.html
+-    gcc-3.0/gcc-3.0.html gcc-3.0/features.html gcc-3.0/caveats.html
++    gcc-3.0/index.html gcc-3.0/features.html gcc-3.0/caveats.html
+     gcc-2.95/index.html gcc-2.95/features.html gcc-2.95/caveats.html
+     egcs-1.1/index.html egcs-1.1/features.html egcs-1.1/caveats.html
+     egcs-1.0/index.html egcs-1.0/features.html egcs-1.0/caveats.html"
+Index: config/mh-alpha-linux
+===================================================================
+--- config/mh-alpha-linux      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ config/mh-alpha-linux      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,3 @@
++# Prevent GPREL16 relocation truncation
++LDFLAGS += -Wl,--no-relax
++BOOT_LDFLAGS += -Wl,--no-relax
+Index: config/ChangeLog
+===================================================================
+--- config/ChangeLog   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ config/ChangeLog   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,8 @@
++2014-07-26  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/47230
++      * mh-alpha-linux: New file.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libjava/classpath
+===================================================================
+--- libjava/classpath  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libjava/classpath  (.../branches/gcc-4_8-branch)   (revision 217117)
+
+Property changes on: libjava/classpath
+___________________________________________________________________
+Modified: svn:mergeinfo
+   Merged /trunk/libjava/classpath:r211733,215049
+Index: configure
+===================================================================
+--- configure  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ configure  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3834,6 +3834,9 @@
+   *-mingw*)
+     host_makefile_frag="config/mh-mingw"
+     ;;
++  alpha*-*-linux*)
++    host_makefile_frag="config/mh-alpha-linux"
++    ;;
+   hppa*-hp-hpux10*)
+     host_makefile_frag="config/mh-pa-hpux10"
+     ;;
+Index: libgcc/ChangeLog
+===================================================================
+--- libgcc/ChangeLog   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgcc/ChangeLog   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,14 @@
++2014-10-26  John David Anglin  <danglin@gcc.gnu.org>
++
++      * config/pa/linux-unwind.h (pa32_read_access_ok): New function.
++      (pa32_fallback_frame_state): Use pa32_read_access_ok to check if
++      memory read accesses are ok.
++
++2014-09-18  Joseph Myers  <joseph@codesourcery.com>
++
++      * config/i386/sfp-machine.h (FP_TRAPPING_EXCEPTIONS): Treat clear
++      bits not set bits as indicating trapping exceptions.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libgcc/config/i386/sfp-machine.h
+===================================================================
+--- libgcc/config/i386/sfp-machine.h   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgcc/config/i386/sfp-machine.h   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -59,7 +59,7 @@
+       __sfp_handle_exceptions (_fex);         \
+   } while (0);
+-#define FP_TRAPPING_EXCEPTIONS ((_fcw >> FP_EX_SHIFT) & FP_EX_ALL)
++#define FP_TRAPPING_EXCEPTIONS ((~_fcw >> FP_EX_SHIFT) & FP_EX_ALL)
+ #define FP_ROUNDMODE          (_fcw & FP_RND_MASK)
+ #endif
+Index: libgcc/config/pa/linux-unwind.h
+===================================================================
+--- libgcc/config/pa/linux-unwind.h    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgcc/config/pa/linux-unwind.h    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -32,6 +32,17 @@
+ #include <signal.h>
+ #include <sys/ucontext.h>
++/* Return TRUE if read access to *P is allowed.  */
++
++static inline long
++pa32_read_access_ok (void *p)
++{
++  long ret;
++
++  __asm__ ("proberi (%1),3,%0" : "=r" (ret) : "r" (p) :);
++  return ret;
++}
++
+ /* Unfortunately, because of various bugs and changes to the kernel,
+    we have several cases to deal with.
+@@ -48,8 +59,13 @@
+    tell us how to locate the sigcontext structure.
+    Note that with a 2.4 64-bit kernel, the signal context is not properly
+-   passed back to userspace so the unwind will not work correctly.  */
++   passed back to userspace so the unwind will not work correctly.
++   There is also a bug in various glibc versions.  The (CONTEXT)->ra
++   for the outermost frame is not marked as undefined, so we need to
++   check whether read access is allowed for all the accesses used in
++   searching for the signal trampoline.  */
++
+ #define MD_FALLBACK_FRAME_STATE_FOR pa32_fallback_frame_state
+ static _Unwind_Reason_Code
+@@ -73,14 +89,17 @@
+      e4008200 be,l 0x100(%sr2, %r0), %sr0, %r31
+      08000240 nop  */
+-  if (pc[0] == 0x34190000 || pc[0] == 0x34190002)
++  if (pa32_read_access_ok (pc)
++      && (pc[0] == 0x34190000 || pc[0] == 0x34190002))
+     off = 4*4;
+-  else if (pc[4] == 0x34190000 || pc[4] == 0x34190002)
++  else if (pa32_read_access_ok (&pc[4])
++         && (pc[4] == 0x34190000 || pc[4] == 0x34190002))
+     {
+       pc += 4;
+       off = 10 * 4;
+     }
+-  else if (pc[5] == 0x34190000 || pc[5] == 0x34190002)
++  else if (pa32_read_access_ok (&pc[5])
++         && (pc[5] == 0x34190000 || pc[5] == 0x34190002))
+     {
+       pc += 5;
+       off = 10 * 4;
+@@ -96,13 +115,16 @@
+        word boundary and we can then determine the frame offset.  */
+       sp = (unsigned long)context->ra;
+       pc = (unsigned int *)sp;
+-      if ((pc[0] == 0x34190000 || pc[0] == 0x34190002) && (sp & 4))
++      if ((sp & 4)
++        && pa32_read_access_ok (pc)
++        && (pc[0] == 0x34190000 || pc[0] == 0x34190002))
+       off = 5 * 4;
+       else
+       return _URC_END_OF_STACK;
+     }
+-  if (pc[1] != 0x3414015a
++  if (!pa32_read_access_ok (&pc[3])
++      || pc[1] != 0x3414015a
+       || pc[2] != 0xe4008200
+       || pc[3] != 0x08000240)
+     return _URC_END_OF_STACK;
+Index: gcc/doc/sourcebuild.texi
+===================================================================
+--- gcc/doc/sourcebuild.texi   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/doc/sourcebuild.texi   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1299,6 +1299,9 @@
+ @item double64plus
+ Target has @code{double} that is 64 bits or longer.
++@item longdouble128
++Target has 128-bit @code{long double}.
++
+ @item int32plus
+ Target has @code{int} that is at 32 bits or longer.
+Index: gcc/doc/extend.texi
+===================================================================
+--- gcc/doc/extend.texi        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/doc/extend.texi        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -375,6 +375,8 @@
+ This is more friendly to code living in shared libraries, as it reduces
+ the number of dynamic relocations that are needed, and by consequence,
+ allows the data to be read-only.
++This alternative with label differences is not supported for the AVR target,
++please use the first approach for AVR programs.
+ The @code{&&foo} expressions for the same label might have different
+ values if the containing function is inlined or cloned.  If a program
+@@ -10490,7 +10492,7 @@
+ name.
+ @smallexample
+-v32qi __builtin_ia32_mpsadbw256 (v32qi,v32qi,v32qi,int)
++v32qi __builtin_ia32_mpsadbw256 (v32qi,v32qi,int)
+ v32qi __builtin_ia32_pabsb256 (v32qi)
+ v16hi __builtin_ia32_pabsw256 (v16hi)
+ v8si __builtin_ia32_pabsd256 (v8si)
+@@ -10725,8 +10727,8 @@
+ @smallexample
+ v2df __builtin_ia32_vfrczpd (v2df)
+ v4sf __builtin_ia32_vfrczps (v4sf)
+-v2df __builtin_ia32_vfrczsd (v2df, v2df)
+-v4sf __builtin_ia32_vfrczss (v4sf, v4sf)
++v2df __builtin_ia32_vfrczsd (v2df)
++v4sf __builtin_ia32_vfrczss (v4sf)
+ v4df __builtin_ia32_vfrczpd256 (v4df)
+ v8sf __builtin_ia32_vfrczps256 (v8sf)
+ v2di __builtin_ia32_vpcmov (v2di, v2di, v2di)
+@@ -11855,8 +11857,6 @@
+ uint64_t __builtin_ppc_get_timebase ();
+ unsigned long __builtin_ppc_mftb ();
+ double __builtin_unpack_longdouble (long double, int);
+-double __builtin_longdouble_dw0 (long double);
+-double __builtin_longdouble_dw1 (long double);
+ long double __builtin_pack_longdouble (double, double);
+ @end smallexample
+Index: gcc/doc/tm.texi
+===================================================================
+--- gcc/doc/tm.texi    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/doc/tm.texi    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3930,6 +3930,13 @@
+ @c above is overfull.  not sure what to do.  --mew 5feb93  did
+ @c something, not sure if it looks good.  --mew 10feb93
++@defmac INCOMING_REG_PARM_STACK_SPACE (@var{fndecl})
++Like @code{REG_PARM_STACK_SPACE}, but for incoming register arguments.
++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.
++@end defmac
++
+ @defmac OUTGOING_REG_PARM_STACK_SPACE (@var{fntype})
+ Define this to a nonzero value if it is the responsibility of the
+ caller to allocate the area reserved for arguments passed in registers
+Index: gcc/doc/tm.texi.in
+===================================================================
+--- gcc/doc/tm.texi.in (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/doc/tm.texi.in (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3898,6 +3898,13 @@
+ @c above is overfull.  not sure what to do.  --mew 5feb93  did
+ @c something, not sure if it looks good.  --mew 10feb93
++@defmac INCOMING_REG_PARM_STACK_SPACE (@var{fndecl})
++Like @code{REG_PARM_STACK_SPACE}, but for incoming register arguments.
++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.
++@end defmac
++
+ @defmac OUTGOING_REG_PARM_STACK_SPACE (@var{fntype})
+ Define this to a nonzero value if it is the responsibility of the
+ caller to allocate the area reserved for arguments passed in registers
+Index: gcc/doc/invoke.texi
+===================================================================
+--- gcc/doc/invoke.texi        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/doc/invoke.texi        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -475,6 +475,7 @@
+ -mstrict-align @gol
+ -momit-leaf-frame-pointer  -mno-omit-leaf-frame-pointer @gol
+ -mtls-dialect=desc  -mtls-dialect=traditional @gol
++-mfix-cortex-a53-835769  -mno-fix-cortex-a53-835769 @gol
+ -march=@var{name}  -mcpu=@var{name}  -mtune=@var{name}}
+ @emph{Adapteva Epiphany Options}
+@@ -1009,6 +1010,7 @@
+ -ffixed-@var{reg}  -fexceptions @gol
+ -fnon-call-exceptions  -fdelete-dead-exceptions  -funwind-tables @gol
+ -fasynchronous-unwind-tables @gol
++-fno-gnu-unique @gol
+ -finhibit-size-directive  -finstrument-functions @gol
+ -finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} @gol
+ -finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{} @gol
+@@ -10933,6 +10935,14 @@
+ Use traditional TLS as the thread-local storage mechanism for dynamic accesses
+ of TLS variables.
++@item -mfix-cortex-a53-835769
++@itemx -mno-fix-cortex-a53-835769
++@opindex -mfix-cortex-a53-835769
++@opindex -mno-fix-cortex-a53-835769
++Enable or disable the workaround for the ARM Cortex-A53 erratum number 835769.
++This will involve inserting a NOP instruction between memory instructions and
++64-bit integer multiply-accumulate instructions.
++
+ @item -march=@var{name}
+ @opindex march
+ Specify the name of the target architecture, optionally suffixed by one or
+@@ -11271,8 +11281,8 @@
+ @option{-march=native} causes the compiler to auto-detect the architecture
+ of the build computer.  At present, this feature is only supported on
+-Linux, and not all architectures are recognized.  If the auto-detect is
+-unsuccessful the option has no effect.
++GNU/Linux, and not all architectures are recognized.  If the auto-detect
++is unsuccessful the option has no effect.
+ @item -mtune=@var{name}
+ @opindex mtune
+@@ -11317,7 +11327,7 @@
+ @option{-mtune=native} causes the compiler to auto-detect the CPU
+ of the build computer.  At present, this feature is only supported on
+-Linux, and not all architectures are recognized.  If the auto-detect is
++GNU/Linux, and not all architectures are recognized.  If the auto-detect is
+ unsuccessful the option has no effect.
+ @item -mcpu=@var{name}
+@@ -11338,8 +11348,8 @@
+ @option{-mcpu=native} causes the compiler to auto-detect the CPU
+ of the build computer.  At present, this feature is only supported on
+-Linux, and not all architectures are recognized.  If the auto-detect is
+-unsuccessful the option has no effect.
++GNU/Linux, and not all architectures are recognized.  If the auto-detect
++is unsuccessful the option has no effect.
+ @item -mfpu=@var{name}
+ @opindex mfpu
+@@ -12479,7 +12489,7 @@
+ @item -mkernel
+ @opindex mkernel
+ Enable kernel development mode.  The @option{-mkernel} option sets
+-@option{-static}, @option{-fno-common}, @option{-fno-cxa-atexit},
++@option{-static}, @option{-fno-common}, @option{-fno-use-cxa-atexit},
+ @option{-fno-exceptions}, @option{-fno-non-call-exceptions},
+ @option{-fapple-kext}, @option{-fno-weak} and @option{-fno-rtti} where
+ applicable.  This mode also sets @option{-mno-altivec},
+@@ -18707,6 +18717,72 @@
+ @opindex m4
+ Generate code for the SH4.
++@item -m4-100
++@opindex m4-100
++Generate code for SH4-100.
++
++@item -m4-100-nofpu
++@opindex m4-100-nofpu
++Generate code for SH4-100 in such a way that the
++floating-point unit is not used.
++
++@item -m4-100-single
++@opindex m4-100-single
++Generate code for SH4-100 assuming the floating-point unit is in
++single-precision mode by default.
++
++@item -m4-100-single-only
++@opindex m4-100-single-only
++Generate code for SH4-100 in such a way that no double-precision
++floating-point operations are used.
++
++@item -m4-200
++@opindex m4-200
++Generate code for SH4-200.
++
++@item -m4-200-nofpu
++@opindex m4-200-nofpu
++Generate code for SH4-200 without in such a way that the
++floating-point unit is not used.
++
++@item -m4-200-single
++@opindex m4-200-single
++Generate code for SH4-200 assuming the floating-point unit is in
++single-precision mode by default.
++
++@item -m4-200-single-only
++@opindex m4-200-single-only
++Generate code for SH4-200 in such a way that no double-precision
++floating-point operations are used.
++
++@item -m4-300
++@opindex m4-300
++Generate code for SH4-300.
++
++@item -m4-300-nofpu
++@opindex m4-300-nofpu
++Generate code for SH4-300 without in such a way that the
++floating-point unit is not used.
++
++@item -m4-300-single
++@opindex m4-300-single
++Generate code for SH4-300 in such a way that no double-precision
++floating-point operations are used.
++
++@item -m4-300-single-only
++@opindex m4-300-single-only
++Generate code for SH4-300 in such a way that no double-precision
++floating-point operations are used.
++
++@item -m4-340
++@opindex m4-340
++Generate code for SH4-340 (no MMU, no FPU).
++
++@item -m4-500
++@opindex m4-500
++Generate code for SH4-500 (no FPU).  Passes @option{-isa=sh4-nofpu} to the
++assembler.
++
+ @item -m4a-nofpu
+ @opindex m4a-nofpu
+ Generate code for the SH4al-dsp, or for a SH4a in such a way that the
+@@ -18732,6 +18808,33 @@
+ @option{-dsp} to the assembler.  GCC doesn't generate any DSP
+ instructions at the moment.
++@item -m5-32media
++@opindex m5-32media
++Generate 32-bit code for SHmedia.
++
++@item -m5-32media-nofpu
++@opindex m5-32media-nofpu
++Generate 32-bit code for SHmedia in such a way that the
++floating-point unit is not used.
++
++@item -m5-64media
++@opindex m5-64media
++Generate 64-bit code for SHmedia.
++
++@item -m5-64media-nofpu
++@opindex m5-64media-nofpu
++Generate 64-bit code for SHmedia in such a way that the
++floating-point unit is not used.
++
++@item -m5-compact
++@opindex m5-compact
++Generate code for SHcompact.
++
++@item -m5-compact-nofpu
++@opindex m5-compact-nofpu
++Generate code for SHcompact in such a way that the
++floating-point unit is not used.
++
+ @item -mb
+ @opindex mb
+ Compile code for the processor in big-endian mode.
+@@ -18765,16 +18868,12 @@
+ Enable the use of the instruction @code{fmovd}.  Check @option{-mdalign} for
+ alignment constraints.
+-@item -mhitachi
+-@opindex mhitachi
+-Comply with the calling conventions defined by Renesas.
+-
+ @item -mrenesas
+-@opindex mhitachi
++@opindex mrenesas
+ Comply with the calling conventions defined by Renesas.
+ @item -mno-renesas
+-@opindex mhitachi
++@opindex mno-renesas
+ Comply with the calling conventions defined for GCC before the Renesas
+ conventions were available.  This option is the default for all
+ targets of the SH toolchain.
+@@ -18782,12 +18881,12 @@
+ @item -mnomacsave
+ @opindex mnomacsave
+ Mark the @code{MAC} register as call-clobbered, even if
+-@option{-mhitachi} is given.
++@option{-mrenesas} is given.
+ @item -mieee
+ @itemx -mno-ieee
+ @opindex mieee
+-@opindex mnoieee
++@opindex mno-ieee
+ Control the IEEE compliance of floating-point comparisons, which affects the
+ handling of cases where the result of a comparison is unordered.  By default
+ @option{-mieee} is implicitly enabled.  If @option{-ffinite-math-only} is
+@@ -18827,7 +18926,7 @@
+ @item none
+ Disable compiler generated atomic sequences and emit library calls for atomic
+-operations.  This is the default if the target is not @code{sh-*-linux*}.
++operations.  This is the default if the target is not @code{sh*-*-linux*}.
+ @item soft-gusa
+ Generate GNU/Linux compatible gUSA software atomic sequences for the atomic
+@@ -18834,7 +18933,7 @@
+ built-in functions.  The generated atomic sequences require additional support
+ from the interrupt/exception handling code of the system and are only suitable
+ for SH3* and SH4* single-core systems.  This option is enabled by default when
+-the target is @code{sh-*-linux*} and SH3* or SH4*.  When the target is SH4A,
++the target is @code{sh*-*-linux*} and SH3* or SH4*.  When the target is SH4A,
+ this option will also partially utilize the hardware atomic instructions
+ @code{movli.l} and @code{movco.l} to create more efficient code, unless
+ @samp{strict} is specified.  
+@@ -18853,7 +18952,7 @@
+ in privileged mode and is only suitable for single-core systems.  Additional
+ support from the interrupt/exception handling code of the system is not
+ required.  This model is enabled by default when the target is
+-@code{sh-*-linux*} and SH1* or SH2*.
++@code{sh*-*-linux*} and SH1* or SH2*.
+ @item hard-llcs
+ Generate hardware atomic sequences using the @code{movli.l} and @code{movco.l}
+@@ -18888,10 +18987,6 @@
+ processors the @code{tas.b} instruction must be used with caution since it
+ can result in data corruption for certain cache configurations.
+-@item -mspace
+-@opindex mspace
+-Optimize for space instead of speed.  Implied by @option{-Os}.
+-
+ @item -mprefergot
+ @opindex mprefergot
+ When generating position-independent code, emit function calls using
+@@ -18898,11 +18993,14 @@
+ the Global Offset Table instead of the Procedure Linkage Table.
+ @item -musermode
++@itemx -mno-usermode
+ @opindex musermode
+-Don't generate privileged mode only code.  This option
+-implies @option{-mno-inline-ic_invalidate}
+-if the inlined code would not work in user mode.
+-This is the default when the target is @code{sh-*-linux*}.
++@opindex mno-usermode
++Don't allow (allow) the compiler generating privileged mode code.  Specifying
++@option{-musermode} also implies @option{-mno-inline-ic_invalidate} if the
++inlined code would not work in user mode.  @option{-musermode} is the default
++when the target is @code{sh*-*-linux*}.  If the target is SH1* or SH2*
++@option{-musermode} has no effect, since there is no user mode.
+ @item -multcost=@var{number}
+ @opindex multcost=@var{number}
+@@ -20357,6 +20455,20 @@
+ table is exact at each instruction boundary, so it can be used for stack
+ unwinding from asynchronous events (such as debugger or garbage collector).
++@item -fno-gnu-unique
++@opindex fno-gnu-unique
++On systems with recent GNU assembler and C library, the C++ compiler
++uses the @code{STB_GNU_UNIQUE} binding to make sure that definitions
++of template static data members and static local variables in inline
++functions are unique even in the presence of @code{RTLD_LOCAL}; this
++is necessary to avoid problems with a library used by two different
++@code{RTLD_LOCAL} plugins depending on a definition in one of them and
++therefore disagreeing with the other one about the binding of the
++symbol.  But this causes @code{dlclose} to be ignored for affected
++DSOs; if your program relies on reinitialization of a DSO via
++@code{dlclose} and @code{dlopen}, you can use
++@option{-fno-gnu-unique}.
++
+ @item -fpcc-struct-return
+ @opindex fpcc-struct-return
+ Return ``short'' @code{struct} and @code{union} values in memory like
+Index: gcc/doc/md.texi
+===================================================================
+--- gcc/doc/md.texi    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/doc/md.texi    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2081,6 +2081,18 @@
+ @item wg
+ If @option{-mmfpgpr} was used, a floating point register or NO_REGS.
++@item wh
++Floating point register if direct moves are available, or NO_REGS.
++
++@item wi
++FP or VSX register to hold 64-bit integers for VSX insns or NO_REGS.
++
++@item wj
++FP or VSX register to hold 64-bit integers for direct moves or NO_REGS.
++
++@item wk
++FP or VSX register to hold 64-bit doubles for direct moves or NO_REGS.
++
+ @item wl
+ Floating point register if the LFIWAX instruction is enabled or NO_REGS.
+@@ -2112,7 +2124,7 @@
+ Floating point register if the STFIWX instruction is enabled or NO_REGS.
+ @item wy
+-VSX vector register to hold scalar float values or NO_REGS.
++FP or VSX register to perform ISA 2.07 float ops or NO_REGS.
+ @item wz
+ Floating point register if the LFIWZX instruction is enabled or NO_REGS.
+Index: gcc/doc/install.texi
+===================================================================
+--- gcc/doc/install.texi       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/doc/install.texi       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2915,12 +2915,6 @@
+ Solaris 2 (SPARC, Intel):
+ @itemize
+ @item
+-@uref{http://www.sunfreeware.com/,,Sunfreeware}
+-
+-@item
+-@uref{http://www.blastwave.org/,,Blastwave}
+-
+-@item
+ @uref{http://www.opencsw.org/,,OpenCSW}
+ @item
+@@ -2988,6 +2982,8 @@
+ @ifhtml
+ @itemize
+ @item
++@uref{#aarch64x-x-x,,aarch64*-*-*}
++@item
+ @uref{#alpha-x-x,,alpha*-*-*}
+ @item
+ @uref{#alpha-dec-osf51,,alpha*-dec-osf5.1}
+@@ -3130,6 +3126,18 @@
+ <!-- -------- host/target specific issues start here ---------------- -->
+ <hr />
+ @end html
++
++@heading @anchor{aarch64x-x-x}aarch64*-*-*
++To enable a workaround for the Cortex-A53 erratum number 835769 by default
++(for all CPUs regardless of -mcpu option given) at configure time use the
++@option{--enable-fix-cortex-a53-835769} option.  This will enable the fix by
++default and can be explicitly disabled during during compilation by passing the
++@option{-mno-fix-cortex-a53-835769} option.  Conversely,
++@option{--disable-fix-cortex-a53-835769} will disable the workaround by
++default.  The workaround is disabled by default if neither of
++@option{--enable-fix-cortex-a53-835769} or
++@option{--disable-fix-cortex-a53-835769} is given at configure time.
++
+ @heading @anchor{alpha-x-x}alpha*-*-*
+ This section contains general configuration information for all
+Index: gcc/tree-ssa-tail-merge.c
+===================================================================
+--- gcc/tree-ssa-tail-merge.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-ssa-tail-merge.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1060,6 +1060,24 @@
+     gcc_unreachable ();
+ }
++/* Return true if gimple operands T1 and T2 have the same value.  */
++
++static bool
++gimple_operand_equal_value_p (tree t1, tree t2)
++{
++  if (t1 == t2)
++    return true;
++
++  if (t1 == NULL_TREE
++      || t2 == NULL_TREE)
++    return false;
++
++  if (operand_equal_p (t1, t2, 0))
++    return true;
++
++  return gvn_uses_equal (t1, t2);
++}
++
+ /* Return true if gimple statements S1 and S2 are equal.  Gimple_bb (s1) and
+    gimple_bb (s2) are members of SAME_SUCC.  */
+@@ -1122,8 +1140,9 @@
+       lhs2 = gimple_get_lhs (s2);
+       if (TREE_CODE (lhs1) != SSA_NAME
+         && TREE_CODE (lhs2) != SSA_NAME)
+-      return (vn_valueize (gimple_vdef (s1))
+-              == vn_valueize (gimple_vdef (s2)));
++      return (operand_equal_p (lhs1, lhs2, 0)
++              && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
++                                               gimple_assign_rhs1 (s2)));
+       else if (TREE_CODE (lhs1) == SSA_NAME
+              && TREE_CODE (lhs2) == SSA_NAME)
+       return vn_valueize (lhs1) == vn_valueize (lhs2);
+Index: gcc/DATESTAMP
+===================================================================
+--- gcc/DATESTAMP      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/DATESTAMP      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1 +1 @@
+-20140522
++20141105
+Index: gcc/ipa-cp.c
+===================================================================
+--- gcc/ipa-cp.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ipa-cp.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -447,6 +447,8 @@
+   else if (!opt_for_fn (node->symbol.decl, optimize)
+          || !opt_for_fn (node->symbol.decl, flag_ipa_cp))
+     reason = "non-optimized function";
++  else if (node->tm_clone)
++    reason = "transactional memory clone";
+   if (reason && dump_file && !node->alias && !node->thunk.thunk_p)
+     fprintf (dump_file, "Function %s/%i is not versionable, reason: %s.\n",
+@@ -2902,6 +2904,11 @@
+               intersect_with_agg_replacements (cs->caller, src_idx,
+                                                &inter, 0);
+           }
++        else
++          {
++            inter.release ();
++            return vNULL;
++          }
+       }
+       else
+       {
+@@ -2917,6 +2924,11 @@
+             else
+               intersect_with_plats (src_plats, &inter, 0);
+           }
++        else
++          {
++            inter.release ();
++            return vNULL;
++          }
+       }
+     }
+   else if (jfunc->type == IPA_JF_ANCESTOR
+@@ -3000,7 +3012,8 @@
+                                         vec<cgraph_edge_p> callers)
+ {
+   struct ipa_node_params *dest_info = IPA_NODE_REF (node);
+-  struct ipa_agg_replacement_value *res = NULL;
++  struct ipa_agg_replacement_value *res;
++  struct ipa_agg_replacement_value **tail = &res;
+   struct cgraph_edge *cs;
+   int i, j, count = ipa_get_param_count (dest_info);
+@@ -3044,8 +3057,8 @@
+         v->offset = item->offset;
+         v->value = item->value;
+         v->by_ref = plats->aggs_by_ref;
+-        v->next = res;
+-        res = v;
++        *tail = v;
++        tail = &v->next;
+       }
+     next_param:
+@@ -3052,6 +3065,7 @@
+       if (inter.exists ())
+       inter.release ();
+     }
++  *tail = NULL;
+   return res;
+ }
+@@ -3060,7 +3074,8 @@
+ static struct ipa_agg_replacement_value *
+ known_aggs_to_agg_replacement_list (vec<ipa_agg_jump_function_t> known_aggs)
+ {
+-  struct ipa_agg_replacement_value *res = NULL;
++  struct ipa_agg_replacement_value *res;
++  struct ipa_agg_replacement_value **tail = &res;
+   struct ipa_agg_jump_function *aggjf;
+   struct ipa_agg_jf_item *item;
+   int i, j;
+@@ -3074,9 +3089,10 @@
+       v->offset = item->offset;
+       v->value = item->value;
+       v->by_ref = aggjf->by_ref;
+-      v->next = res;
+-      res = v;
++      *tail = v;
++      tail = &v->next;
+       }
++  *tail = NULL;
+   return res;
+ }
+Index: gcc/configure
+===================================================================
+--- gcc/configure      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/configure      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -910,6 +910,7 @@
+ enable_gnu_indirect_function
+ enable_initfini_array
+ enable_comdat
++enable_fix_cortex_a53_835769
+ enable_gnu_unique_object
+ enable_linker_build_id
+ with_long_double_128
+@@ -1619,6 +1620,14 @@
+                           glibc systems
+   --enable-initfini-array     use .init_array/.fini_array sections
+   --enable-comdat         enable COMDAT group support
++
++  --enable-fix-cortex-a53-835769
++                          enable workaround for AArch64 Cortex-A53 erratum
++                          835769 by default
++  --disable-fix-cortex-a53-835769
++                          disable workaround for AArch64 Cortex-A53 erratum
++                          835769 by default
++
+   --enable-gnu-unique-object
+                           enable the use of the @gnu_unique_object ELF
+                           extension on glibc systems
+@@ -17838,7 +17847,7 @@
+   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+   lt_status=$lt_dlunknown
+   cat > conftest.$ac_ext <<_LT_EOF
+-#line 17841 "configure"
++#line 17850 "configure"
+ #include "confdefs.h"
+ #if HAVE_DLFCN_H
+@@ -17944,7 +17953,7 @@
+   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+   lt_status=$lt_dlunknown
+   cat > conftest.$ac_ext <<_LT_EOF
+-#line 17947 "configure"
++#line 17956 "configure"
+ #include "confdefs.h"
+ #if HAVE_DLFCN_H
+@@ -23796,6 +23805,28 @@
+ $as_echo "$gcc_cv_lto_plugin" >&6; }
+ case "$target" in
++
++  aarch64*-*-*)
++    # Enable default workaround for AArch64 Cortex-A53 erratum 835769.
++    # Check whether --enable-fix-cortex-a53-835769 was given.
++if test "${enable_fix_cortex_a53_835769+set}" = set; then :
++  enableval=$enable_fix_cortex_a53_835769;
++        case $enableval in
++          yes)
++            tm_defines="${tm_defines} TARGET_FIX_ERR_A53_835769_DEFAULT=1"
++            ;;
++          no)
++            ;;
++          *)
++            as_fn_error "'$enableval' is an invalid value for --enable-fix-cortex-a53-835769.\
++  Valid choices are 'yes' and 'no'." "$LINENO" 5
++            ;;
++
++        esac
++
++fi
++
++  ;;
+   # All TARGET_ABI_OSF targets.
+   alpha*-*-linux* | alpha*-*-*bsd*)
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for explicit relocation support" >&5
+Index: gcc/fold-const.c
+===================================================================
+--- gcc/fold-const.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fold-const.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -9213,7 +9213,7 @@
+   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
+      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
+      the resulting offset is smaller in absolute value than the
+-     original one.  */
++     original one and has the same sign.  */
+   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
+       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
+       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
+@@ -9232,19 +9232,20 @@
+                                     "a comparison");
+       /* Put the constant on the side where it doesn't overflow and is
+-       of lower absolute value than before.  */
++       of lower absolute value and of same sign than before.  */
+       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
+                            ? MINUS_EXPR : PLUS_EXPR,
+                            const2, const1);
+       if (!TREE_OVERFLOW (cst)
+-        && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
++        && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2)
++        && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2))
+       {
+         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
+         return fold_build2_loc (loc, code, type,
+-                            variable1,
+-                            fold_build2_loc (loc,
+-                                         TREE_CODE (arg1), TREE_TYPE (arg1),
+-                                         variable2, cst));
++                                variable1,
++                                fold_build2_loc (loc, TREE_CODE (arg1),
++                                                 TREE_TYPE (arg1),
++                                                 variable2, cst));
+       }
+       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
+@@ -9251,13 +9252,15 @@
+                            ? MINUS_EXPR : PLUS_EXPR,
+                            const1, const2);
+       if (!TREE_OVERFLOW (cst)
+-        && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
++        && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1)
++        && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1))
+       {
+         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
+         return fold_build2_loc (loc, code, type,
+-                            fold_build2_loc (loc, TREE_CODE (arg0), TREE_TYPE (arg0),
+-                                         variable1, cst),
+-                            variable2);
++                                fold_build2_loc (loc, TREE_CODE (arg0),
++                                                 TREE_TYPE (arg0),
++                                                 variable1, cst),
++                                variable2);
+       }
+     }
+@@ -11218,7 +11221,6 @@
+       {
+         double_int c1, c2, c3, msk;
+         int width = TYPE_PRECISION (type), w;
+-        bool try_simplify = true;
+         c1 = tree_to_double_int (TREE_OPERAND (arg0, 1));
+         c2 = tree_to_double_int (arg1);
+@@ -11255,20 +11257,7 @@
+               }
+           }
+-        /* If X is a tree of the form (Y * K1) & K2, this might conflict
+-           with that optimization from the BIT_AND_EXPR optimizations.
+-           This could end up in an infinite recursion.  */
+-        if (TREE_CODE (TREE_OPERAND (arg0, 0)) == MULT_EXPR
+-            && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
+-                          == INTEGER_CST)
+-        {
+-          tree t = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
+-          double_int masked = mask_with_tz (type, c3, tree_to_double_int (t));
+-
+-          try_simplify = (masked != c1);
+-        }
+-
+-        if (try_simplify && c3 != c1)
++        if (c3 != c1)
+           return fold_build2_loc (loc, BIT_IOR_EXPR, type,
+                                   fold_build2_loc (loc, BIT_AND_EXPR, type,
+                                                    TREE_OPERAND (arg0, 0),
+@@ -11658,16 +11647,25 @@
+         && TREE_CODE (arg0) == MULT_EXPR
+         && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
+       {
++        double_int darg1 = tree_to_double_int (arg1);
+         double_int masked
+-          = mask_with_tz (type, tree_to_double_int (arg1),
++          = mask_with_tz (type, darg1,
+                           tree_to_double_int (TREE_OPERAND (arg0, 1)));
+         if (masked.is_zero ())
+           return omit_two_operands_loc (loc, type, build_zero_cst (type),
+                                         arg0, arg1);
+-        else if (masked != tree_to_double_int (arg1))
+-          return fold_build2_loc (loc, code, type, op0,
+-                                  double_int_to_tree (type, masked));
++        else if (masked != darg1)
++          {
++            /* Avoid the transform if arg1 is a mask of some
++               mode which allows further optimizations.  */
++            int pop = darg1.popcount ();
++            if (!(pop >= BITS_PER_UNIT
++                  && exact_log2 (pop) != -1
++                  && double_int::mask (pop) == darg1))
++              return fold_build2_loc (loc, code, type, op0,
++                                      double_int_to_tree (type, masked));
++          }
+       }
+       /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
+Index: gcc/omp-low.c
+===================================================================
+--- gcc/omp-low.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/omp-low.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1586,7 +1586,6 @@
+   TREE_STATIC (decl) = 1;
+   TREE_USED (decl) = 1;
+   DECL_ARTIFICIAL (decl) = 1;
+-  DECL_NAMELESS (decl) = 1;
+   DECL_IGNORED_P (decl) = 0;
+   TREE_PUBLIC (decl) = 0;
+   DECL_UNINLINABLE (decl) = 1;
+Index: gcc/toplev.c
+===================================================================
+--- gcc/toplev.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/toplev.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1036,16 +1036,19 @@
+   if (warn_stack_usage >= 0)
+     {
++      const location_t loc = DECL_SOURCE_LOCATION (current_function_decl);
++
+       if (stack_usage_kind == DYNAMIC)
+-      warning (OPT_Wstack_usage_, "stack usage might be unbounded");
++      warning_at (loc, OPT_Wstack_usage_, "stack usage might be unbounded");
+       else if (stack_usage > warn_stack_usage)
+       {
+         if (stack_usage_kind == DYNAMIC_BOUNDED)
+-          warning (OPT_Wstack_usage_, "stack usage might be %wd bytes",
+-                   stack_usage);
++          warning_at (loc,
++                      OPT_Wstack_usage_, "stack usage might be %wd bytes",
++                      stack_usage);
+         else
+-          warning (OPT_Wstack_usage_, "stack usage is %wd bytes",
+-                   stack_usage);
++          warning_at (loc, OPT_Wstack_usage_, "stack usage is %wd bytes",
++                      stack_usage);
+       }
+     }
+ }
+Index: gcc/DEV-PHASE
+===================================================================
+--- gcc/DEV-PHASE      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/DEV-PHASE      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1 @@
++prerelease
+Index: gcc/tree-ssa-sccvn.c
+===================================================================
+--- gcc/tree-ssa-sccvn.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-ssa-sccvn.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3015,33 +3015,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));
+@@ -3142,24 +3121,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.  */
+@@ -3217,27 +3190,31 @@
+     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.  */
++  /* Avoid folding if nothing changed.  */
+   if (op0 == orig_op0)
+     return NULL_TREE;
+Index: gcc/cgraphunit.c
+===================================================================
+--- gcc/cgraphunit.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cgraphunit.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1097,7 +1097,7 @@
+         /* We use local aliases for C++ thunks to force the tailcall
+            to bind locally.  This is a hack - to keep it working do
+            the following (which is not strictly correct).  */
+-        && (! TREE_CODE (target_node->symbol.decl) == FUNCTION_DECL
++        && (TREE_CODE (target_node->symbol.decl) != FUNCTION_DECL
+             || ! DECL_VIRTUAL_P (target_node->symbol.decl))
+         && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
+       {
+Index: gcc/ChangeLog
+===================================================================
+--- gcc/ChangeLog      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ChangeLog      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,930 @@
++2014-10-29  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
++
++      * config/aarch64/aarch64.c (aarch64_madd_needs_nop): Restore
++      recog state after aarch64_prev_real_insn call.
++
++2014-10-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
++
++      * config.gcc (aarch64*-*-*): Define TARGET_FIX_ERR_A53_835769_DEFAULT
++      if asked.
++      * configure.ac: Add --enable-fix-cortex-a53-835769 option.
++      * configure: Regenerate.
++      * config/aarch64/aarch64.c (aarch64_override_options): Handle
++      TARGET_FIX_ERR_A53_835769_DEFAULT.
++      * config/aarch64/aarch64.opt (mfix-cortex-a53-835769): Set Init value
++      to 2.
++      * doc/install.texi: Document --enable-fix-cortex-a53-835769 option.
++
++2014-10-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
++
++      * config/aarch64/aarch64.opt (mfix-cortex-a53-835769): New option.
++      * config/aarch64/aarch64.h (ADJUST_INSN_LENGTH): Define.
++      (FINAL_PRESCAN_INSN): Likewise.
++      * config/aarch64/aarch64.h (is_mem_p): New function.
++      (has_memory_op): Likewise.
++      (aarch64_prev_real_insn): Likewise.
++      (is_madd_op): Likewise.
++      (dep_between_memop_and_curr): Likewise.
++      (aarch64_madd_needs_nop): Likewise.
++      (aarch64_final_prescan_insn): Likewise.
++      * doc/invoke.texi (Document new option).
++
++2014-10-15  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * stor-layout.c (self_referential_size): Do not promote arguments.
++
++2014-10-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      Backport from mainline r215880
++      2014-10-03  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin):
++      Issue a warning message when vec_lvsl or vec_lvsr is used with a
++      little endian target.
++
++      Backport from mainline r215882
++      2014-10-03  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      * altivec.md (altivec_lvsl): New define_expand.
++      (altivec_lvsl_direct): Rename define_insn from altivec_lvsl.
++      (altivec_lvsr): New define_expand.
++      (altivec_lvsr_direct): Rename define_insn from altivec_lvsr.
++      * rs6000.c (rs6000_expand_builtin): Change to use
++      altivec_lvs[lr]_direct; remove commented-out code.
++
++2014-10-09  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2014-10-09  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR rtl-optimization/57003
++      * regcprop.c (copyprop_hardreg_forward_1): If ksvd.ignore_set_reg,
++      also check CALL_INSN_FUNCTION_USAGE for clobbers again after
++      killing regs_invalidated_by_call.
++
++2014-10-08  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      Backport from mainline
++      2014-10-08  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      PR target/52941
++      * config/sh/sync.md (atomic_exchangesi_hard, atomic_exchange<mode>_hard,
++      atomic_fetch_<fetchop_name>si_hard,
++      atomic_fetch_<fetchop_name><mode>_hard, atomic_fetch_nandsi_hard,
++      atomic_fetch_nand<mode>_hard, atomic_<fetchop_name>_fetchsi_hard,
++      atomic_<fetchop_name>_fetch<mode>_hard, atomic_nand_fetchsi_hard,
++      atomic_nand_fetch<mode>_hard): Add missing set of T_REG.
++
++2014-10-02  Martin Jambor  <mjambor@suse.cz>
++
++      PR tree-optimization/63375
++      * tree-sra.c (build_access_from_expr_1): Disqualify volatile
++      references.
++
++2014-10-01  Jakub Jelinek  <jakub@redhat.com>
++
++      PR debug/63342
++      * dwarf2out.c (loc_list_from_tree): Handle TARGET_MEM_REF and
++      SSA_NAME.
++
++      PR target/63428
++      * config/i386/i386.c (expand_vec_perm_pshufb): Fix up rperm[0]
++      argument to avx2_permv2ti.
++
++2014-10-01  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2014-09-30  Uros Bizjak  <ubizjak@gmail.com>
++
++      * config/i386/i386.md (fmodxf3): Enable for flag_finite_math_only only.
++      (fmod<mode>3): Ditto.
++      (fpremxf4_i387): Ditto.
++      (reminderxf3): Ditto.
++      (reminder<mode>3): Ditto.
++      (fprem1xf4_i387): Ditto.
++
++2014-09-30  Jakub Jelinek  <jakub@redhat.com>
++
++      PR inline-asm/63282
++      * ifcvt.c (dead_or_predicable): Don't call redirect_jump_1
++      or invert_jump_1 if jump isn't any_condjump_p.
++
++2014-09-29  Charles Baylis  <charles.baylis@linaro.org>
++
++      Backport from mainline r212303
++      PR target/49423
++      * config/arm/arm-protos.h (arm_legitimate_address_p,
++      arm_is_constant_pool_ref): Add prototypes.
++      * config/arm/arm.c (arm_legitimate_address_p): Remove static.
++      (arm_is_constant_pool_ref) New function.
++      * config/arm/arm.md (unaligned_loadhis, arm_zero_extendhisi2_v6,
++      arm_zero_extendqisi2_v6): Use Uh constraint for memory operand.
++      (arm_extendhisi2, arm_extendhisi2_v6): Use Uh constraint for memory
++      operand and remove pool_range and neg_pool_range attributes.
++      (arm_extendqihi_insn, arm_extendqisi, arm_extendqisi_v6): Remove
++      pool_range and neg_pool_range attributes.
++      * config/arm/constraints.md (Uh): New constraint. (Uq): Don't allow
++      constant pool references.
++
++2014-09-28  John David Anglin  <danglin@gcc.gnu.org>
++
++      * config/pa/pa.c (pa_output_function_epilogue): Only update
++      last_address when a nonnote insn is found.
++
++2014-09-25  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      Backport from mainline
++      2014-09-25  Nick Clifton  <nickc@redhat.com>
++      2014-09-25  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      PR target/62218
++      * config/sh/sync.md (atomic_fetch_nand<mode>_soft_imask,
++      atomic_test_and_set_soft_imask): Fix typo in instruction sequence.
++
++2014-09-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      Backport from mainline r215559
++      2014-09-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      PR target/63335
++      * config/rs6000/rs6000-c.c (altivec_build_resolved_builtin):
++      Exclude VSX_BUILTIN_XVCMPGEDP_P from special handling.
++
++2014-09-25  Jakub Jelinek  <jakub@redhat.com>
++
++      PR tree-optimization/63341
++      * tree-vectorizer.h (vect_create_data_ref_ptr,
++      vect_create_addr_base_for_vector_ref): Add another tree argument
++      defaulting to NULL_TREE.
++      * tree-vect-data-refs.c (vect_create_data_ref_ptr): Add byte_offset
++      argument, pass it down to vect_create_addr_base_for_vector_ref.
++      (vect_create_addr_base_for_vector_ref): Add byte_offset argument,
++      add that to base_offset too if non-NULL.
++      * tree-vect-stmts.c (vectorizable_load): Add byte_offset variable,
++      for dr_explicit_realign_optimized set it to vector byte size
++      - 1 instead of setting offset, pass byte_offset down to
++      vect_create_data_ref_ptr.
++
++2014-09-23  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Back port from trunk:
++      2014-09-23  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      * config/rs6000/rs6000.md (f32_vsx): New mode attributes to
++      refine the constraints used on 32/64-bit floating point moves.
++      (f32_av): Likewise.
++      (f64_vsx): Likewise.
++      (f64_dm): Likewise.
++      (f64_av): Likewise.
++      (BOOL_REGS_OUTPUT): Use wt constraint for TImode instead of wa.
++      (BOOL_REGS_OP1): Likewise.
++      (BOOL_REGS_OP2): Likewise.
++      (BOOL_REGS_UNARY): Likewise.
++      (mov<mode>_hardfloat, SFmode/SDmode): Tighten down constraints for
++      32/64-bit floating point moves.  Do not use wa, instead use ww/ws
++      for moves involving VSX registers.  Do not use constraints that
++      target VSX registers for decimal types.
++      (mov<mode>_hardfloat32, DFmode/DDmode): Likewise.
++      (mov<mode>_hardfloat64, DFmode/DDmode): Likewise.
++
++2014-09-19  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Back port from trunk:
++      2014-09-19  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      * config/rs6000/predicates.md (fusion_gpr_mem_load): Move testing
++      for base_reg_operand to be common between LO_SUM and PLUS.
++      (fusion_gpr_mem_combo): New predicate to match a fused address
++      that combines the addis and memory offset address.
++
++      * config/rs6000/rs6000-protos.h (fusion_gpr_load_p): Change
++      calling signature.
++      (emit_fusion_gpr_load): Likewise.
++
++      * config/rs6000/rs6000.c (fusion_gpr_load_p): Change calling
++      signature to pass each argument separately, rather than
++      using an operands array.  Rewrite the insns found by peephole2 to
++      be a single insn, rather than hoping the insns will still be
++      together when the peephole pass is done.  Drop being called via a
++      normal peephole.
++      (emit_fusion_gpr_load): Change calling signature to be called from
++      the fusion_gpr_load_<mode> insns with a combined memory address
++      instead of the peephole pass passing the addis and offset
++      separately.
++
++      * config/rs6000/rs6000.md (UNSPEC_FUSION_GPR): New unspec for GPR
++      fusion.
++      (power8 fusion peephole): Drop support for doing power8 via a
++      normal peephole that was created by the peephole2 pass.
++      (power8 fusion peephole2): Create a new insn with the fused
++      address, so that the fused operation is kept together after
++      register allocation is done.
++      (fusion_gpr_load_<mode>): Likewise.
++
++2014-09-17  Jakub Jelinek  <jakub@redhat.com>
++
++      PR debug/63284
++      * tree-cfgcleanup.c (fixup_noreturn_call): Don't split block
++      if there are only debug stmts after the noreturn call, instead
++      remove the debug stmts.
++
++2014-09-10  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      * config/rs6000/vsx.md (vsx_fmav4sf4): Use correct constraints for
++      V2DF, V4SF, DF, and DI modes.
++      (vsx_fmav2df2): Likewise.
++      (vsx_float_fix_<mode>2): Likewise.
++      (vsx_reduc_<VEC_reduc_name>_v2df_scalar): Likewise.
++
++2014-09-10  Alan Modra  <amodra@gmail.com>
++
++      PR debug/60655
++      * dwarf2out.c (mem_loc_descriptor <PLUS>): Return NULL if addend
++      can't be output.
++
++2014-09-09  Richard Biener  <rguenther@suse.de>
++
++      Backport from mainline
++      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-09-09  Richard Biener  <rguenther@suse.de>
++
++      Backport from mainline
++      2014-05-05  Richard Biener  <rguenther@suse.de>
++
++      PR middle-end/61010
++      * fold-const.c (fold_binary_loc): Consistently avoid
++      canonicalizing X & CST away from a CST that is the mask
++      of a mode.
++
++      2014-05-28  Richard Biener  <rguenther@suse.de>
++
++      PR middle-end/61045
++      * fold-const.c (fold_comparison): When folding
++      X +- C1 CMP Y +- C2 to X CMP Y +- C2 +- C1 also ensure
++      the sign of the remaining constant operand stays the same.
++
++      2014-08-11  Richard Biener  <rguenther@suse.de>
++
++      PR tree-optimization/62075
++      * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Properly
++      handle uses in patterns.
++
++2014-09-09  James Greenhalgh  <james.greenhalgh@arm.com>
++
++      Backport from mainline.
++      2014-09-09  James Greenhalgh  <james.greenhalgh@arm.com>
++
++      * doc/invoke.texi (-march): Use GNU/Linux rather than Linux.
++      (-mtune): Likewise.
++      (-mcpu): Likewise.
++
++2014-09-08  Jakub Jelinek  <jakub@redhat.com>
++
++      PR tree-optimization/60196
++      PR tree-optimization/63189
++      Backported from mainline
++      2013-09-17  Cong Hou  <congh@google.com>
++
++      * tree-vect-patterns.c (vect_recog_dot_prod_pattern): Fix a bug
++      when checking the dot production pattern. The type of rhs operand
++      of multiply is now checked correctly.
++
++2014-09-08  Jakub Jelinek  <jakub@redhat.com>
++
++      Backported from mainline
++      2014-08-06  Vladimir Makarov  <vmakarov@redhat.com>
++
++      PR debug/61923
++      * haifa-sched.c (advance_one_cycle): Fix dump.
++      (schedule_block): Don't advance cycle if we are already at the
++      beginning of the cycle.
++
++2014-09-03  Martin Jambor  <mjambor@suse.cz>
++
++      PR ipa/62015
++      * ipa-cp.c (intersect_aggregates_with_edge): Handle impermissible
++      pass-trough jump functions correctly.
++
++2014-09-03  Martin Jambor  <mjambor@suse.cz>
++
++      PR ipa/61986
++      * ipa-cp.c (find_aggregate_values_for_callers_subset): Chain
++      created replacements in ascending order of offsets.
++      (known_aggs_to_agg_replacement_list): Likewise.
++
++2014-09-01  Marek Polacek  <polacek@redhat.com>
++
++      Backport from mainline
++      2014-08-21  Marek Polacek  <polacek@redhat.com>
++
++      PR c/61271
++      * expr.c (is_aligning_offset): Remove logical not.
++
++2014-09-01  Marek Polacek  <polacek@redhat.com>
++
++      Backport from mainline
++      2014-08-19  Marek Polacek  <polacek@redhat.com>
++
++      PR c/61271
++      * cgraphunit.c (handle_alias_pairs): Fix condition.
++
++2014-08-30  John David Anglin  <danglin@gcc.gnu.org>
++
++      * config/pa/pa.c (pa_assemble_integer): Don't add PLABEL relocation
++      prefix to function labels when generating fast indirect calls.
++
++2014-08-26  Joel Sherrill <joel.sherrill@oarcorp.com>
++
++      * doc/invoke.texi: -fno-cxa-atexit should be -fno-use-cxa-atexit.
++
++2014-08-26  Marek Polacek  <polacek@redhat.com>
++
++      Backport from mainline
++      2014-08-26  Marek Polacek  <polacek@redhat.com>
++
++      PR c/61271
++      * tree-vectorizer.h (LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT,
++      LOOP_REQUIRES_VERSIONING_FOR_ALIAS): Wrap in parens.
++
++2014-08-24  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      Backport from mainline
++      2014-08-24  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      PR target/61996
++      * config/sh/sh.opt (musermode): Allow negative form.
++      * config/sh/sh.c (sh_option_override): Disable TARGET_USERMODE for
++      targets that don't support it.
++      * doc/invoke.texi (SH Options): Rename sh-*-linux* to sh*-*-linux*.
++      Document -mno-usermode option.
++
++2014-08-23  John David Anglin  <danglin@gcc.gnu.org>
++
++      PR target/62038
++      * config/pa/pa.c (pa_output_function_epilogue): Don't set
++      last_address when the current function is a thunk.
++      (pa_asm_output_mi_thunk): When we don't have named sections or they
++      are not being used, check that thunk can reach the stub table with a
++      short branch.
++
++2014-08-22  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Backport fro mainline
++      2014-08-22  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      PR target/62195
++      * doc/md.texi (Machine Constraints): Update PowerPC wi constraint
++      documentation to state it is only for VSX operations.
++
++      * config/rs6000/rs6000.c (rs6000_init_hard_regno_mode_ok): Make wi
++      constraint only active if VSX.
++
++      * config/rs6000/rs6000.md (lfiwax): Use wj constraint instead of
++      wi cosntraint for ISA 2.07 lxsiwax/lxsiwzx instructions.
++      (lfiwzx): Likewise.
++
++2014-08-15  Tom de Vries  <tom@codesourcery.com>
++
++      Backport from mainline:
++      2014-08-14  Tom de Vries  <tom@codesourcery.com>
++
++      PR rtl-optimization/62004
++      PR rtl-optimization/62030
++      * ifcvt.c (rtx_interchangeable_p): New function.
++      (noce_try_move, noce_process_if_block): Use rtx_interchangeable_p.
++
++      2014-08-05  Richard Biener  <rguenther@suse.de>
++
++      * emit-rtl.h (mem_attrs_eq_p): Declare.
++      * emit-rtl.c (mem_attrs_eq_p): Export.
++
++2014-08-16  John David Anglin  <danglin@gcc.gnu.org>
++
++      Backport from trunk:
++      2014-04-06  John David Anglin  <danglin@gcc.gnu.org>
++
++      PR debug/55794
++      * config/pa/pa.c (pa_output_function_epilogue): Skip address and code
++      size accounting for thunks.
++      (pa_asm_output_mi_thunk): Use final_start_function() and
++      final_end_function() to output function start and end directives.
++
++2014-08-15  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      Backport from mainline:
++      2014-08-15  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      * doc/invoke.texi (SH options): Document missing processor variant
++      options.  Remove references to Hitachi.  Undocument deprecated mspace
++      option.
++
++2014-08-13  Felix Yang  <fei.yang0953@gmail.com>
++
++      PR tree-optimization/62073
++      * tree-vect-loop.c (vect_is_simple_reduction_1): Check that DEF1 has
++      a basic block.
++
++2014-08-13  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      Backport from mainline
++      2014-08-12  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      PR middle-end/62103
++      * gimple-fold.c (fold_ctor_reference): Don't fold in presence of
++      bitfields, that is when size doesn't match the size of type or the
++      size of the constructor.
++
++2014-08-12  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Backport patch from mainline
++      2014-08-11  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      * config/rs6000/constraints.md (wh constraint): New constraint,
++      for FP registers if direct move is available.
++      (wi constraint): New constraint, for VSX/FP registers that can
++      handle 64-bit integers.
++      (wj constraint): New constraint for VSX/FP registers that can
++      handle 64-bit integers for direct moves.
++      (wk constraint): New constraint for VSX/FP registers that can
++      handle 64-bit doubles for direct moves.
++      (wy constraint): Make documentation match implementation.
++
++      * config/rs6000/rs6000.c (struct rs6000_reg_addr): Add
++      scalar_in_vmx_p field to simplify tests of whether SFmode or
++      DFmode can go in the Altivec registers.
++      (rs6000_hard_regno_mode_ok): Use scalar_in_vmx_p field.
++      (rs6000_setup_reg_addr_masks): Likewise.
++      (rs6000_debug_print_mode): Add debug support for scalar_in_vmx_p
++      field, and wh/wi/wj/wk constraints.
++      (rs6000_init_hard_regno_mode_ok): Setup scalar_in_vmx_p field, and
++      the wh/wi/wj/wk constraints.
++      (rs6000_preferred_reload_class): If SFmode/DFmode can go in the
++      upper registers, prefer VSX registers unless the operation is a
++      memory operation with REG+OFFSET addressing.
++
++      * config/rs6000/vsx.md (VSr mode attribute): Add support for
++      DImode.  Change SFmode to use ww constraint instead of d to allow
++      SF registers in the upper registers.
++      (VSr2): Likewise.
++      (VSr3): Likewise.
++      (VSr5): Fix thinko in comment.
++      (VSa): New mode attribute that is an alternative to wa, that
++      returns the VSX register class that a mode can go in, but may not
++      be the preferred register class.
++      (VS_64dm): New mode attribute for appropriate register classes for
++      referencing 64-bit elements of vectors for direct moves and normal
++      moves.
++      (VS_64reg): Likewise.
++      (vsx_mov<mode>): Change wa constraint to <VSa> to limit the
++      register allocator to only registers the data type can handle.
++      (vsx_le_perm_load_<mode>): Likewise.
++      (vsx_le_perm_store_<mode>): Likewise.
++      (vsx_xxpermdi2_le_<mode>): Likewise.
++      (vsx_xxpermdi4_le_<mode>): Likewise.
++      (vsx_lxvd2x2_le_<mode>): Likewise.
++      (vsx_lxvd2x4_le_<mode>): Likewise.
++      (vsx_stxvd2x2_le_<mode>): Likewise.
++      (vsx_add<mode>3): Likewise.
++      (vsx_sub<mode>3): Likewise.
++      (vsx_mul<mode>3): Likewise.
++      (vsx_div<mode>3): Likewise.
++      (vsx_tdiv<mode>3_internal): Likewise.
++      (vsx_fre<mode>2): Likewise.
++      (vsx_neg<mode>2): Likewise.
++      (vsx_abs<mode>2): Likewise.
++      (vsx_nabs<mode>2): Likewise.
++      (vsx_smax<mode>3): Likewise.
++      (vsx_smin<mode>3): Likewise.
++      (vsx_sqrt<mode>2): Likewise.
++      (vsx_rsqrte<mode>2): Likewise.
++      (vsx_tsqrt<mode>2_internal): Likewise.
++      (vsx_fms<mode>4): Likewise.
++      (vsx_nfma<mode>4): Likewise.
++      (vsx_eq<mode>): Likewise.
++      (vsx_gt<mode>): Likewise.
++      (vsx_ge<mode>): Likewise.
++      (vsx_eq<mode>_p): Likewise.
++      (vsx_gt<mode>_p): Likewise.
++      (vsx_ge<mode>_p): Likewise.
++      (vsx_xxsel<mode>): Likewise.
++      (vsx_xxsel<mode>_uns): Likewise.
++      (vsx_copysign<mode>3): Likewise.
++      (vsx_float<VSi><mode>2): Likewise.
++      (vsx_floatuns<VSi><mode>2): Likewise.
++      (vsx_fix_trunc<mode><VSi>2): Likewise.
++      (vsx_fixuns_trunc<mode><VSi>2): Likewise.
++      (vsx_x<VSv>r<VSs>i): Likewise.
++      (vsx_x<VSv>r<VSs>ic): Likewise.
++      (vsx_btrunc<mode>2): Likewise.
++      (vsx_b2trunc<mode>2): Likewise.
++      (vsx_floor<mode>2): Likewise.
++      (vsx_ceil<mode>2): Likewise.
++      (vsx_<VS_spdp_insn>): Likewise.
++      (vsx_xscvspdp): Likewise.
++      (vsx_xvcvspuxds): Likewise.
++      (vsx_float_fix_<mode>2): Likewise.
++      (vsx_set_<mode>): Likewise.
++      (vsx_extract_<mode>_internal1): Likewise.
++      (vsx_extract_<mode>_internal2): Likewise.
++      (vsx_extract_<mode>_load): Likewise.
++      (vsx_extract_<mode>_store): Likewise.
++      (vsx_splat_<mode>): Likewise.
++      (vsx_xxspltw_<mode>): Likewise.
++      (vsx_xxspltw_<mode>_direct): Likewise.
++      (vsx_xxmrghw_<mode>): Likewise.
++      (vsx_xxmrglw_<mode>): Likewise.
++      (vsx_xxsldwi_<mode>): Likewise.
++      (vsx_xscvdpspn): Tighten constraints to only use register classes
++      the types use.
++      (vsx_xscvspdpn): Likewise.
++      (vsx_xscvdpspn_scalar): Likewise.
++
++      * config/rs6000/rs6000.h (enum rs6000_reg_class_enum): Add wh, wi,
++      wj, and wk constraints.
++      (GPR_REG_CLASS_P): New helper macro for register classes targeting
++      general purpose registers.
++
++      * config/rs6000/rs6000.md (f32_dm): Use wh constraint for SDmode
++      direct moves.
++      (zero_extendsidi2_lfiwz): Use wj constraint for direct move of
++      DImode instead of wm.  Use wk constraint for direct move of DFmode
++      instead of wm.
++      (extendsidi2_lfiwax): Likewise.
++      (lfiwax): Likewise.
++      (lfiwzx): Likewise.
++      (movdi_internal64): Likewise.
++
++      * doc/md.texi (PowerPC and IBM RS6000): Document wh, wi, wj, and
++      wk constraints. Make the wy constraint documentation match them
++      implementation.
++
++2014-08-01  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      Backport from mainline
++      2014-06-13  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      PR tree-optimization/61375
++      * tree-ssa-math-opts.c (find_bswap_or_nop_1): Cancel optimization if
++      symbolic number cannot be represented in an unsigned HOST_WIDE_INT.
++      (execute_optimize_bswap): Cancel optimization if CHAR_BIT != 8.
++
++2014-08-01  Richard Biener  <rguenther@suse.de>
++
++      PR tree-optimization/61964
++      * tree-ssa-tail-merge.c (gimple_operand_equal_value_p): New
++      function merged from trunk.
++      (gimple_equal_p): Handle non-SSA LHS solely by structural
++      equality.
++
++2014-07-25  Uros Bizjak  <ubizjak@gmail.com>
++
++      * config/alpha/elf.h: Define TARGET_UNWIND_TABLES_DEFAULT.
++
++2014-07-24  Kyle McMartin  <kyle@redhat.com>
++
++      * config/aarch64/aarch64-linux.h (TARGET_ASM_FILE_END): Define.
++
++2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      * config/rs6000/rs6000-protos.h (rs6000_special_adjust_field_align_p):
++      Add prototype.
++      * config/rs6000/rs6000.c (rs6000_special_adjust_field_align_p): New
++      function.  Issue -Wpsabi warning if future GCC releases will use
++      different field alignment rules for this type.
++      * config/rs6000/sysv4.h (ADJUST_FIELD_ALIGN): Call it.
++      * config/rs6000/linux64.h (ADJUST_FIELD_ALIGN): Likewise.
++      * config/rs6000/freebsd64.h (ADJUST_FIELD_ALIGN): Likewise.
++
++2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      * config/rs6000/rs6000.c (rs6000_function_arg_boundary): Issue
++      -Wpsabi note when encountering a type where future GCC releases
++      will apply different alignment requirements.
++
++2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      * config/rs6000/rs6000.c (rs6000_function_arg): If a float argument
++      does not fit fully into floating-point registers, and there is still
++      space in the register parameter area, issue -Wpsabi note that the ABI
++      will change in a future GCC release.
++
++2014-07-23  Sebastian Huber  <sebastian.huber@embedded-brains.de>
++
++      * config/arm/t-rtems-eabi: Add
++      mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard,
++      mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard,
++      mbig-endian/mthumb/march=armv7-r, and
++      mbig-endian/mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++      multilibs.
++
++2014-07-21  Peter Bergner  <bergner@vnet.ibm.com>
++
++      * config/rs6000/sysv4.h (LIBASAN_EARLY_SPEC): Define.
++      (LIBTSAN_EARLY_SPEC): Likewise.
++      (STATIC_LIBASAN_LIBS): Likewise.
++      (STATIC_LIBTSAN_LIBS): Likewise.
++
++2014-07-19  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * toplev.c (output_stack_usage): Adjust the location of the warning.
++
++2014-07-19  Daniel Cederman  <cederman@gaisler.com>
++
++      * config/sparc/sync.md (*membar_storeload_leon3): New insn.
++      (*membar_storeload): Disable for LEON3.
++
++2014-07-17  Richard Biener  <rguenther@suse.de>
++
++      PR rtl-optimization/61801
++      * sched-deps.c (sched_analyze_2): For ASM_OPERANDS and
++      ASM_INPUT don't set reg_pending_barrier if it appears in a
++      debug-insn.
++
++2014-07-16  Jakub Jelinek  <jakub@redhat.com>
++
++      * omp-low.c (create_omp_child_function): Don't set DECL_NAMELESS
++      on the FUNCTION_DECL.
++
++2014-07-10  Tom G. Christensen  <tgc@jupiterrise.com>
++
++      * doc/install.texi: Remove links to defunct package providers for
++      Solaris.
++
++2014-07-10  Eric Botcazou  <ebotcazou@adacore.com>
++
++      PR middle-end/53590
++      * function.c (allocate_struct_function): Revert r188667 change.
++
++2014-07-04  Jakub Jelinek  <jakub@redhat.com>
++
++      PR tree-optimization/61684
++      * tree-ssa-ifcombine.c (recognize_single_bit_test): Make sure
++      rhs1 of conversion is a SSA_NAME before using SSA_NAME_DEF_STMT on it.
++
++2014-06-30  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      Backport from Mainline
++      2014-06-20  Jakub Jelinek  <jakub@redhat.com>
++      2014-06-11  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      PR tree-optimization/61306
++      * tree-ssa-math-opts.c (struct symbolic_number): Store type of
++      expression instead of its size.
++      (do_shift_rotate): Adapt to change in struct symbolic_number. Return
++      false to prevent optimization when the result is unpredictable due to
++      arithmetic right shift of signed type with highest byte is set.
++      (verify_symbolic_number_p): Adapt to change in struct symbolic_number.
++      (find_bswap_1): Likewise. Return NULL to prevent optimization when the
++      result is unpredictable due to sign extension.
++      (find_bswap): Adapt to change in struct symbolic_number.
++
++2014-06-27  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2014-06-26  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/61586
++      * config/alpha/alpha.c (alpha_handle_trap_shadows): Handle BARRIER RTX.
++
++2014-06-26  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      PR target/61542
++      * config/rs6000/vsx.md (vsx_extract_v4sf): Fix bug with element
++      extraction other than index 3.
++
++2014-06-24  Jakub Jelinek  <jakub@redhat.com>
++
++      PR target/61570
++      * config/i386/driver-i386.c (host_detect_local_cpu): For unknown
++      model family 6 CPU with has_longmode never use a CPU without
++      64-bit support.
++
++2014-06-20  Chung-Lin Tang  <cltang@codesourcery.com>
++
++      Backport from mainline
++
++      2014-06-20  Julian Brown  <julian@codesourcery.com>
++                  Chung-Lin Tang  <cltang@codesourcery.com>
++
++      * config/arm/arm.c (arm_output_mi_thunk): Fix offset for
++      TARGET_THUMB1_ONLY. Add comments.
++
++2014-06-18  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2014-06-06  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/61423
++      * config/i386/i386.md (*floatunssi<mode>2_i387_with_xmm): New
++      define_insn_and_split pattern, merged from *floatunssi<mode>2_1
++      and corresponding splitters.  Zero extend general register
++      or memory input operand to XMM temporary.  Enable for
++      TARGET_SSE2 and TARGET_INTER_UNIT_MOVES_TO_VEC only.
++      (floatunssi<mode>2): Update expander predicate.
++
++2014-06-18  Richard Henderson  <rth@redhat.com>
++
++      PR target/61545
++      * config/aarch64/aarch64.md (tlsdesc_small): Clobber CC_REGNUM.
++
++2014-06-17  Nagaraju Mekala <nagaraju.mekala@xilinx.com>
++
++      Revert on gcc-4_8-branch.
++      * config/microblaze/microblaze.md: Add movsi4_rev insn pattern.
++      * config/microblaze/predicates.md: Add reg_or_mem_operand predicate.
++
++2014-06-17  Yufeng Zhang  <yufeng.zhang@arm.com>
++
++      Backport from mainline
++
++      PR target/61483
++      * config/aarch64/aarch64.c (aarch64_layout_arg): Add new local
++      variable 'size'; calculate 'size' right in the front; use
++      'size' to compute 'nregs' (when 'allocate_ncrn != 0') and
++      pcum->aapcs_stack_words.
++
++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  Jason Merrill  <jason@redhat.com>
++
++      PR c++/60731
++      * common.opt (-fno-gnu-unique): Add.
++      * config/elfos.h (USE_GNU_UNIQUE_OBJECT): Check it.
++
++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-05-14 trunk r210418
++      * config/avr/avr.h (REG_CLASS_CONTENTS): Use unsigned suffix for
++      shifted values to avoid build warning.
++
++      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-06  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Back port from trunk
++      2014-06-06  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      PR target/61431
++      * config/rs6000/vsx.md (VSX_LE): Split VSX_D into 2 separate
++      iterators, VSX_D that handles 64-bit types, and VSX_LE that
++      handles swapping the two 64-bit double words on little endian
++      systems.  Include V1TImode and optionally TImode in VSX_LE so that
++      these types are properly swapped.  Change all of the insns and
++      splits that do the 64-bit swaps to use VSX_LE.
++      (vsx_le_perm_load_<mode>): Likewise.
++      (vsx_le_perm_store_<mode>): Likewise.
++      (splitters for little endian memory operations): Likewise.
++      (vsx_xxpermdi2_le_<mode>): Likewise.
++      (vsx_lxvd2x2_le_<mode>): Likewise.
++      (vsx_stxvd2x2_le_<mode>): Likewise.
++
++2014-06-05  Martin Jambor  <mjambor@suse.cz>
++
++      PR ipa/61393
++      * ipa-cp.c (determine_versionability): Pretend that tm_clones are
++      not versionable.
++
++2014-06-04  Richard Biener  <rguenther@suse.de>
++
++      PR tree-optimization/61383
++      * tree-ssa-ifcombine.c (bb_no_side_effects_p): Make sure
++      stmts can't trap.
++
++2014-06-03  Andrey Belevantsev  <abel@ispras.ru>
++
++      Backport from mainline
++      2014-05-14  Andrey Belevantsev  <abel@ispras.ru>
++
++      PR rtl-optimization/60866
++      * sel-sched-ir (sel_init_new_insn): New parameter old_seqno.
++      Default it to -1.  Pass it down to init_simplejump_data.
++      (init_simplejump_data): New parameter old_seqno.  Pass it down
++      to get_seqno_for_a_jump.
++      (get_seqno_for_a_jump): New parameter old_seqno.  Use it for
++      initializing new jump seqno as a last resort.  Add comment.
++      (sel_redirect_edge_and_branch): Save old seqno of the conditional
++      jump and pass it down to sel_init_new_insn.
++      (sel_redirect_edge_and_branch_force): Likewise.
++
++2014-06-03  Andrey Belevantsev  <abel@ispras.ru>
++
++      Backport from mainline
++      2014-05-14  Andrey Belevantsev  <abel@ispras.ru>
++
++      PR rtl-optimization/60901
++      * config/i386/i386.c (ix86_dependencies_evaluation_hook): Check that
++      bb predecessor belongs to the same scheduling region.  Adjust comment.
++
++2014-06-03  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2014-06-02  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/61239
++      * config/i386/i386.c (ix86_expand_vec_perm) [case V32QImode]: Use
++      GEN_INT (-128) instead of GEN_INT (128) to set MSB of QImode constant.
++
++2014-05-28  Guozhi Wei  <carrot@google.com>
++
++      PR target/61202
++      * config/aarch64/arm_neon.h (vqdmulh_n_s16): Change the last operand's
++      constraint.
++      (vqdmulhq_n_s16): Likewise.
++
++2014-05-28  Eric Botcazou  <ebotcazou@adacore.com>
++
++      Backport from mainline
++      2014-05-27  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * double-int.c (div_and_round_double) <ROUND_DIV_EXPR>: Use the proper
++      predicate to detect a negative quotient.
++
++2014-05-28  Georg-Johann Lay  <avr@gjlay.de>
++
++      PR target/61044
++      * doc/extend.texi (Local Labels): Note that label differences are
++      not supported for AVR.
++
++2014-05-26  Michael Tautschnig  <mt@debian.org>
++
++      PR target/61249
++      * doc/extend.texi (X86 Built-in Functions): Fix parameter lists of
++      __builtin_ia32_vfrczs[sd] and __builtin_ia32_mpsadbw256.
++
++2014-05-23  Alan Modra  <amodra@gmail.com>
++
++      PR target/61231
++      * config/rs6000/rs6000.c (mem_operand_gpr): Handle SImode.
++      * config/rs6000/rs6000.md (extendsidi2_lfiwax, extendsidi2_nocell):
++      Use "Y" constraint rather than "m".
++
++2014-05-22  Peter Bergner  <bergner@vnet.ibm.com>
++
++      Backport from mainline
++      2014-05-22  Peter Bergner  <bergner@vnet.ibm.com>
++
++      * config/rs6000/htm.md (ttest): Use correct shift value to get CR0.
++
++2014-05-22  Richard Earnshaw  <rearnsha@arm.com>
++
++      PR target/61208
++      * arm.md (arm_cmpdi_unsigned): Fix length calculation for Thumb2.
++
++2013-05-22  Richard Biener  <rguenther@suse.de>
++
++      * BASE-VER: Set to 4.8.4.
++      * DEV-PHASE: Set to prerelease.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: gcc/testsuite/gcc.target/powerpc/warn-lvsl-lvsr.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/warn-lvsl-lvsr.c  (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/warn-lvsl-lvsr.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,14 @@
++/* Test for deprecation messages on use of lvsl and lvsr for little endian.  */
++
++/* { dg-do compile { target { powerpc64le-*-* } } } */
++/* { dg-options "-O0 -Wdeprecated" } */
++
++#include <altivec.h>
++
++float f[20];
++
++void foo ()
++{
++  vector unsigned char a = vec_lvsl (4, f); /* { dg-warning "vec_lvsl is deprecated for little endian; use assignment for unaligned loads and stores" } */
++  vector unsigned char b = vec_lvsr (8, f); /* { dg-warning "vec_lvsr is deprecated for little endian; use assignment for unaligned loads and stores" } */
++}
+Index: gcc/testsuite/gcc.target/powerpc/pr63335.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/pr63335.c (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/pr63335.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,30 @@
++/* { dg-do run { target { powerpc64*-*-* } } } */
++/* { dg-require-effective-target powerpc_vsx_ok } */
++/* { dg-options "-mvsx" } */
++
++#include <altivec.h>
++
++void abort (void);
++
++vector double vec = (vector double) {99.0, 99.0};
++
++int main() {
++
++  int actual = vec_all_nge(vec, vec);
++  if ( actual != 0)
++    abort();
++
++  actual = vec_all_nle(vec, vec);
++  if ( actual != 0)
++    abort();
++
++  actual = vec_any_nge(vec, vec);
++  if ( actual != 0)
++    abort();
++
++  actual = vec_any_nle(vec, vec);
++  if ( actual != 0)
++    abort();
++
++  return 0;
++}
+Index: gcc/testsuite/gcc.target/powerpc/vsx-builtin-8.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/vsx-builtin-8.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.target/powerpc/vsx-builtin-8.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,7 +1,7 @@
+ /* { dg-do compile { target { powerpc*-*-* } } } */
+ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+ /* { dg-require-effective-target powerpc_vsx_ok } */
+-/* { dg-options "-O3 -mcpu=power7" } */
++/* { dg-options "-O3 -mcpu=power7 -Wno-deprecated" } */
+ /* Test the various load/store varients.  */
+Index: gcc/testsuite/gcc.target/powerpc/tfmode_off.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/tfmode_off.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.target/powerpc/tfmode_off.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -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
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/pack02.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.target/powerpc/pack02.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2,6 +2,7 @@
+ /* { 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>
+Index: gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-1.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-1.c        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-1.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,12 @@
++/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */
++/* { dg-options "-mabi=elfv2" } */
++
++struct f8
++  {
++    float x[8];
++  };
++
++void test (struct f8 a, struct f8 b) /* { dg-message "note: the ABI of passing homogeneous float aggregates will change" } */
++{
++}
++
+Index: gcc/testsuite/gcc.target/powerpc/htm-ttest.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/htm-ttest.c       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/htm-ttest.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,14 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_htm_ok } */
++/* { dg-options "-O2 -mhtm" } */
++
++/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,3,30,31" { target { ilp32 } } } } */
++/* { dg-final { scan-assembler "rldicl r?\[0-9\]+,r?\[0-9\]+,35,62" { target { lp64 } } } } */
++
++#include <htmintrin.h>
++long
++ttest (void)
++{
++  return _HTM_STATE(__builtin_ttest());
++}
+Index: gcc/testsuite/gcc.target/powerpc/lvsl-lvsr.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/lvsl-lvsr.c       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/lvsl-lvsr.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,21 @@
++/* Test expected code generation for lvsl and lvsr on little endian.
++   Note that lvsl and lvsr are each produced once, but the filename
++   causes them to appear twice in the file.  */
++
++/* { dg-do compile { target { powerpc64le-*-* } } } */
++/* { dg-options "-O0 -Wno-deprecated" } */
++/* { dg-final { scan-assembler-times "lvsl" 2 } } */
++/* { dg-final { scan-assembler-times "lvsr" 2 } } */
++/* { dg-final { scan-assembler-times "lxvd2x" 2 } } */
++/* { dg-final { scan-assembler-times "vperm" 2 } } */
++
++
++#include <altivec.h>
++
++float f[20];
++
++void foo ()
++{
++  vector unsigned char a = vec_lvsl (4, f);
++  vector unsigned char b = vec_lvsr (8, f);
++}
+Index: gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-2.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-2.c        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-2.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,12 @@
++/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */
++/* { dg-options "-mno-compat-align-parm" } */
++
++struct test
++  {
++    long a __attribute__((aligned (16)));
++  };
++
++void test (struct test a) /* { dg-message "note: the ABI of passing aggregates with 16-byte alignment will change" } */
++{
++}
++
+Index: gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-3.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-3.c        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-3.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,9 @@
++/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-maltivec" } */
++
++struct test
++  {
++    int a __attribute__((vector_size (8)));
++  }; /* { dg-message "note: the layout of aggregates containing vectors with 8-byte alignment will change" } */
++
+Index: gcc/testsuite/gcc.target/powerpc/altivec-6.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/altivec-6.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.target/powerpc/altivec-6.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,6 +1,6 @@
+ /* { dg-do compile { target powerpc*-*-* } } */
+ /* { dg-require-effective-target powerpc_altivec_ok } */
+-/* { dg-options "-maltivec -O0 -Wall" } */
++/* { dg-options "-maltivec -O0 -Wall -Wno-deprecated" } */
+ #include <altivec.h>
+Index: gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,7 +1,7 @@
+ /* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+ /* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
+ /* { dg-require-effective-target powerpc_altivec_ok } */
+-/* { dg-options "-maltivec -O2" } */
++/* { dg-options "-maltivec -O2 -Wno-deprecated" } */
+ #include <altivec.h>
+Index: gcc/testsuite/gcc.target/powerpc/altivec-20.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/altivec-20.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.target/powerpc/altivec-20.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,5 +1,5 @@
+ /* { dg-do compile { target powerpc_altivec_ok } } */
+-/* { dg-options "-maltivec -mcpu=G5 -O2" } */
++/* { dg-options "-maltivec -mcpu=G5 -O2 -Wno-deprecated" } */
+ #include <altivec.h>
+Index: gcc/testsuite/gcc.target/alpha/pr61586.c
+===================================================================
+--- gcc/testsuite/gcc.target/alpha/pr61586.c   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/alpha/pr61586.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,10 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -mieee" } */
++
++void foo (int *dimensions, double **params, int hh)
++{
++  if (params[hh])
++    ;
++  else if (dimensions[hh] > 0)
++    params[hh][0] = 1.0f;
++}
+Index: gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-14.c
+===================================================================
+--- gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-14.c       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-14.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,35 @@
++/* Test AAPCS64 layout and __builtin_va_start.
++
++   Pass named HFA/HVA argument on stack.  */
++
++/* { dg-do run { target aarch64*-*-* } } */
++
++#ifndef IN_FRAMEWORK
++#define AAPCS64_TEST_STDARG
++#define TESTFILE "va_arg-14.c"
++#include "type-def.h"
++
++struct hfa_fx2_t hfa_fx2 = {1.2f, 2.2f};
++struct hfa_fx3_t hfa_fx3 = {3.2f, 4.2f, 5.2f};
++vf4_t float32x4 = {6.2f, 7.2f, 8.2f, 9.2f};
++vf4_t float32x4_2 = {10.2f, 11.2f, 12.2f, 13.2f};
++
++#include "abitest.h"
++#else
++  ARG (float, 1.0f, S0, 0)
++  ARG (float, 2.0f, S1, 1)
++  ARG (float, 3.0f, S2, 2)
++  ARG (float, 4.0f, S3, 3)
++  ARG (float, 5.0f, S4, 4)
++  ARG (float, 6.0f, S5, 5)
++  ARG (float, 7.0f, S6, 6)
++  ARG (struct hfa_fx3_t, hfa_fx3, STACK, 7)
++  /* Previous argument size has been rounded up to the nearest multiple of
++     8 bytes.  */
++  ARG (struct hfa_fx2_t, hfa_fx2, STACK + 16, 8)
++  /* NSAA is rounded up to the nearest natural alignment of float32x4.  */
++  ARG (vf4_t, float32x4, STACK + 32, 9)
++  ARG (vf4_t, float32x4_2, STACK + 48, LAST_NAMED_ARG_ID)
++  DOTS
++  LAST_ANON (double, 123456789.987, STACK + 64, 11)
++#endif
+Index: gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h
+===================================================================
+--- gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -34,6 +34,13 @@
+   float b;
+ };
++struct hfa_fx3_t
++{
++  float a;
++  float b;
++  float c;
++};
++
+ struct hfa_dx2_t
+ {
+   double a;
+Index: gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-13.c
+===================================================================
+--- gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-13.c       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-13.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,59 @@
++/* Test AAPCS64 layout and __builtin_va_start.
++
++   Pass named HFA/HVA argument on stack.  */
++
++/* { dg-do run { target aarch64*-*-* } } */
++
++#ifndef IN_FRAMEWORK
++#define AAPCS64_TEST_STDARG
++#define TESTFILE "va_arg-13.c"
++
++struct float_float_t
++{
++  float a;
++  float b;
++} float_float;
++
++union float_int_t
++{
++  float b8;
++  int b5;
++} float_int;
++
++#define HAS_DATA_INIT_FUNC
++void
++init_data ()
++{
++  float_float.a = 1.2f;
++  float_float.b = 2.2f;
++
++  float_int.b8 = 4983.80f;
++}
++
++#include "abitest.h"
++#else
++  ARG (float, 1.0f, S0, 0)
++  ARG (float, 2.0f, S1, 1)
++  ARG (float, 3.0f, S2, 2)
++  ARG (float, 4.0f, S3, 3)
++  ARG (float, 5.0f, S4, 4)
++  ARG (float, 6.0f, S5, 5)
++  ARG (float, 7.0f, S6, 6)
++  ARG (struct float_float_t, float_float, STACK, 7)
++  ARG (int,  9, W0, 8)
++  ARG (int, 10, W1, 9)
++  ARG (int, 11, W2, 10)
++  ARG (int, 12, W3, 11)
++  ARG (int, 13, W4, 12)
++  ARG (int, 14, W5, 13)
++  ARG (int, 15, W6, LAST_NAMED_ARG_ID)
++  DOTS
++  /* Note on the reason of using 'X7' instead of 'W7' here:
++     Using 'X7' makes sure the test works in the big-endian mode.
++     According to PCS rules B.4 and C.10, the size of float_int is rounded
++     to 8 bytes and prepared in the register X7 as if loaded via LDR from
++     the memory, with the content of the other 4 bytes unspecified.  The
++     test framework will only compare the 4 relavent bytes.  */
++  ANON (union float_int_t, float_int, X7, 15)
++  LAST_ANON (long long, 12683143434LL, STACK + 8, 16)
++#endif
+Index: gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-15.c
+===================================================================
+--- gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-15.c       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-15.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,39 @@
++/* Test AAPCS64 layout and __builtin_va_start.
++
++   Pass named __128int argument on stack.  */
++
++/* { dg-do run { target aarch64*-*-* } } */
++
++#ifndef IN_FRAMEWORK
++#define AAPCS64_TEST_STDARG
++#define TESTFILE "va_arg-15.c"
++#include "type-def.h"
++
++union int128_t qword;
++
++#define HAS_DATA_INIT_FUNC
++void
++init_data ()
++{
++  /* Init signed quad-word integer.  */
++  qword.l64 = 0xfdb9753102468aceLL;
++  qword.h64 = 0xeca8642013579bdfLL;
++}
++
++#include "abitest.h"
++#else
++  ARG (int, 1, W0, 0)
++  ARG (int, 2, W1, 1)
++  ARG (int, 3, W2, 2)
++  ARG (int, 4, W3, 3)
++  ARG (int, 5, W4, 4)
++  ARG (int, 6, W5, 5)
++  ARG (int, 7, W6, 6)
++  ARG (__int128, qword.i, STACK, LAST_NAMED_ARG_ID)
++  DOTS
++#ifndef __AAPCS64_BIG_ENDIAN__
++  LAST_ANON (int, 8, STACK + 16, 8)
++#else
++  LAST_ANON (int, 8, STACK + 20, 8)
++#endif
++#endif
+Index: gcc/testsuite/gcc.target/aarch64/madd_after_asm_1.c
+===================================================================
+--- gcc/testsuite/gcc.target/aarch64/madd_after_asm_1.c        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/aarch64/madd_after_asm_1.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,14 @@
++/* { dg-do assemble } */
++/* { dg-options "-O2 -mfix-cortex-a53-835769" } */
++
++int
++test (int a, double b, int c, int d, int e)
++{
++  double result;
++  __asm__ __volatile ("// %0, %1"
++                      : "=w" (result)
++                      : "0" (b)
++                      :    /* No clobbers */
++                      );
++  return c * d + e;
++}
+Index: gcc/testsuite/gcc.target/avr/torture/pr61443.c
+===================================================================
+--- gcc/testsuite/gcc.target/avr/torture/pr61443.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/avr/torture/pr61443.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -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/i386/pr61923.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr61923.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr61923.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,36 @@
++/* PR debug/61923 */
++/* { dg-do compile } */
++/* { dg-options "-O2 -fcompare-debug" } */
++
++typedef struct
++{
++  struct
++  {
++    struct
++    {
++      char head;
++    } tickets;
++  };
++} arch_spinlock_t;
++struct ext4_map_blocks
++{
++  int m_lblk;
++  int m_len;
++  int m_flags;
++};
++int ext4_da_map_blocks_ei_0;
++void fn1 (int p1, struct ext4_map_blocks *p2)
++{
++  int ret;
++  if (p2->m_flags)
++    {
++      ext4_da_map_blocks_ei_0++;
++      arch_spinlock_t *lock;
++      switch (sizeof *&lock->tickets.head)
++      case 1:
++      asm("" : "+m"(*&lock->tickets.head) : ""(0));
++      __asm__("");
++      ret = 0;
++    }
++  fn2 (p2->m_lblk, p2->m_len);
++}
+Index: gcc/testsuite/gcc.target/i386/pr61423.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr61423.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr61423.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,38 @@
++/* PR target/61423 */
++/* { dg-do run { target ia32 } } */
++/* { dg-options "-O1 -ftree-vectorize -msse2 -mfpmath=387 -mtune=core2" } */
++
++#define N 1024
++static unsigned int A[N];
++
++double
++__attribute__((noinline))
++func (void)
++{
++  unsigned int sum = 0;
++  unsigned i;
++  double t;
++
++  for (i = 0; i < N; i++)
++    sum += A[i];
++
++  t = sum;
++  return t;
++}
++
++int
++main ()
++{
++  unsigned i;
++  double d;
++
++  for(i = 0; i < N; i++)
++    A[i] = 1;
++
++  d = func();
++
++  if (d != 1024.0)
++    __builtin_abort ();
++
++  return 0;
++}
+Index: gcc/testsuite/gcc.target/i386/pr60901.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr60901.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr60901.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,17 @@
++/* { dg-options "-O -fselective-scheduling -fschedule-insns -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fno-tree-dominator-opts"  } */
++
++extern int n;
++extern void bar (void);
++extern int baz (int);
++
++void
++foo (void)
++{
++  int i, j;
++  for (j = 0; j < n; j++)
++    {
++      for (i = 1; i < j; i++)
++      bar ();
++      baz (0);
++    }
++}
+Index: gcc/testsuite/gcc.target/i386/pr61801.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr61801.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr61801.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,21 @@
++/* PR rtl-optimization/61801 */
++/* { dg-do compile } */
++/* { dg-options "-Os -fcompare-debug" } */
++
++int a, c;
++int bar (void);
++void baz (void);
++
++void
++foo (void)
++{
++  int d;
++  if (bar ())
++    {
++      int e;
++      baz ();
++      asm volatile ("" : "=a" (e) : "0" (a), "i" (0));
++      d = e;
++    }
++  c = d;
++}
+Index: gcc/testsuite/gcc.target/i386/pr61446.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr61446.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr61446.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -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/mips/pr62030-octeon.c
+===================================================================
+--- gcc/testsuite/gcc.target/mips/pr62030-octeon.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/mips/pr62030-octeon.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,50 @@
++/* { dg-do run } */
++/* { dg-options "-march=octeon" } */
++
++extern void abort (void);
++
++struct node
++{
++  struct node *next;
++  struct node *prev;
++};
++
++struct node node;
++
++struct head
++{
++  struct node *first;
++};
++
++struct head heads[5];
++
++int k = 2;
++
++struct head *head = &heads[2];
++
++static int __attribute__((noinline))
++foo (void)
++{
++  node.prev = (void *)head;
++  head->first = &node;
++
++  struct node *n = head->first;
++  struct head *h = &heads[k];
++  struct node *next = n->next;
++
++  if (n->prev == (void *)h)
++    h->first = next;
++  else
++    n->prev->next = next;
++
++  n->next = h->first;
++  return n->next == &node;
++}
++
++int
++main (void)
++{
++  if (foo ())
++    abort ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.target/sh/pr61996.c
+===================================================================
+--- gcc/testsuite/gcc.target/sh/pr61996.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/sh/pr61996.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,12 @@
++/* Check that the option -musermode has no effect on targets that do not
++   support user/privileged mode and that it does not interfere with option
++   -matomic-model=soft-imask.  */
++/* { dg-do compile }  */
++/* { dg-options "-matomic-model=soft-imask" }  */
++/* { dg-skip-if "" { "sh*-*-*" } { "*"} { "-m1*" "-m2*" } }  */
++
++int
++test (void)
++{
++  return 0;
++}
+Index: gcc/testsuite/lib/target-supports.exp
+===================================================================
+--- gcc/testsuite/lib/target-supports.exp      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/lib/target-supports.exp      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1790,6 +1790,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.
+@@ -5329,3 +5338,40 @@
+       return 0
+     }
+ }
++
++# Return 1 if <fenv.h> is available with all the standard IEEE
++# exceptions and floating-point exceptions are raised by arithmetic
++# operations.  (If the target requires special options for "inexact"
++# exceptions, those need to be specified in the testcases.)
++
++proc check_effective_target_fenv_exceptions {} {
++    return [check_runtime fenv_exceptions {
++      #include <fenv.h>
++      #include <stdlib.h>
++      #ifndef FE_DIVBYZERO
++      # error Missing FE_DIVBYZERO
++      #endif
++      #ifndef FE_INEXACT
++      # error Missing FE_INEXACT
++      #endif
++      #ifndef FE_INVALID
++      # error Missing FE_INVALID
++      #endif
++      #ifndef FE_OVERFLOW
++      # error Missing FE_OVERFLOW
++      #endif
++      #ifndef FE_UNDERFLOW
++      # error Missing FE_UNDERFLOW
++      #endif
++      volatile float a = 0.0f, r;
++      int
++      main (void)
++      {
++        r = a / a;
++        if (fetestexcept (FE_INVALID))
++          exit (0);
++        else
++          abort ();
++      }
++    } "-std=gnu99"]
++}
+Index: gcc/testsuite/gfortran.dg/default_format_denormal_2.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/default_format_denormal_2.f90    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gfortran.dg/default_format_denormal_2.f90    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,6 +1,6 @@
+ ! { dg-require-effective-target fortran_large_real }
+-! { dg-do run { xfail powerpc*-apple-darwin* powerpc*-*-linux* } }
+-! Test XFAILed on these platforms because the system's printf() lacks
++! { dg-do run { xfail powerpc*-apple-darwin* } }
++! Test XFAILed on this platform because the system's printf() lacks
+ ! proper support for denormalized long doubles. See PR24685
+ !
+ ! This tests that the default formats for formatted I/O of reals are
+Index: gcc/testsuite/gfortran.dg/dot_product_3.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/dot_product_3.f90        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/dot_product_3.f90        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,15 @@
++! { dg-do compile }
++! { dg-options "-fdump-tree-original" }
++! PR 61999 - this used to ICE.
++! Original test case by A. Kasahara
++program main
++   use, intrinsic:: iso_fortran_env, only: output_unit
++
++   implicit none
++
++   write(output_unit, *) dot_product([1, 2], [2.0, 3.0])
++
++   stop
++end program main
++! { dg-final { scan-tree-dump-times "8\\.0e\\+0" 1 "original" } }
++! { dg-final { cleanup-tree-dump "original" } }
+Index: gcc/testsuite/gfortran.dg/gomp/pr59488-1.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/gomp/pr59488-1.f90       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/gomp/pr59488-1.f90       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,13 @@
++! PR fortran/59488
++! { dg-do compile }
++! { dg-options "-fopenmp" }
++
++  implicit none
++  integer, parameter :: p(2) = (/ 11, 12 /)
++  integer :: r
++
++  !$omp parallel do default(none)
++  do r = 1, 2
++    print *, p(r)
++  end do
++end
+Index: gcc/testsuite/gfortran.dg/gomp/pr59488-2.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/gomp/pr59488-2.f90       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/gomp/pr59488-2.f90       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,16 @@
++! PR fortran/59488
++! { dg-do compile }
++! { dg-options "-fopenmp" }
++
++  implicit none
++  type t
++    integer :: s1, s2, s3
++  end type
++  integer :: r
++  type(t), parameter :: u = t(1, 2, 3)
++
++  !$omp parallel do default(none)
++  do r = 1, 2
++    print *, u
++  end do
++end
+Index: gcc/testsuite/gfortran.dg/cray_pointers_10.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/cray_pointers_10.f90     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/cray_pointers_10.f90     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -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/dependency_44.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/dependency_44.f90        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/dependency_44.f90        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,36 @@
++! { dg-do run }
++! Tests fix for PR61780 in which the loop reversal mechanism was
++! not accounting for the first index being an element so that no
++! loop in this dimension is created.
++!
++! Contributed by Manfred Tietze on clf.
++!
++program prgm3
++    implicit none
++    integer, parameter :: n = 10, k = 3
++    integer :: i, j
++    integer, dimension(n,n) :: y
++    integer :: res1(n), res2(n)
++
++1   format(10i5)
++
++!initialize
++    do i=1,n
++        do j=1,n
++            y(i,j) = n*i + j
++        end do
++    end do
++    res2 = y(k,:)
++
++!shift right
++    y(k,4:n) = y(k,3:n-1)
++    y(k,3) = 0
++    res1 = y(k,:)
++    y(k,:) = res2
++    y(k,n:4:-1) = y(k,n-1:3:-1)
++    y(k,3) = 0
++    res2 = y(k,:)
++!    print *, res1
++!    print *, res2
++    if (any(res1 /= res2)) call abort ()
++end program prgm3
+Index: gcc/testsuite/gfortran.dg/oldstyle_5.f
+===================================================================
+--- gcc/testsuite/gfortran.dg/oldstyle_5.f     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/oldstyle_5.f     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,8 @@
++C { dg-do compile }
++      TYPE T
++      INTEGER A(2)/1,2/ ! { dg-error "Invalid old style initialization for derived type component" }
++      END TYPE
++      TYPE S
++      INTEGER B/1/ ! { dg-error "Invalid old style initialization for derived type component" }
++      END TYPE
++      END
+Index: gcc/testsuite/gfortran.dg/nint_2.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/nint_2.f90       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gfortran.dg/nint_2.f90       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -4,7 +4,8 @@
+ ! http://gcc.gnu.org/ml/fortran/2005-04/msg00139.html
+ !
+ ! { dg-do run }
+-! { dg-xfail-run-if "PR 33271, math library bug" { powerpc-ibm-aix powerpc*-*-linux* *-*-mingw* } { "-O0" } { "" } }
++! { dg-xfail-run-if "PR 33271, math library bug" { powerpc-ibm-aix powerpc-*-linux* powerpc64-*-linux* *-*-mingw* } { "-O0" } { "" } }
++! Note that this doesn't fail on powerpc64le-*-linux*.
+   real(kind=8) :: a
+   integer(kind=8) :: i1, i2
+   real :: b
+Index: gcc/testsuite/gfortran.dg/pointer_intent_7.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/pointer_intent_7.f90     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gfortran.dg/pointer_intent_7.f90     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -23,7 +23,7 @@
+     call bar2 (c)
+     call bar3 (c)
+     call bar2p (b) ! { dg-error "INTENT\\(IN\\) in pointer association context \\(actual argument to INTENT = OUT/INOUT" }
+-    call bar3p (b) ! { dg-error "INTENT\\(IN\\) in pointer association context \\(actual argument to INTENT = OUT/INOUT" }
++    call bar3p (b) ! { dg-error "Actual argument to .n. at \\(1\\) must be polymorphic" }
+     call bar2p (c) ! { dg-error "INTENT\\(IN\\) in pointer association context \\(actual argument to INTENT = OUT/INOUT" }
+     call bar3p (c) ! { dg-error "INTENT\\(IN\\) in pointer association context \\(actual argument to INTENT = OUT/INOUT" }
+   end subroutine
+Index: gcc/testsuite/gfortran.dg/array_assignment_5.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/array_assignment_5.f90   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/array_assignment_5.f90   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,16 @@
++! { dg-do run }
++! { dg-options "-ffrontend-optimize" }
++! PR 62214 - this used to give the wrong result.
++! Original test case by Oliver Fuhrer
++PROGRAM test
++  IMPLICIT NONE
++  CHARACTER(LEN=20)   :: fullNames(2)
++  CHARACTER(LEN=255)  :: pathName
++  CHARACTER(LEN=5)    :: fileNames(2)
++  
++  pathName = "/dir1/dir2/"
++  fileNames = (/ "file1", "file2" /)
++  fullNames = SPREAD(TRIM(pathName),1,2) // fileNames
++  if (fullNames(1) /= '/dir1/dir2/file1' .or. &
++       & fullnames(2) /= '/dir1/dir2/file2') call abort
++END PROGRAM test
+Index: gcc/testsuite/gfortran.dg/pr45636.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/pr45636.f90      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gfortran.dg/pr45636.f90      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -10,5 +10,5 @@
+   b = y
+   call sub(a, b)
+ end program main
+-! { dg-final { scan-tree-dump-times "memset" 0 "forwprop2" { xfail { mips*-*-* && { ! nomips16 } } } } }
++! { dg-final { scan-tree-dump-times "memset" 0 "forwprop2" { xfail { { hppa*-*-* && { ! lp64 } } || { mips*-*-* && { ! nomips16 } } } } } }
+ ! { dg-final { cleanup-tree-dump "forwprop2" } }
+Index: gcc/testsuite/gfortran.dg/allocatable_function_8.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/allocatable_function_8.f90       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/allocatable_function_8.f90       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,47 @@
++! { dg-do run }
++! Test the fix for PR61459.
++!
++! Contributed by John Wingate  <johnww@tds.net>
++!
++module a
++
++   implicit none
++   private
++   public :: f_segfault, f_segfault_plus, f_workaround
++   integer, dimension(2,2) :: b = reshape([1,-1,1,1],[2,2])
++
++contains
++
++   function f_segfault(x)
++      real, dimension(:), allocatable :: f_segfault
++      real, dimension(:), intent(in)  :: x
++      allocate(f_segfault(2))
++      f_segfault = matmul(b,x)
++   end function f_segfault
++
++! Sefaulted without the ALLOCATE as well.
++   function f_segfault_plus(x)
++      real, dimension(:), allocatable :: f_segfault_plus
++      real, dimension(:), intent(in)  :: x
++      f_segfault_plus = matmul(b,x)
++   end function f_segfault_plus
++
++   function f_workaround(x)
++      real, dimension(:), allocatable :: f_workaround
++      real, dimension(:), intent(in)  :: x
++      real, dimension(:), allocatable :: tmp
++      allocate(f_workaround(2),tmp(2))
++      tmp = matmul(b,x)
++      f_workaround = tmp
++   end function f_workaround
++
++end module a
++
++program main
++   use a
++   implicit none
++   real, dimension(2) :: x = 1.0, y
++   y = f_workaround (x)
++   if (any (f_segfault (x) .ne. y)) call abort
++   if (any (f_segfault_plus (x) .ne. y)) call abort
++end program main
+Index: gcc/testsuite/gfortran.dg/bessel_7.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/bessel_7.f90     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gfortran.dg/bessel_7.f90     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -16,7 +16,7 @@
+ implicit none
+ real,parameter :: values(*) = [0.0, 0.5, 1.0, 0.9, 1.8,2.0,3.0,4.0,4.25,8.0,34.53, 475.78] 
+ real,parameter :: myeps(size(values)) = epsilon(0.0) &
+-                  * [2, 3, 4, 5, 8, 2, 12, 6, 7, 6, 36, 168 ]
++                  * [2, 3, 4, 5, 8, 2, 13, 6, 7, 6, 36, 168 ]
+ ! The following is sufficient for me - the values above are a bit
+ ! more tolerant
+ !                  * [0, 0, 0, 3, 3, 0, 9, 0, 2, 1, 22, 130 ]
+Index: gcc/testsuite/gcc.c-torture/execute/pr61306-1.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/pr61306-1.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/pr61306-1.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,39 @@
++#ifdef __INT32_TYPE__
++typedef __INT32_TYPE__ int32_t;
++#else
++typedef int int32_t;
++#endif
++
++#ifdef __UINT32_TYPE__
++typedef __UINT32_TYPE__ uint32_t;
++#else
++typedef unsigned uint32_t;
++#endif
++
++#define __fake_const_swab32(x) ((uint32_t)(                 \
++      (((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) |    \
++      (((uint32_t)(x) & (uint32_t)0x0000ff00UL) <<  8) |    \
++      (((uint32_t)(x) & (uint32_t)0x00ff0000UL) >>  8) |    \
++      (( (int32_t)(x) &  (int32_t)0xff000000UL) >> 24)))
++
++/* Previous version of bswap optimization failed to consider sign extension
++   and as a result would replace an expression *not* doing a bswap by a
++   bswap.  */
++
++__attribute__ ((noinline, noclone)) uint32_t
++fake_bswap32 (uint32_t in)
++{
++  return __fake_const_swab32 (in);
++}
++
++int
++main(void)
++{
++  if (sizeof (int32_t) * __CHAR_BIT__ != 32)
++    return 0;
++  if (sizeof (uint32_t) * __CHAR_BIT__ != 32)
++    return 0;
++  if (fake_bswap32 (0x87654321) != 0xffffff87)
++    __builtin_abort ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/pr23135.x
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/pr23135.x      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/pr23135.x      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,2 @@
++set additional_flags "-Wno-psabi"
++return 0
+Index: gcc/testsuite/gcc.c-torture/execute/bitfld-6.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/bitfld-6.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/bitfld-6.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,23 @@
++union U
++{
++  const int a;
++  unsigned b : 20;
++};
++
++static union U u = { 0x12345678 };
++
++/* Constant folding used to fail to account for endianness when folding a
++   union.  */
++
++int
++main (void)
++{
++#ifdef __BYTE_ORDER__
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
++  return u.b - 0x45678;
++#else
++  return u.b - 0x12345;
++#endif
++#endif
++  return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/pr61306-3.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/pr61306-3.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/pr61306-3.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,13 @@
++short a = -1;
++int b;
++char c;
++
++int
++main ()
++{
++  c = a;
++  b = a | c;
++  if (b != -1)
++    __builtin_abort ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/20050604-1.x
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/20050604-1.x   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.c-torture/execute/20050604-1.x   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -6,4 +6,5 @@
+       set additional_flags "-mno-mmx"
+ }
++set additional_flags "-Wno-psabi"
+ return 0
+Index: gcc/testsuite/gcc.c-torture/execute/pr61306-2.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/pr61306-2.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/pr61306-2.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,40 @@
++#ifdef __INT16_TYPE__
++typedef __INT16_TYPE__ int16_t;
++#else
++typedef short int16_t;
++#endif
++
++#ifdef __UINT32_TYPE__
++typedef __UINT32_TYPE__ uint32_t;
++#else
++typedef unsigned uint32_t;
++#endif
++
++#define __fake_const_swab32(x) ((uint32_t)(                         \
++      (((uint32_t)         (x) & (uint32_t)0x000000ffUL) << 24) |   \
++      (((uint32_t)(int16_t)(x) & (uint32_t)0x00ffff00UL) <<  8) |   \
++      (((uint32_t)         (x) & (uint32_t)0x00ff0000UL) >>  8) |   \
++      (((uint32_t)         (x) & (uint32_t)0xff000000UL) >> 24)))
++
++
++/* Previous version of bswap optimization failed to consider sign extension
++   and as a result would replace an expression *not* doing a bswap by a
++   bswap.  */
++
++__attribute__ ((noinline, noclone)) uint32_t
++fake_bswap32 (uint32_t in)
++{
++  return __fake_const_swab32 (in);
++}
++
++int
++main(void)
++{
++  if (sizeof (uint32_t) * __CHAR_BIT__ != 32)
++    return 0;
++  if (sizeof (int16_t) * __CHAR_BIT__ != 16)
++    return 0;
++  if (fake_bswap32 (0x81828384) != 0xff838281)
++    __builtin_abort ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/pr61375.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/pr61375.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/pr61375.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,35 @@
++#ifdef __UINT64_TYPE__
++typedef __UINT64_TYPE__ uint64_t;
++#else
++typedef unsigned long long uint64_t;
++#endif
++
++#ifndef __SIZEOF_INT128__
++#define __int128 long long
++#endif
++
++/* Some version of bswap optimization would ICE when analyzing a mask constant
++   too big for an HOST_WIDE_INT (PR61375).  */
++
++__attribute__ ((noinline, noclone)) uint64_t
++uint128_central_bitsi_ior (unsigned __int128 in1, uint64_t in2)
++{
++  __int128 mask = (__int128)0xffff << 56;
++  return ((in1 & mask) >> 56) | in2;
++}
++
++int
++main (int argc)
++{
++  __int128 in = 1;
++#ifdef __SIZEOF_INT128__
++  in <<= 64;
++#endif
++  if (sizeof (uint64_t) * __CHAR_BIT__ != 64)
++    return 0;
++  if (sizeof (unsigned __int128) * __CHAR_BIT__ != 128)
++    return 0;
++  if (uint128_central_bitsi_ior (in, 2) != 0x102)
++    __builtin_abort ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/20050316-1.x
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/20050316-1.x   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.c-torture/execute/20050316-1.x   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -4,4 +4,5 @@
+       return 1
+ }
++set additional_flags "-Wno-psabi"
+ return 0;
+Index: gcc/testsuite/gcc.c-torture/execute/20050316-3.x
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/20050316-3.x   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/20050316-3.x   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,2 @@
++set additional_flags "-Wno-psabi"
++return 0
+Index: gcc/testsuite/gcc.c-torture/compile/pr61684.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/compile/pr61684.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/compile/pr61684.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,15 @@
++/* PR tree-optimization/61684 */
++
++int a, c;
++static int *b = 0;
++short d;
++static short **e = 0;
++
++void
++foo ()
++{
++  for (; c < 1; c++)
++    ;
++  *e = &d;
++  a = d && (c && 1) & *b;
++}
+Index: gcc/testsuite/gcc.c-torture/compile/pr63282.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/compile/pr63282.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/compile/pr63282.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,13 @@
++/* PR inline-asm/63282 */
++
++void bar (void);
++
++void
++foo (void)
++{
++  asm volatile goto ("" : : : : a, b);
++a:
++  bar ();
++b:
++  return;
++}
+Index: gcc/testsuite/gnat.dg/opt41_pkg.adb
+===================================================================
+--- gcc/testsuite/gnat.dg/opt41_pkg.adb        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gnat.dg/opt41_pkg.adb        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,53 @@
++with Ada.Streams; use Ada.Streams;\r
++\r
++package body Opt41_Pkg is\r
++\r
++   type Wstream is new Root_Stream_Type with record\r
++      S : Unbounded_String;\r
++   end record;\r
++\r
++   procedure Read (Stream : in out Wstream;\r
++                   Item   : out Stream_Element_Array;\r
++                   Last   : out Stream_Element_Offset) is null;\r
++\r
++   procedure Write (Stream : in out Wstream; Item : Stream_Element_Array) is\r
++   begin\r
++      for J in Item'Range loop\r
++         Append (Stream.S, Character'Val (Item (J)));\r
++      end loop;\r
++   end Write;\r
++\r
++   function Rec_Write (R : Rec) return Unbounded_String is\r
++      S : aliased Wstream;\r
++   begin\r
++      Rec'Output (S'Access, R);\r
++      return S.S;\r
++   end Rec_Write;\r
++\r
++   type Rstream is new Root_Stream_Type with record\r
++      S   : String_Access;\r
++      Idx : Integer := 1;\r
++   end record;\r
++\r
++   procedure Write (Stream : in out Rstream; Item : Stream_Element_Array) is null;\r
++\r
++   procedure Read (Stream : in out Rstream;\r
++                   Item   : out Stream_Element_Array;\r
++                   Last   : out Stream_Element_Offset) is\r
++   begin\r
++      Last := Stream_Element_Offset'Min\r
++         (Item'Last, Item'First + Stream_Element_Offset (Stream.S'Last - Stream.Idx));\r
++      for I in Item'First .. Last loop\r
++         Item (I) := Stream_Element (Character'Pos (Stream.S (Stream.Idx)));\r
++         Stream.Idx := Stream.Idx + 1;\r
++      end loop;\r
++   end Read;\r
++\r
++   function Rec_Read (Str : String_Access) return Rec is\r
++      S : aliased Rstream;\r
++   begin\r
++      S.S := Str;\r
++      return Rec'Input (S'Access);\r
++   end Rec_Read;\r
++\r
++end Opt41_Pkg;\r
+Index: gcc/testsuite/gnat.dg/opt41_pkg.ads
+===================================================================
+--- gcc/testsuite/gnat.dg/opt41_pkg.ads        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gnat.dg/opt41_pkg.ads        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,28 @@
++with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;\r
++\r
++package Opt41_Pkg is\r
++\r
++   type Enum is (One, Two, Three, Four, Five, Six);\r
++\r
++   type Rec (D : Enum) is record\r
++      case D is\r
++         when One => \r
++            I : Integer;\r
++         when Two | Five | Six =>\r
++            S : Unbounded_String;\r
++            case D is\r
++               when Two => B : Boolean;\r
++               when others => null;\r
++            end case;\r
++         when others =>\r
++            null;\r
++      end case;\r
++   end record;\r
++\r
++   type Rec_Ptr is access all Rec;\r
++\r
++   function Rec_Write (R : Rec) return Unbounded_String;\r
++\r
++   function Rec_Read (Str : String_Access) return Rec;\r
++\r
++end Opt41_Pkg;\r
+Index: gcc/testsuite/gnat.dg/opt39.adb
+===================================================================
+--- gcc/testsuite/gnat.dg/opt39.adb    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gnat.dg/opt39.adb    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,31 @@
++-- { dg-do compile }
++-- { dg-options "-O2 -fno-inline -fdump-tree-optimized" }
++
++procedure Opt39 (I : Integer) is
++
++  type Rec is record
++    I1 : Integer;
++    I2 : Integer;
++    I3 : Integer;
++    I4 : Integer;
++    I5 : Integer;
++  end record;
++
++  procedure Set (A : access Rec; I : Integer) is
++    Tmp : Rec := A.all;
++  begin
++    Tmp.I1 := I;
++    A.all := Tmp;
++  end;
++
++  R : aliased Rec;
++
++begin
++  Set (R'Access, I);
++  if R.I1 /= I then
++    raise Program_Error;
++  end if;
++end;
++
++-- { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } }
++-- { dg-final { cleanup-tree-dump "optimized" } }
+Index: gcc/testsuite/gnat.dg/opt41.adb
+===================================================================
+--- gcc/testsuite/gnat.dg/opt41.adb    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gnat.dg/opt41.adb    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,15 @@
++-- { dg-do run }
++-- { dg-options "-Os" }
++
++with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
++with Opt41_Pkg;             use Opt41_Pkg;
++
++procedure Opt41 is
++   R  : Rec := (Five, To_Unbounded_String ("CONFIG"));
++   SP : String_Access := new String'(To_String (Rec_Write (R)));
++   RP : Rec_Ptr := new Rec'(Rec_Read (SP));
++begin
++   if RP.D /= R.D then
++      raise Program_Error;
++   end if;
++end;
+Index: gcc/testsuite/gnat.dg/overflow_fixed.adb
+===================================================================
+--- gcc/testsuite/gnat.dg/overflow_fixed.adb   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gnat.dg/overflow_fixed.adb   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,19 @@
++-- { dg-do run }
++-- { dg-options "-gnato -O" }
++
++procedure Overflow_Fixed is
++
++  type Unsigned_8_Bit is mod 2**8;
++
++  procedure Fixed_To_Eight (Value : Duration) is
++    Item : Unsigned_8_Bit;
++  begin
++    Item := Unsigned_8_Bit(Value);
++    raise Program_Error;
++  exception
++    when Constraint_Error => null; -- expected case
++  end;
++
++begin
++  Fixed_To_Eight (-0.5);
++end;
+Index: gcc/testsuite/gnat.dg/aliasing1.adb
+===================================================================
+--- gcc/testsuite/gnat.dg/aliasing1.adb        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gnat.dg/aliasing1.adb        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -18,5 +18,5 @@
+ end Aliasing1;
+--- { dg-final { scan-tree-dump-not "__gnat_rcheck" "optimized" } }
++-- { dg-final { scan-tree-dump-not "gnat_rcheck" "optimized" } }
+ -- { dg-final { cleanup-tree-dump "optimized" } }
+Index: gcc/testsuite/gcc.dg/pr60866.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr60866.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr60866.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,18 @@
++/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
++/* { dg-options "-O -fselective-scheduling -fno-if-conversion -fschedule-insns"  } */
++
++int n;
++
++void
++foo (int w, int **dnroot, int **dn)
++{
++  int *child;
++  int *xchild = xchild;
++  for (; w < n; w++)
++    if (!dnroot)
++      {
++      dnroot = dn;
++      for (child = *dn; child; child = xchild)
++        ;
++      }
++}
+Index: gcc/testsuite/gcc.dg/vmx/3c-01a.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vmx/3c-01a.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.dg/vmx/3c-01a.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,4 +1,5 @@
+ /* { dg-do compile } */
++/* { dg-options "-maltivec -mabi=altivec -std=gnu99 -mno-vsx -Wno-deprecated" } */
+ #include <altivec.h>
+ typedef const volatile unsigned int _1;
+ typedef const  unsigned int _2;
+Index: gcc/testsuite/gcc.dg/vmx/ops.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vmx/ops.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.dg/vmx/ops.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,4 +1,5 @@
+ /* { dg-do compile } */
++/* { dg-options "-maltivec -mabi=altivec -std=gnu99 -mno-vsx -Wno-deprecated" } */
+ #include <altivec.h>
+ #include <stdlib.h>
+ extern char * *var_char_ptr;
+Index: gcc/testsuite/gcc.dg/vmx/ops-long-1.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vmx/ops-long-1.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.dg/vmx/ops-long-1.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,4 +1,5 @@
+ /* { dg-do compile } */
++/* { dg-options "-maltivec -mabi=altivec -std=gnu99 -mno-vsx -Wno-deprecated" } */
+ /* Checks from the original ops.c that pass pointers to long or
+    unsigned long for operations that support that in released versions
+Index: gcc/testsuite/gcc.dg/pr63342.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr63342.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr63342.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,26 @@
++/* PR debug/63342 */
++/* { dg-do compile } */
++/* { dg-options "-g -O2" } */
++/* { dg-additional-options "-fpic" { target fpic } } */
++
++static __thread double u[9], v[9];
++
++void
++foo (double **p, double **q)
++{
++  *p = u;
++  *q = v;
++}
++
++double
++bar (double x)
++{
++  int i;
++  double s = 0.0;
++  for (i = 0; i < 9; i++)
++    {
++      double a = x + v[i];
++      s += u[i] * a * a;
++    }
++  return s;
++}
+Index: gcc/testsuite/gcc.dg/pr63284.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr63284.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr63284.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,42 @@
++/* PR debug/63284 */
++/* { dg-do compile } */
++/* { dg-options "-O2 -fcompare-debug" } */
++
++int a[10], *b, *d, c, f;
++int fn2 (void);
++void fn3 (void);
++void fn4 (int);
++
++static int
++fn1 (int x)
++{
++  int e = a[0];
++  if (e)
++    return 1;
++  if (b)
++    switch (x)
++      {
++      case 1:
++        if (d)
++          e = fn2 ();
++        else
++          fn3 ();
++        break;
++      case 0:
++        if (d)
++          {
++            fn3 ();
++            if (c)
++              fn4 (1);
++          }
++        else
++          fn4 (0);
++      }
++  return e;
++}
++
++void
++fn6 (void)
++{
++  f = fn1 (0);
++}
+Index: gcc/testsuite/gcc.dg/pr61045.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr61045.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr61045.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,12 @@
++/* { dg-do run } */
++/* { dg-options "-fstrict-overflow" } */
++
++int main ()
++{
++  int a = 0;
++  int b = __INT_MAX__;
++  int t = (a - 2) > (b - 1);
++  if (t != 0)
++    __builtin_abort();
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/pr52769.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr52769.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr52769.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,24 @@
++/* PR c/52769 */
++/* { dg-do run } */
++/* { dg-options "-O3" } */
++
++typedef struct
++{
++  int should_be_zero;
++  char s[6];
++  int x;
++} foo_t;
++
++int
++main (void)
++{
++  volatile foo_t foo = {
++    .s = "123456",
++    .x = 2
++  };
++
++  if (foo.should_be_zero != 0)
++    __builtin_abort ();
++
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/pr62004.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr62004.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr62004.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,47 @@
++/* { dg-do run } */
++/* { dg-options "-O2 -fno-tree-tail-merge" } */
++
++struct node
++{
++  struct node *next;
++  struct node *prev;
++};
++
++struct node node;
++
++struct head
++{
++  struct node *first;
++};
++
++struct head heads[5];
++
++int k = 2;
++
++struct head *head = &heads[2];
++
++int
++main ()
++{
++  struct node *p;
++
++  node.next = (void*)0;
++
++  node.prev = (void *)head;
++
++  head->first = &node;
++
++  struct node *n = head->first;
++
++  struct head *h = &heads[k];
++
++  heads[2].first = n->next;
++
++  if ((void*)n->prev == (void *)h)
++    p = h->first;
++  else
++    /* Dead tbaa-unsafe load from ((struct node *)&heads[2])->next.  */
++    p = n->prev->next;
++
++  return !(p == (void*)0);
++}
+Index: gcc/testsuite/gcc.dg/pr51879-18.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr51879-18.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.dg/pr51879-18.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -13,5 +13,5 @@
+     *q = foo ();
+ }
+-/* { dg-final { scan-tree-dump-times "foo \\(" 1 "pre"} } */
++/* { dg-final { scan-tree-dump-times "foo \\(" 1 "pre" { xfail *-*-* } } } */
+ /* { dg-final { cleanup-tree-dump "pre" } } */
+Index: gcc/testsuite/gcc.dg/torture/pr61964.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr61964.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr61964.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,33 @@
++/* { dg-do run } */
++
++extern void abort (void);
++
++struct node { struct node *next, *prev; } node;
++struct head { struct node *first; } heads[5];
++int k = 2;
++struct head *head = &heads[2];
++
++static int __attribute__((noinline))
++foo()
++{
++  node.prev = (void *)head;
++  head->first = &node;
++
++  struct node *n = head->first;
++  struct head *h = &heads[k];
++
++  if (n->prev == (void *)h)
++    h->first = n->next;
++  else
++    n->prev->next = n->next;
++
++  n->next = h->first;
++  return n->next == &node;
++}
++
++int main()
++{
++  if (foo ())
++    abort ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/torture/pr61010.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr61010.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr61010.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,8 @@
++/* { dg-do compile } */
++
++int main (void)
++{
++  int a = 0;
++  unsigned b = (a * 64 & 192) | 63U;
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/torture/pr61452.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr61452.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr61452.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -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
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr61383-1.c   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr61383-1.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,35 @@
++/* { dg-do run } */
++
++int a, b = 1, c, d, e, f, g;
++
++int
++fn1 ()
++{
++  int h;
++  for (;;)
++    {
++      g = b;
++      g = g ? 0 : 1 % g;
++      e = a + 1;
++      for (; d < 1; d = e)
++      {
++        if (f == 0)
++          h = 0;
++        else
++          h = 1 % f;
++        if (f < 1)
++          c = 0;
++        else if (h)
++          break;
++      }
++      if (b)
++      return 0;
++    }
++}
++
++int
++main ()
++{
++  fn1 ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/torture/float128-exact-underflow.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/float128-exact-underflow.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/float128-exact-underflow.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,41 @@
++/* Test that exact underflow in __float128 signals the underflow
++   exception if trapping is enabled, but does not raise the flag
++   otherwise.  */
++
++/* { dg-do run { target i?86-*-*gnu* x86_64-*-*gnu* } } */
++/* { dg-options "-D_GNU_SOURCE" } */
++/* { dg-require-effective-target fenv_exceptions } */
++
++#include <fenv.h>
++#include <setjmp.h>
++#include <signal.h>
++#include <stdlib.h>
++
++volatile sig_atomic_t caught_sigfpe;
++sigjmp_buf buf;
++
++static void
++handle_sigfpe (int sig)
++{
++  caught_sigfpe = 1;
++  siglongjmp (buf, 1);
++}
++
++int
++main (void)
++{
++  volatile __float128 a = 0x1p-16382q, b = 0x1p-2q;
++  volatile __float128 r;
++  r = a * b;
++  if (fetestexcept (FE_UNDERFLOW))
++    abort ();
++  if (r != 0x1p-16384q)
++    abort ();
++  feenableexcept (FE_UNDERFLOW);
++  signal (SIGFPE, handle_sigfpe);
++  if (sigsetjmp (buf, 1) == 0)
++    r = a * b;
++  if (!caught_sigfpe)
++    abort ();
++  exit (0);
++}
+Index: gcc/testsuite/gcc.dg/torture/vshuf-4.inc
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/vshuf-4.inc   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.dg/torture/vshuf-4.inc   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -23,7 +23,8 @@
+ T (20,        0, 4, 1, 5) \
+ T (21,        2, 6, 3, 7) \
+ T (22,        1, 2, 3, 0) \
+-T (23,        2, 1, 0, 3)
++T (23,        2, 1, 0, 3) \
++T (24,        2, 5, 6, 3)
+ #define EXPTESTS \
+ T (116,       1, 2, 4, 3) \
+ T (117,       7, 3, 3, 0) \
+@@ -31,7 +32,6 @@
+ T (119,       0, 3, 5, 6) \
+ T (120,       0, 0, 1, 5) \
+ T (121,       4, 6, 2, 1) \
+-T (122,       2, 5, 6, 3) \
+ T (123,       4, 6, 3, 2) \
+ T (124,       4, 7, 5, 6) \
+ T (125,       0, 4, 2, 4) \
+Index: gcc/testsuite/gcc.dg/stack-usage-2.c
+===================================================================
+--- gcc/testsuite/gcc.dg/stack-usage-2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/gcc.dg/stack-usage-2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,21 +1,21 @@
+ /* { dg-do compile } */
+ /* { dg-options "-Wstack-usage=512" } */
+-int foo1 (void)
++int foo1 (void)  /* { dg-bogus "stack usage" } */
+ {
+   char arr[16];
+   arr[0] = 1;
+   return 0;
+-} /* { dg-bogus "stack usage" } */
++}
+-int foo2 (void)
++int foo2 (void)  /* { dg-warning "stack usage is \[0-9\]* bytes" } */
+ {
+   char arr[1024];
+   arr[0] = 1;
+   return 0;
+-} /* { dg-warning "stack usage is \[0-9\]* bytes" } */
++}
+-int foo3 (void)
++int foo3 (void) /* { dg-warning "stack usage might be \[0-9\]* bytes" } */
+ {
+   char arr[1024] __attribute__((aligned (512)));
+   arr[0] = 1;
+@@ -22,12 +22,11 @@
+   /* Force dynamic realignment of argument pointer.  */
+   __builtin_apply ((void (*)()) foo2, 0, 0);
+   return 0;
++}
+-} /* { dg-warning "stack usage might be \[0-9\]* bytes" } */
+-
+-int foo4 (int n)
++int foo4 (int n) /* { dg-warning "stack usage might be unbounded" } */
+ {
+   char arr[n];
+   arr[0] = 1;
+   return 0;
+-} /* { dg-warning "stack usage might be unbounded" } */
++}
+Index: gcc/testsuite/gcc.dg/ipa/pr61986.c
+===================================================================
+--- gcc/testsuite/gcc.dg/ipa/pr61986.c (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/ipa/pr61986.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,48 @@
++/* { dg-do compile } */
++/* { dg-options "-O3" } */
++
++int a, b, c;
++
++struct S
++{
++  int f0;
++  int f1;
++} d;
++
++static int fn2 (struct S);
++void fn3 (struct S);
++
++void
++fn1 (struct S p)
++{
++  struct S h = { 0, 0 };
++  fn3 (p);
++  fn2 (h);
++}
++
++int
++fn2 (struct S p)
++{
++  struct S j = { 0, 0 };
++  fn3 (p);
++  fn2 (j);
++  return 0;
++}
++
++void
++fn3 (struct S p)
++{
++  for (; b; a++)
++    c = p.f0;
++  fn1 (d);
++}
++
++void
++fn4 ()
++{
++  for (;;)
++    {
++      struct S f = { 0, 0 };
++      fn1 (f);
++    }
++}
+Index: gcc/testsuite/gcc.dg/pr62030.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr62030.c     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr62030.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,50 @@
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++
++extern void abort (void);
++
++struct node
++{
++  struct node *next;
++  struct node *prev;
++};
++
++struct node node;
++
++struct head
++{
++  struct node *first;
++};
++
++struct head heads[5];
++
++int k = 2;
++
++struct head *head = &heads[2];
++
++static int __attribute__((noinline))
++foo (void)
++{
++  node.prev = (void *)head;
++  head->first = &node;
++
++  struct node *n = head->first;
++  struct head *h = &heads[k];
++  struct node *next = n->next;
++
++  if (n->prev == (void *)h)
++    h->first = next;
++  else
++    n->prev->next = next;
++
++  n->next = h->first;
++  return n->next == &node;
++}
++
++int
++main (void)
++{
++  if (foo ())
++    abort ();
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/vect/pr63341-2.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/pr63341-2.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr63341-2.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,35 @@
++/* PR tree-optimization/63341 */
++/* { dg-do run } */
++
++#include "tree-vect.h"
++
++typedef union U { unsigned short s; unsigned char c; } __attribute__((packed)) U;
++struct S { char e __attribute__((aligned (64))); U s[32]; };
++struct S t = {0, {{0x5010}, {0x5111}, {0x5212}, {0x5313}, {0x5414}, {0x5515}, {0x5616}, {0x5717},
++                {0x5818}, {0x5919}, {0x5a1a}, {0x5b1b}, {0x5c1c}, {0x5d1d}, {0x5e1e}, {0x5f1f},
++                {0x6020}, {0x6121}, {0x6222}, {0x6323}, {0x6424}, {0x6525}, {0x6626}, {0x6727},
++                {0x6828}, {0x6929}, {0x6a2a}, {0x6b2b}, {0x6c2c}, {0x6d2d}, {0x6e2e}, {0x6f2f}}};
++unsigned short d[32] = { 1 };
++
++__attribute__((noinline, noclone)) void
++foo ()
++{
++  int i;
++  for (i = 0; i < 32; i++)
++    d[i] = t.s[i].s + 4;
++  for (i = 0; i < 32; i++)
++    if (d[i] != t.s[i].s + 4)
++      abort ();
++    else
++      asm volatile ("" : : : "memory");
++}
++
++int
++main ()
++{
++  check_vect ();
++  foo ();
++  return 0;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+Index: gcc/testsuite/gcc.dg/vect/pr63189.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/pr63189.c        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr63189.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,26 @@
++/* PR tree-optimization/63189 */
++/* { dg-do run } */
++
++#include "tree-vect.h"
++
++short int d[16] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 };
++
++__attribute__((noinline, noclone)) void
++foo (void)
++{
++  int j, s = 0;
++  for (j = 0; j < 8; j++)
++    s += d[j] * j;
++  if (s != 7)
++    abort ();
++}
++
++int
++main ()
++{
++  check_vect ();
++  foo ();
++  return 0;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+Index: gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16c.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16c.c    (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16c.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,73 @@
++/* { dg-require-effective-target vect_int } */
++
++#include <stdarg.h>
++#include "tree-vect.h"
++
++#define N 64
++#define DOT 43680
++
++signed short X[N] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
++signed int   Y[N] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
++
++/* (short, int)->int->int dot product.
++   Not detected as a dot-product pattern.  */
++
++__attribute__ ((noinline)) int
++foo (int len)
++{
++  int i;
++  int result = 0;
++
++  for (i = 0; i < len; i++)
++    {
++      result += (X[i] * Y[i]);
++    }
++  return result;
++}
++
++
++/* (int, short)->int->int dot product.
++   Not detected as a dot-product pattern.  */
++
++__attribute__ ((noinline)) int
++bar (int len)
++{
++  int i;
++  int result = 0;
++
++  for (i = 0; i < len; i++)
++    {
++      result += (Y[i] * X[i]);
++    }
++  return result;
++}
++
++int
++main (void)
++{
++  int i;
++  int dot;
++
++  check_vect ();
++
++  for (i = 0; i < N; i++)
++    {
++      X[i] = i;
++      Y[i] = N - i;
++      __asm__ volatile ("");
++    }
++
++  dot = foo (N);
++  if (dot != DOT)
++    abort ();
++
++  dot = bar (N);
++  if (dot != DOT)
++    abort ();
++
++  return 0;
++}
++
++/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { target vect_unpack } } } */
++/* { dg-final { cleanup-tree-dump "vect" } } */
++
+Index: gcc/testsuite/gcc.dg/vect/pr62073.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/pr62073.c        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr62073.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,40 @@
++/* { dg-do compile } */
++/* { dg-additional-options "-O1" } */
++
++struct S0
++{
++  int f7;
++};
++struct S0 g_50;
++int g_70;
++int g_76;
++
++int foo (long long p_56, int * p_57)
++{
++  int *l_77;
++  int l_101;
++
++  for (; g_70;)
++    {
++      int **l_78 = &l_77;
++      if (g_50.f7)
++      continue;
++      *l_78 = 0;
++    }
++  for (g_76 = 1; g_76 >= 0; g_76--)
++    {
++      int *l_90;
++      for (l_101 = 4; l_101 >= 0; l_101--)
++      if (l_101)
++        *l_90 = 0;
++      else
++        {
++          int **l_113 = &l_77;
++          *l_113 = p_57;
++        }
++    }
++
++  return *l_77;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+Index: gcc/testsuite/gcc.dg/vect/pr60196-1.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/pr60196-1.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr60196-1.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,34 @@
++/* PR tree-optimization/63189 */
++/* { dg-additional-options "-fwrapv" } */
++/* { dg-do run } */
++
++#include "tree-vect.h"
++
++__attribute__((noinline, noclone)) static int
++bar (const short *a, int len)
++{
++  int x;
++  int x1 = 0;
++
++  for (x = 0; x < len; x++)
++    x1 += x * a[x];
++  return x1;
++}
++
++__attribute__((noinline, noclone)) void
++foo (void)
++{
++  short stuff[9] = {1, 1, 1, 1, 1, 1, 1, 1, 1 };
++  if (bar (stuff, 9) != 36)
++    abort ();
++}
++
++int
++main ()
++{
++  check_vect ();
++  foo ();
++  return 0;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+Index: gcc/testsuite/gcc.dg/vect/pr62075.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/pr62075.c        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr62075.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,22 @@
++/* { dg-do compile } */
++
++int a[16][2];
++struct A
++{
++  int b[16][2];
++  int c[16][1];
++};
++
++void
++foo (struct A *x)
++{
++  int i;
++  for (i = 0; i < 16; ++i)
++    {
++      x->b[i][0] = a[i][0];
++      x->c[i][0] = 0 != a[i][0];
++      x->b[i][1] = a[i][1];
++    }
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+Index: gcc/testsuite/gcc.dg/vect/pr60196-2.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/pr60196-2.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr60196-2.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,33 @@
++/* PR tree-optimization/63189 */
++/* { dg-do run } */
++
++#include "tree-vect.h"
++
++static const short a[8] = {1, 1, 1, 1, 1, 1, 1, 1 };
++static const unsigned char b[8] = {0, 0, 0, 0, 0, 0, 0, 0 };
++
++__attribute__((noinline, noclone)) static int
++bar (void)
++{
++  int sum = 0, i;
++  for (i = 0; i < 8; ++i)
++    sum += a[i] * b[i];
++  return sum;
++}
++
++__attribute__((noinline, noclone)) void
++foo (void)
++{
++  if (bar () != 0)
++    abort ();
++}
++
++int
++main ()
++{
++  check_vect ();
++  foo ();
++  return 0;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+Index: gcc/testsuite/gcc.dg/vect/pr63341-1.c
+===================================================================
+--- gcc/testsuite/gcc.dg/vect/pr63341-1.c      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/vect/pr63341-1.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,32 @@
++/* PR tree-optimization/63341 */
++/* { dg-do run } */
++
++#include "tree-vect.h"
++
++typedef union U { unsigned short s; unsigned char c; } __attribute__((packed)) U;
++struct S { char e __attribute__((aligned (64))); U s[32]; };
++struct S t = {0, {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8},
++                {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16},
++                {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24},
++                {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32}}};
++unsigned short d[32] = { 1 };
++
++__attribute__((noinline, noclone)) void
++foo ()
++{
++  int i;
++  for (i = 0; i < 32; i++)
++    d[i] = t.s[i].s;
++  if (__builtin_memcmp (d, t.s, sizeof d))
++    abort ();
++}
++
++int
++main ()
++{
++  check_vect ();
++  foo ();
++  return 0;
++}
++
++/* { dg-final { cleanup-tree-dump "vect" } } */
+Index: gcc/testsuite/ChangeLog
+===================================================================
+--- gcc/testsuite/ChangeLog    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/ChangeLog    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,433 @@
++2014-11-03  Marek Polacek  <polacek@redhat.com>
++
++      PR c/52769
++      * gcc.dg/pr52769.c: New test.
++
++2014-10-29  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
++
++      * gcc.target/aarch64/madd_after_asm_1.c: New test.
++
++2014-10-15  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * gnat.dg/opt41.adb: New test.
++      * gnat.dg/opt41_pkg.ad[sb]: New helper.
++
++2014-10-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      Backport from mainline r215880
++      2014-10-03  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      * g++.dg/ext/altivec-2.C: Compile with -Wno-deprecated to avoid
++      failing with the new warning message.
++      * gcc.dg/vmx/3c-01a.c: Likewise.
++      * gcc.dg/vmx/ops-long-1.c: Likewise.
++      * gcc.dg/vmx/ops.c: Likewise.
++      * gcc.target/powerpc/altivec-20.c: Likewise.
++      * gcc.target/powerpc/altivec-6.c: Likewise.
++      * gcc.target/powerpc/altivec-vec-merge.c: Likewise.
++      * gcc.target/powerpc/vsx-builtin-8.c: Likewise.
++      * gcc.target/powerpc/warn-lvsl-lvsr.c: New test.
++
++      Backport from mainline r215882
++      2014-10-03  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      * gcc.target/powerpc/lvsl-lvsr.c: New test.
++
++      Backport from mainline r216017
++      2014-10-08  Pat Haugen  <pthaugen@us.ibm.com>
++
++      * gcc.dg/vmx/3c-01a.c: Add default options from vmx.exp.
++      * gcc.dg/vmx/ops.c: Likewise.
++      * gcc.dg/vmx/ops-long-1.c: Likewise.
++
++2014-10-10  Jakub Jelinek  <jakub@redhat.com>
++
++      PR fortran/59488
++      * gfortran.dg/gomp/pr59488-1.f90: New test.
++      * gfortran.dg/gomp/pr59488-2.f90: New test.
++
++2014-10-01  Jakub Jelinek  <jakub@redhat.com>
++
++      PR debug/63342
++      * gcc.dg/pr63342.c: New test.
++
++      PR target/63428
++      * gcc.dg/torture/vshuf-4.inc: Move test 122 from EXPTESTS
++      to test 24 in TESTS.
++
++2014-10-01  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2013-11-07  Joseph Myers  <joseph@codesourcery.com>
++
++      * lib/target-supports.exp
++      (check_effective_target_fenv_exceptions): New function.
++
++2014-09-30  Jakub Jelinek  <jakub@redhat.com>
++
++      PR inline-asm/63282
++      * gcc.c-torture/compile/pr63282.c: New test.
++
++2014-09-26  Jakub Jelinek  <jakub@redhat.com>
++
++      * g++.dg/compat/struct-layout-1_generate.c: Add -Wno-abi
++      to default options.
++
++2014-09-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      Backport from mainline r215559
++      2014-09-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      PR target/63335
++      * gcc.target/powerpc/pr63335.c: New test.
++
++2014-09-25  Jakub Jelinek  <jakub@redhat.com>
++
++      PR tree-optimization/63341
++      * gcc.dg/vect/pr63341-1.c: New test.
++      * gcc.dg/vect/pr63341-2.c: New test.
++
++2014-09-18  Joseph Myers  <joseph@codesourcery.com>
++
++      * gcc.dg/torture/float128-exact-underflow.c: New test.
++
++2014-09-17  Jakub Jelinek  <jakub@redhat.com>
++
++      PR debug/63284
++      * gcc.dg/pr63284.c: New test.
++
++2014-09-09  Richard Biener  <rguenther@suse.de>
++
++      Backport from mainline
++      2014-06-11  Richard Biener  <rguenther@suse.de>
++
++      PR tree-optimization/61452
++      * gcc.dg/torture/pr61452.c: New testcase.
++
++2014-09-09  Richard Biener  <rguenther@suse.de>
++
++      Backport from mainline
++      2014-05-05  Richard Biener  <rguenther@suse.de>
++
++      PR middle-end/61010
++      * gcc.dg/torture/pr61010.c: New testcase.
++
++      2014-05-28  Richard Biener  <rguenther@suse.de>
++
++      PR middle-end/61045
++      * gcc.dg/pr61045.c: New testcase.
++
++      2014-08-11  Richard Biener  <rguenther@suse.de>
++
++      PR tree-optimization/62075
++      * gcc.dg/vect/pr62075.c: New testcase.
++
++2014-09-08  Jakub Jelinek  <jakub@redhat.com>
++
++      PR tree-optimization/60196
++      PR tree-optimization/63189
++      * gcc.dg/vect/pr63189.c: New test.
++      * gcc.dg/vect/pr60196-1.c: New test.
++      * gcc.dg/vect/pr60196-2.c: New test.
++
++      Backported from mainline
++      2013-09-17  Cong Hou  <congh@google.com>
++
++      * gcc.dg/vect/vect-reduc-dot-s16c.c: Add a test case with dot product 
++      on two arrays with short and int types. This should not be recognized
++      as a dot product pattern.
++
++2014-09-08  Jakub Jelinek  <jakub@redhat.com>
++
++      Backported from mainline
++      2014-08-06  Vladimir Makarov  <vmakarov@redhat.com>
++
++      PR debug/61923
++      * gcc.target/i386/pr61923.c: New test.
++
++2014-09-06  John David Anglin  <danglin@gcc.gnu.org>
++
++      PR testsuite/56194
++      * g++.dg/init/const9.C: Skip scan-assembler-not "rodata" on hppa*-*-*.
++
++2014-09-03  Marek Polacek  <polacek@redhat.com>
++
++      Backport from mainline
++      2014-09-02  Marek Polacek  <polacek@redhat.com>
++
++      PR fortran/62270
++      * gfortran.dg/pointer_intent_7.f90: Adjust dg-error.
++
++2014-09-03  Martin Jambor  <mjambor@suse.cz>
++
++      PR ipa/62015
++      * g++.dg/ipa/pr62015.C: New test.
++
++2014-09-03  Martin Jambor  <mjambor@suse.cz>
++
++      PR ipa/61986
++      * gcc.dg/ipa/pr61986.c: New test.
++
++2014-08-26  Dominik Vogt  <vogt@linux.vnet.ibm.com>
++
++      * gfortran.dg/bessel_7.f90: Bump allowed precision to avoid
++      failure on s390*-*-linux-gnu.
++
++2014-08-24  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      Backport from mainline
++      2014-08-24  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      PR target/61996
++      * gcc.target/sh/pr61996.c: New.
++
++2014-08-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
++
++      Backport from trunk
++      PR fortran/62214
++      * gfortran.dg/array_assignment_5.f90:  New test.
++
++2014-08-15  Tom de Vries  <tom@codesourcery.com>
++
++      Backport from mainline:
++      2014-08-14  Tom de Vries  <tom@codesourcery.com>
++
++      PR rtl-optimization/62004
++      PR rtl-optimization/62030
++      * gcc.dg/pr62004.c: New test.
++      * gcc.dg/pr62030.c: Same.
++      * gcc.target/mips/pr62030-octeon.c: Same.
++
++2014-08-13  Felix Yang  <fei.yang0953@gmail.com>
++
++      PR tree-optimization/62073
++      * gcc.dg/vect/pr62073.c: New test.
++
++2014-08-13  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      Backport from mainline
++      2014-08-12  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      PR middle-end/62103
++      * gcc.c-torture/execute/bitfld-6.c: New test.
++
++2014-08-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
++
++      Backport from trunk
++      PR fortran/61999
++      * gfortran.dg/dot_product_3.f90:  New test case.
++
++2014-08-07  John David Anglin  <danglin@gcc.gnu.org>
++
++      PR tree-optimization/60707
++      * gfortran.dg/pr45636.f90: xfail on 32-bit hppa*-*-*.
++
++2014-08-06  Jakub Jelinek  <jakub@redhat.com>
++
++      PR rtl-optimization/61801
++      * gcc.target/i386/pr61801.c: Rewritten.
++
++2014-08-01  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      Backport from mainline
++      2014-06-13  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      PR tree-optimization/61375
++      * gcc.c-torture/execute/pr61375-1.c: New test.
++
++2014-08-01  Richard Biener  <rguenther@suse.de>
++
++      PR tree-optimization/61964
++      * gcc.dg/torture/pr61964.c: New testcase.
++      * gcc.dg/pr51879-18.c: XFAIL.
++
++2014-07-28  Richard Biener  <rguenther@suse.de>
++
++      PR rtl-optimization/61801
++      * gcc.target/i386/pr61801.c: Fix testcase.
++
++2014-07-28  Richard Biener  <rguenther@suse.de>
++
++      PR rtl-optimization/61801
++      * gcc.target/i386/pr61801.c: New testcase.
++
++2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      Backport from mainline:
++      2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      * gcc.target/powerpc/ppc64-abi-warn-3.c: New test.
++
++      * gcc.c-torture/execute/20050316-1.x: Add -Wno-psabi.
++      * gcc.c-torture/execute/20050604-1.x: Add -Wno-psabi.
++      * gcc.c-torture/execute/20050316-3.x: New file.  Add -Wno-psabi.
++      * gcc.c-torture/execute/pr23135.x: Likewise.
++
++2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      Backport from mainline:
++      2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      * gcc.target/powerpc/ppc64-abi-warn-2.c: New test.
++
++2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      Backport from mainline:
++      2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      * gcc.target/powerpc/ppc64-abi-warn-1.c: New test.
++
++2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      Backport from mainline:
++      2014-07-24  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
++
++      * g++.dg/compat/struct-layout-1.exp: Load g++-dg.exp.
++
++2014-07-19  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * gcc.dg/stack-usage-2.c: Adjust.
++
++2014-07-19  Paul Thomas  <pault@gcc.gnu.org>
++
++      Backport from trunk.
++      PR fortran/61780
++      * gfortran.dg/dependency_44.f90 : New test
++
++2014-07-10  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * gnat.dg/opt39.adb: New test.
++
++2014-07-08  Paul Thomas  <pault@gcc.gnu.org>
++
++      PR fortran/61459
++      PR fortran/58883
++      * gfortran.dg/allocatable_function_8.f90 : New test
++
++2014-07-04  Jakub Jelinek  <jakub@redhat.com>
++
++      PR tree-optimization/61684
++      * gcc.c-torture/compile/pr61684.c: New test.
++
++2014-07-02  Jakub Jelinek  <jakub@redhat.com>
++          Fritz Reese  <Reese-Fritz@zai.com>
++
++      * gfortran.dg/oldstyle_5.f: New test.
++
++2014-06-30  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      Backport from mainline
++      2014-06-11  Thomas Preud'homme  <thomas.preudhomme@arm.com>
++
++      PR tree-optimization/61306
++      * gcc.c-torture/execute/pr61306-1.c: New test.
++      * gcc.c-torture/execute/pr61306-2.c: Likewise.
++      * gcc.c-torture/execute/pr61306-3.c: Likewise.
++
++2014-06-27  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      * gfortran.dg/nint_2.f90: Don't XFAIL for powerpc64le-*-linux*.
++
++2014-06-27  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2014-06-26  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/61586
++      * gcc.target/alpha/pr61586.c: New test.
++
++2014-06-25  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      * gfortran.dg/default_format_denormal_2.f90:  Remove xfail for
++      powerpc*-*-linux*.
++
++2014-06-18  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport 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.
++
++      Backport from mainline
++      2014-06-06  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/61423
++      * gcc.target/i386/pr61423.c: New test.
++
++2014-06-17  Yufeng Zhang  <yufeng.zhang@arm.com>
++
++      Backport from mainline
++
++      PR target/61483
++      * gcc.target/aarch64/aapcs64/type-def.h (struct hfa_fx2_t): New type.
++      * gcc.target/aarch64/aapcs64/va_arg-13.c: New test.
++      * gcc.target/aarch64/aapcs64/va_arg-14.c: Ditto.
++      * gcc.target/aarch64/aapcs64/va_arg-15.c: Ditto.
++
++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-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-04  Richard Biener  <rguenther@suse.de>
++
++      PR tree-optimization/61383
++      * gcc.dg/torture/pr61383-1.c: New testcase.
++
++2014-06-03  Andrey Belevantsev  <abel@ispras.ru>
++
++      Backport from mainline
++      2014-05-14  Andrey Belevantsev  <abel@ispras.ru>
++
++      PR rtl-optimization/60866
++      * gcc.dg/pr60866.c: New test.
++
++2014-06-03  Andrey Belevantsev  <abel@ispras.ru>
++
++      Backport from mainline
++      2014-05-14  Andrey Belevantsev  <abel@ispras.ru>
++
++      PR rtl-optimization/60901
++      * gcc.target/i386/pr60901.c: New test.
++
++2014-05-28  Eric Botcazou  <ebotcazou@adacore.com>
++
++      Backport from mainline
++      2014-05-27  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * gnat.dg/overflow_fixed.adb: New test.
++
++2014-05-27  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * gnat.dg/aliasing1.adb (dg-final): Robustify pattern matching.
++
++2014-05-22  Peter Bergner  <bergner@vnet.ibm.com>
++
++      Backport from mainline
++      2014-05-22  Peter Bergner  <bergner@vnet.ibm.com>
++
++      * gcc.target/powerpc/htm-ttest.c: New test.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: gcc/testsuite/g++.dg/rtti/dyncast7.C
+===================================================================
+--- gcc/testsuite/g++.dg/rtti/dyncast7.C       (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/rtti/dyncast7.C       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,28 @@
++// I think this dynamic_cast has undefined behavior when destroying E::o
++// because we're the F period of destruction has started and ap doesn't
++// point to the object currently being destroyed--but the reasonable
++// options are success or failure, not SEGV.
++
++// { dg-do run }
++
++extern "C" void abort();
++
++struct A { virtual ~A(); };
++struct B { virtual ~B() { } };
++struct C : B, A { };
++struct E : virtual B { A o; };
++struct F : virtual C, virtual E { };
++
++A* ap;
++C* cp;
++
++A::~A() {
++  C* cp2 = dynamic_cast<C*>(ap);
++  if (cp2 != cp && cp2 != 0)
++    abort();
++}
++
++int main() {
++  F f;
++  ap = cp = &f;
++}
+Index: gcc/testsuite/g++.dg/ext/altivec-2.C
+===================================================================
+--- gcc/testsuite/g++.dg/ext/altivec-2.C       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/g++.dg/ext/altivec-2.C       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,6 +1,6 @@
+ /* { dg-do compile { target powerpc*-*-* } } */
+ /* { dg-require-effective-target powerpc_altivec_ok } */
+-/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable" } */
++/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable -Wno-deprecated" } */
+ /* This test checks if AltiVec builtins accept const-qualified
+    arguments.  */
+Index: gcc/testsuite/g++.dg/ext/stmtexpr16.C
+===================================================================
+--- gcc/testsuite/g++.dg/ext/stmtexpr16.C      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/ext/stmtexpr16.C      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,10 @@
++// PR c++/63455
++// { dg-options "-std=gnu++11" }
++
++int main()
++{
++    int x = 0;
++
++    // without '+0', gcc 4.6 gives a different error (no ICE though)
++    decltype(({ int y = x; y; })+0) v1 = 0;
++}
+Index: gcc/testsuite/g++.dg/expr/cond12.C
+===================================================================
+--- gcc/testsuite/g++.dg/expr/cond12.C (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/expr/cond12.C (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,12 @@
++// PR c++/58714
++// { dg-do run }
++
++struct X {
++    X& operator=(const X&){}
++    X& operator=(X&){__builtin_abort();}
++};
++
++int main(int argv,char**) {
++  X a, b;
++  ((argv > 2) ? a : b) = X();
++}
+Index: gcc/testsuite/g++.dg/init/const9.C
+===================================================================
+--- gcc/testsuite/g++.dg/init/const9.C (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/g++.dg/init/const9.C (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,5 +1,5 @@
+ // PR c++/55893
+-// { dg-final { scan-assembler-not "rodata" } }
++// { dg-final { scan-assembler-not "rodata" { target { ! hppa*-*-* } } } }
+ struct foo
+ {
+Index: gcc/testsuite/g++.dg/tls/thread_local10.C
+===================================================================
+--- gcc/testsuite/g++.dg/tls/thread_local10.C  (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/tls/thread_local10.C  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,23 @@
++// PR c++/58624
++
++// { dg-do run { target c++11 } }
++// { dg-add-options tls }
++// { dg-require-effective-target tls_runtime }
++
++int i;
++
++template <typename> struct A
++{
++  static thread_local int s;
++
++  A () { i = s; }
++};
++
++int f() { return 42; }
++template <typename T> thread_local int A<T>::s = f();
++
++int main () {
++  A<void> a;
++  if (i != 42)
++    __builtin_abort();
++}
+Index: gcc/testsuite/g++.dg/parse/typename7.C
+===================================================================
+--- gcc/testsuite/g++.dg/parse/typename7.C     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/g++.dg/parse/typename7.C     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -7,10 +7,9 @@
+ struct A
+ {
+-  template<typename>   void foo(int); // { dg-message "note" }
+-  template<typename T> void bar(T t) { // { dg-message "note" }
++  template<typename>   void foo(int);
++  template<typename T> void bar(T t) {
+     this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+-  // { dg-message "candidate" "candidate note" { target *-*-* } 12 }
+   template<typename T> void bad(T t) {
+     foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+ };
+@@ -20,7 +19,6 @@
+ {
+   void bar(T t) {
+     A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" }
+-  // { dg-message "candidate" "candidate note" { target *-*-* } 22 }
+   void bad(T t) {
+     B<typename T>::bar(t); } // { dg-error "invalid|not a template" }
+ };
+Index: gcc/testsuite/g++.dg/parse/parameter-declaration-2.C
+===================================================================
+--- gcc/testsuite/g++.dg/parse/parameter-declaration-2.C       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/g++.dg/parse/parameter-declaration-2.C       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,2 +1,2 @@
+-void f (int i, int p[i]); // { dg-error "use of parameter .i. outside function body" }
++void f (int i, int p[i]); // { dg-error "use of parameter.*outside function body" }
+ // { dg-prune-output "array bound" }
+Index: gcc/testsuite/g++.dg/parse/ambig7.C
+===================================================================
+--- gcc/testsuite/g++.dg/parse/ambig7.C        (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/parse/ambig7.C        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,16 @@
++// PR c++/60361
++
++struct Helper
++{
++  Helper(int a, void (*pfunc)());
++};
++
++template <int I> void function();
++
++const int A = 1;
++const int B = 2;
++
++Helper testOk(A, function<A>);
++Helper testOk2(int(A), function<B>);
++Helper testOk3((int(A)), function<A>);
++Helper testFail(int(A), function<A>);
+Index: gcc/testsuite/g++.dg/compat/struct-layout-1.exp
+===================================================================
+--- gcc/testsuite/g++.dg/compat/struct-layout-1.exp    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/g++.dg/compat/struct-layout-1.exp    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -89,6 +89,9 @@
+ # This must be done after the compat-use-*-compiler definitions.
+ load_lib compat.exp
++# Provide the g++-dg-prune routine (gcc-dp.exp is loaded by compat.exp)
++load_lib g++-dg.exp
++
+ g++_init
+ # Save variables for the C++ compiler under test, which each test will
+Index: gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c
+===================================================================
+--- gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,5 +1,5 @@
+ /* Structure layout test generator.
+-   Copyright (C) 2004, 2005, 2007, 2008, 2009, 2011, 2012
++   Copyright (C) 2004-2014
+    Free Software Foundation, Inc.
+    Contributed by Jakub Jelinek <jakub@redhat.com>.
+@@ -44,7 +44,7 @@
+ #endif
+ const char *dg_options[] = {
+-"/* { dg-options \"%s-I%s\" } */\n",
++"/* { dg-options \"%s-I%s -Wno-abi\" } */\n",
+ "/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n",
+ "/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n",
+ "/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* i?86-*-mingw32* x86_64-*-mingw32* i?86-*-cygwin* } } */\n",
+Index: gcc/testsuite/g++.dg/cpp0x/constexpr-empty7.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/constexpr-empty7.C      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/constexpr-empty7.C      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,28 @@
++// PR c++/61959
++// { dg-do compile { target c++11 } }
++
++template <class Coord> struct BasePoint
++{
++  Coord x, y;
++  constexpr BasePoint (Coord, Coord) : x (0), y (0) {}
++};
++template <class T> struct BaseCoord
++{
++  int value;
++  constexpr BaseCoord (T) : value (1) {}
++};
++template <class units> struct IntCoordTyped : BaseCoord<int>, units
++{
++  typedef BaseCoord Super;
++  constexpr IntCoordTyped (int) : Super (0) {}
++};
++template <class units>
++struct IntPointTyped : BasePoint<IntCoordTyped<units> >, units
++{
++  typedef BasePoint<IntCoordTyped<units> > Super;
++  constexpr IntPointTyped (int, int) : Super (0, 0) {}
++};
++struct A
++{
++};
++IntPointTyped<A> a (0, 0);
+Index: gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C  (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-names1.C  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,9 @@
++// PR c++/56710
++// { dg-options "-std=c++11 -Wall" }
++
++int main()
++{
++    int t = 0;
++    return [&]() -> int {int __t; __t = t; return __t; }();
++    return [&t]() -> int {int __t; __t = t; return __t; }();
++}
+Index: gcc/testsuite/g++.dg/cpp0x/variadic158.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/variadic158.C   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/variadic158.C   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,24 @@
++// PR c++/61134
++// { dg-do compile { target c++11 } }
++
++struct Base { };
++
++template <typename>
++struct Fixed {
++  typedef const char* name;
++};
++
++template <typename VT, typename... Fields>
++void New(const char* name,
++         typename Fixed<Fields>::name... field_names);
++
++template <typename VT, typename... Fields>
++void CreateMetric(const char* name,
++                  typename Fixed<Fields>::name... field_names,
++                  const Base&) { }
++
++
++void Fn()
++{
++  CreateMetric<int, const char*>("abcd", "def", Base());
++}
+Index: gcc/testsuite/g++.dg/cpp0x/constexpr-initlist8.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/constexpr-initlist8.C   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/constexpr-initlist8.C   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,7 @@
++// PR c++/63415
++// { dg-do compile { target c++11 } }
++
++template <typename T>
++struct A {
++  static constexpr int value = int(T{});
++};
+Index: gcc/testsuite/g++.dg/cpp0x/variadic160.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/variadic160.C   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/variadic160.C   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,49 @@
++// PR c++/61539
++// { dg-do compile { target c++11 } }
++
++template <typename _CharT> class A;
++template <typename> class B;
++template <class charT> class C;
++template <> class C<char>
++{
++  virtual void xparse (int &, const B<A<char> > &) const;
++};
++template <class T, class charT = char> class G : C<charT>
++{
++public:
++  G (void *) {}
++  void default_value (const T &);
++  void xparse (int &, const B<A<charT> > &) const;
++};
++template <class T, class charT>
++void validate (int &, const B<A<charT> > &, T *, int);
++template <class T, class charT>
++void G<T, charT>::xparse (int &p1, const B<A<charT> > &p2) const
++{
++  validate (p1, p2, (T *)0, 0);
++}
++template <class T> G<T> *value (T *) { return new G<T>(0); }
++namespace Eigen
++{
++template <typename T> struct D;
++template <typename, int, int, int = 0, int = 0, int = 0 > class F;
++template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows,
++          int _MaxCols>
++struct D<F<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
++{
++  typedef _Scalar Scalar;
++};
++template <typename, int, int, int, int, int _MaxCols> class F
++{
++public:
++  typedef typename Eigen::D<F>::Scalar Scalar;
++  F (const Scalar &, const Scalar &, const Scalar &);
++};
++template <class... T>
++void validate (int &, const B<A<char> > &, Eigen::F<T...> *);
++}
++int main (int, char *[])
++{
++  Eigen::F<double, 3, 1> a (0, 0, 0);
++  value (&a)->default_value (Eigen::F<double, 3, 1>(0, 0, 0));
++}
+Index: gcc/testsuite/g++.dg/cpp0x/rv-cond1.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/rv-cond1.C      (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/rv-cond1.C      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,13 @@
++// PR c++/58714
++// { dg-do compile { target c++11 } }
++
++struct X {
++  X& operator=(const X&) = delete;
++  X& operator=(X&& ) = default;
++};
++
++void f(bool t) {
++  X a, b;
++  *(t ? &a : &b) = X();
++  (t ? a : b) = X();
++}
+Index: gcc/testsuite/g++.dg/cpp0x/overload3.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/overload3.C     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/overload3.C     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,17 @@
++// PR c++/59823
++// { dg-options "-std=c++11" }
++
++struct X { };
++
++void f(X&&);                  // { dg-message "void f" }
++
++struct wrap
++{
++  operator const X&() const;
++};
++
++int main()
++{
++  wrap w;
++  f(w);                               // { dg-error "lvalue" }
++}
+Index: gcc/testsuite/g++.dg/ipa/pr62015.C
+===================================================================
+--- gcc/testsuite/g++.dg/ipa/pr62015.C (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/ipa/pr62015.C (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,55 @@
++/* { dg-do run } */
++/* { dg-options "-O3 -std=c++11"  } */
++
++
++extern "C" int printf(const char *fmt, ...);
++extern "C" void abort(void);
++
++struct Side {
++    enum _Value { Left, Right, Invalid };
++
++    constexpr Side() : _value(Invalid) {}
++    constexpr Side(_Value value) : _value(value) {}
++    operator _Value() const { return (_Value)_value; }
++
++  private:
++    char _value;
++};
++
++struct A {
++    void init();
++    void adjust(Side side, bool final);
++    void move(Side side);
++};
++
++void A::init()
++{
++    adjust(Side::Invalid, false);
++}
++
++static void __attribute__((noinline))
++check (int v, int final)
++{
++    if (v != 0)
++      abort();
++}
++
++
++__attribute__((noinline))
++void A::adjust(Side side, bool final)
++{
++  check ((int)side, final);
++}
++
++void A::move(Side side)
++{
++    adjust(side, false);
++    adjust(side, true);
++}
++
++int main()
++{
++    A t;
++    t.move(Side::Left);
++    return 0;
++}
+Index: gcc/testsuite/g++.dg/template/local-fn1.C
+===================================================================
+--- gcc/testsuite/g++.dg/template/local-fn1.C  (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/template/local-fn1.C  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,8 @@
++// PR c++/60605
++
++template <typename T = int>
++struct Foo {
++    void bar() {
++        void bug();
++    }
++};
+Index: gcc/testsuite/g++.dg/template/conv14.C
+===================================================================
+--- gcc/testsuite/g++.dg/template/conv14.C     (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/template/conv14.C     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,30 @@
++// PR c++/61647
++
++class XX;
++
++template<typename Container, typename Key>
++struct Accessor;
++
++template<typename Container, typename Key, typename KeyStore = Key>
++class Variant {
++protected:
++    KeyStore index;
++    Container state;
++public:
++    Variant(Container st, const Key& i) : index(i), state(st) {}
++
++    template<typename T>
++    operator T() const {
++        return Accessor<Container, KeyStore>::template get<T>(state, index);
++    }
++};
++
++class AutoCleanVariant : public Variant<XX*, int> {
++public:
++    AutoCleanVariant(XX* st, int i) : Variant<XX*,int>(st,i) {}
++
++    template<typename T>
++    operator T() const {
++         return Variant<XX*, int>::operator T();
++    }
++};
+Index: gcc/testsuite/g++.dg/template/friend55.C
+===================================================================
+--- gcc/testsuite/g++.dg/template/friend55.C   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/template/friend55.C   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,18 @@
++// PR c++/59956
++
++template <int I> struct A;
++template <int I> class B {
++  int i;
++  template <int A_S> friend void A<A_S>::impl();
++};
++
++B<0> b1;
++template<int I>struct A { void impl(); };
++B<1> b2;
++
++template<int I> void A<I>::impl() { ++b1.i; ++b2.i; }
++
++int main()
++{
++  A<0>().impl();
++}
+Index: gcc/testsuite/g++.dg/template/memclass5.C
+===================================================================
+--- gcc/testsuite/g++.dg/template/memclass5.C  (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/template/memclass5.C  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,26 @@
++// PR c++/60241
++
++template <typename T>
++struct x
++{
++    template <typename U>
++    struct y
++    {
++        typedef T result2;
++    };
++
++    typedef y<int> zy;
++};
++
++template<>
++template<class T>
++struct x<int>::y
++{
++    typedef double result2;
++};
++
++int main()
++{
++    x<int>::zy::result2 xxx;
++    x<int>::y<int>::result2 xxx2;
++}
+Index: gcc/testsuite/g++.dg/template/ptrmem27.C
+===================================================================
+--- gcc/testsuite/g++.dg/template/ptrmem27.C   (.../tags/gcc_4_8_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/template/ptrmem27.C   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -0,0 +1,22 @@
++// PR c++/61500
++
++struct X {
++  int i;
++  int j;
++
++  int foo(int X::* ptr);
++
++  template <int X::* ptr>
++  int bar();
++};
++
++int X::foo(int X::* ptr) {
++  int* p = &(this->*ptr);  // OK.
++  return *p;
++}
++
++template <int X::* ptr>
++int X::bar() {
++  int* p = &(this->*ptr);  // gcc 4.9.0: OK in C++98 mode, fails in C++11 mode.
++  return *p;
++}
+Index: gcc/cp/tree.c
+===================================================================
+--- gcc/cp/tree.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cp/tree.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,6 +97,16 @@
+     case IMAGPART_EXPR:
+       return lvalue_kind (TREE_OPERAND (ref, 0));
++    case MEMBER_REF:
++    case DOTSTAR_EXPR:
++      if (TREE_CODE (ref) == MEMBER_REF)
++      op1_lvalue_kind = clk_ordinary;
++      else
++      op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
++      if (TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (ref, 1))))
++      op1_lvalue_kind = clk_none;
++      return op1_lvalue_kind;
++
+     case COMPONENT_REF:
+       op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
+       /* Look at the member designator.  */
+@@ -3738,6 +3748,10 @@
+     {
+       init_expr = get_target_expr (exp);
+       exp = TARGET_EXPR_SLOT (init_expr);
++      if (CLASS_TYPE_P (TREE_TYPE (exp)))
++      exp = move (exp);
++      else
++      exp = rvalue (exp);
+     }
+   else
+     {
+Index: gcc/cp/ChangeLog
+===================================================================
+--- gcc/cp/ChangeLog   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cp/ChangeLog   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,87 @@
++2014-10-15  Jason Merrill  <jason@redhat.com>
++
++      PR c++/63455
++      Revert:
++      * parser.c (cp_parser_abort_tentative_parse): Make sure we haven't
++      committed to this tentative parse.
++
++      PR c++/63415
++      * pt.c (value_dependent_expression_p) [CONSTRUCTOR]: Check the type.
++      (iterative_hash_template_arg): Likewise.
++
++      PR c++/56710
++      * semantics.c (finish_member_declaration): Don't push closure
++      members.
++
++      PR c++/58624
++      * pt.c (tsubst_copy_and_build) [VAR_DECL]: Use TLS wrapper.
++      * semantics.c (finish_id_expression): Don't call TLS wrapper in a
++      template.
++
++2014-08-07  Jason Merrill  <jason@redhat.com>
++
++      PR c++/61959
++      * semantics.c (cxx_eval_bare_aggregate): Handle POINTER_PLUS_EXPR.
++
++      PR c++/58714
++      * tree.c (stabilize_expr): A stabilized prvalue is an xvalue.
++
++2014-01-27  Jason Merrill  <jason@redhat.com>
++
++      PR c++/59823
++      Core DR 1138
++      * call.c (reference_binding): Pass LOOKUP_NO_TEMP_BIND for
++      list-initialization.  A conversion to rvalue ref that involves
++      an lvalue-rvalue conversion is bad.
++      (convert_like_real): Give helpful error message.
++
++2014-01-29  Jason Merrill  <jason@redhat.com>
++
++      PR c++/59956
++      * friend.c (do_friend): Pass the TEMPLATE_DECL to add_friend if we
++      have a friend template in a class template.
++      * pt.c (tsubst_friend_function): Look through it.
++      (push_template_decl_real): A friend member template is
++      primary.
++
++2014-02-21  Jason Merrill  <jason@redhat.com>
++
++      PR c++/60241
++      * pt.c (lookup_template_class_1): Update DECL_TEMPLATE_INSTANTIATIONS
++      of the partial instantiation, not the most general template.
++      (maybe_process_partial_specialization): Reassign everything on
++      that list.
++
++2014-03-05  Jason Merrill  <jason@redhat.com>
++
++      PR c++/60361
++      * parser.c (cp_parser_template_id): Don't set up a CPP_TEMPLATE_ID
++      if re-parsing might succeed.
++      * semantics.c (finish_id_expression): Use of a parameter outside
++      the function body is a parse error.
++
++2014-06-30  Jason Merrill  <jason@redhat.com>
++
++      PR c++/61647
++      * pt.c (type_dependent_expression_p): Check BASELINK_OPTYPE.
++
++      PR c++/61539
++      * pt.c (unify_one_argument): Type/expression mismatch just causes
++      deduction failure.
++
++      PR c++/61500
++      * tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR.
++
++2014-06-17  Jason Merrill  <jason@redhat.com>
++
++      PR c++/60605
++      * pt.c (check_default_tmpl_args): Check DECL_LOCAL_FUNCTION_P.
++
++2014-06-02  Jason Merrill  <jason@redhat.com>
++
++      PR c++/61134
++      * pt.c (pack_deducible_p): Handle canonicalization.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: gcc/cp/pt.c
+===================================================================
+--- gcc/cp/pt.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cp/pt.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -907,11 +907,13 @@
+              t; t = TREE_CHAIN (t))
+           {
+             tree inst = TREE_VALUE (t);
+-            if (CLASSTYPE_TEMPLATE_SPECIALIZATION (inst))
++            if (CLASSTYPE_TEMPLATE_SPECIALIZATION (inst)
++                || !COMPLETE_OR_OPEN_TYPE_P (inst))
+               {
+                 /* We already have a full specialization of this partial
+-                   instantiation.  Reassign it to the new member
+-                   specialization template.  */
++                   instantiation, or a full specialization has been
++                   looked up but not instantiated.  Reassign it to the
++                   new member specialization template.  */
+                 spec_entry elt;
+                 spec_entry *entry;
+                 void **slot;
+@@ -930,7 +932,7 @@
+                 *entry = elt;
+                 *slot = entry;
+               }
+-            else if (COMPLETE_OR_OPEN_TYPE_P (inst))
++            else
+               /* But if we've had an implicit instantiation, that's a
+                  problem ([temp.expl.spec]/6).  */
+               error ("specialization %qT after instantiation %qT",
+@@ -1569,6 +1571,7 @@
+     case CONSTRUCTOR:
+       {
+       tree field, value;
++      iterative_hash_template_arg (TREE_TYPE (arg), val);
+       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg), i, field, value)
+         {
+           val = iterative_hash_template_arg (field, val);
+@@ -4308,7 +4311,8 @@
+      in the template-parameter-list of the definition of a member of a
+      class template.  */
+-  if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL)
++  if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL
++      || (TREE_CODE (decl) == FUNCTION_DECL && DECL_LOCAL_FUNCTION_P (decl)))
+     /* You can't have a function template declaration in a local
+        scope, nor you can you define a member of a class template in a
+        local scope.  */
+@@ -4572,7 +4576,8 @@
+     DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace);
+   /* See if this is a primary template.  */
+-  if (is_friend && ctx)
++  if (is_friend && ctx
++      && uses_template_parms_level (ctx, processing_template_decl))
+     /* A friend template that specifies a class context, i.e.
+          template <typename T> friend void A<T>::f();
+        is not primary.  */
+@@ -7454,7 +7459,7 @@
+       }
+       /* Let's consider the explicit specialization of a member
+-         of a class template specialization that is implicitely instantiated,
++         of a class template specialization that is implicitly instantiated,
+        e.g.:
+            template<class T>
+            struct S
+@@ -7552,9 +7557,9 @@
+       /* Note this use of the partial instantiation so we can check it
+        later in maybe_process_partial_specialization.  */
+-      DECL_TEMPLATE_INSTANTIATIONS (templ)
++      DECL_TEMPLATE_INSTANTIATIONS (found)
+       = tree_cons (arglist, t,
+-                   DECL_TEMPLATE_INSTANTIATIONS (templ));
++                   DECL_TEMPLATE_INSTANTIATIONS (found));
+       if (TREE_CODE (template_type) == ENUMERAL_TYPE && !is_dependent_type)
+       /* Now that the type has been registered on the instantiations
+@@ -8289,10 +8294,17 @@
+       if (COMPLETE_TYPE_P (context))
+       {
++        tree fn = new_friend;
++        /* do_friend adds the TEMPLATE_DECL for any member friend
++           template even if it isn't a member template, i.e.
++             template <class T> friend A<T>::f();
++           Look through it in that case.  */
++        if (TREE_CODE (fn) == TEMPLATE_DECL
++            && !PRIMARY_TEMPLATE_P (fn))
++          fn = DECL_TEMPLATE_RESULT (fn);
+         /* Check to see that the declaration is really present, and,
+            possibly obtain an improved declaration.  */
+-        tree fn = check_classfn (context,
+-                                 new_friend, NULL_TREE);
++        fn = check_classfn (context, fn, NULL_TREE);
+         if (fn)
+           new_friend = fn;
+@@ -14488,6 +14500,16 @@
+     case PARM_DECL:
+       {
+       tree r = tsubst_copy (t, args, complain, in_decl);
++      if (TREE_CODE (r) == VAR_DECL
++          && !processing_template_decl
++          && !cp_unevaluated_operand
++          && DECL_THREAD_LOCAL_P (r))
++        {
++          if (tree wrap = get_tls_wrapper_fn (r))
++            /* Replace an evaluated use of the thread_local variable with
++               a call to its wrapper.  */
++            r = build_cxx_call (wrap, 0, NULL, tf_warning_or_error);
++        }
+       if (TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE)
+         /* If the original type was a reference, we'll be wrapped in
+@@ -14934,7 +14956,7 @@
+       continue;
+       for (packs = PACK_EXPANSION_PARAMETER_PACKS (type);
+          packs; packs = TREE_CHAIN (packs))
+-      if (TREE_VALUE (packs) == parm)
++      if (template_args_equal (TREE_VALUE (packs), parm))
+         {
+           /* The template parameter pack is used in a function parameter
+              pack.  If this is the end of the parameter list, the
+@@ -15502,8 +15524,9 @@
+       maybe_adjust_types_for_deduction (strict, &parm, &arg, arg_expr);
+     }
+   else
+-    gcc_assert ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL)
+-              == (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL));
++    if ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL)
++      != (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL))
++      return unify_template_argument_mismatch (explain_p, parm, arg);
+   /* For deduction from an init-list we need the actual list.  */
+   if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr))
+@@ -19804,6 +19827,8 @@
+       {
+       unsigned ix;
+       tree val;
++      if (dependent_type_p (TREE_TYPE (expression)))
++        return true;
+       FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (expression), ix, val)
+         if (value_dependent_expression_p (val))
+           return true;
+@@ -20009,7 +20034,12 @@
+       return true;
+       if (BASELINK_P (expression))
+-      expression = BASELINK_FUNCTIONS (expression);
++      {
++        if (BASELINK_OPTYPE (expression)
++            && dependent_type_p (BASELINK_OPTYPE (expression)))
++          return true;
++        expression = BASELINK_FUNCTIONS (expression);
++      }
+       if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
+       {
+Index: gcc/cp/semantics.c
+===================================================================
+--- gcc/cp/semantics.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cp/semantics.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2735,8 +2735,10 @@
+                                             /*friend_p=*/0);
+       }
+     }
+-  /* Enter the DECL into the scope of the class.  */
+-  else if (pushdecl_class_level (decl))
++  /* Enter the DECL into the scope of the class, if the class
++     isn't a closure (whose fields are supposed to be unnamed).  */
++  else if (CLASSTYPE_LAMBDA_EXPR (current_class_type)
++         || pushdecl_class_level (decl))
+     {
+       if (TREE_CODE (decl) == USING_DECL)
+       {
+@@ -3108,7 +3110,7 @@
+         && DECL_CONTEXT (decl) == NULL_TREE
+         && !cp_unevaluated_operand)
+       {
+-        error ("use of parameter %qD outside function body", decl);
++        *error_msg = "use of parameter outside function body";
+         return error_mark_node;
+       }
+     }
+@@ -3343,6 +3345,7 @@
+       tree wrap;
+       if (TREE_CODE (decl) == VAR_DECL
+         && !cp_unevaluated_operand
++        && !processing_template_decl
+         && DECL_THREAD_LOCAL_P (decl)
+         && (wrap = get_tls_wrapper_fn (decl)))
+       {
+@@ -7296,7 +7299,9 @@
+         constructor_elt *inner = base_field_constructor_elt (n, ce->index);
+         inner->value = elt;
+       }
+-      else if (ce->index && TREE_CODE (ce->index) == NOP_EXPR)
++      else if (ce->index
++             && (TREE_CODE (ce->index) == NOP_EXPR
++                 || TREE_CODE (ce->index) == POINTER_PLUS_EXPR))
+       {
+         /* This is an initializer for an empty base; now that we've
+            checked that it's constant, we can ignore it.  */
+Index: gcc/cp/parser.c
+===================================================================
+--- gcc/cp/parser.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cp/parser.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -12831,7 +12831,12 @@
+      the effort required to do the parse, nor will we issue duplicate
+      error messages about problems during instantiation of the
+      template.  */
+-  if (start_of_id)
++  if (start_of_id
++      /* Don't do this if we had a parse error in a declarator; re-parsing
++       might succeed if a name changes meaning (60361).  */
++      && !(cp_parser_error_occurred (parser)
++         && cp_parser_parsing_tentatively (parser)
++         && parser->in_declarator_p))
+     {
+       cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
+@@ -23774,8 +23779,6 @@
+ static void
+ cp_parser_abort_tentative_parse (cp_parser* parser)
+ {
+-  gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED
+-            || errorcount > 0);
+   cp_parser_simulate_error (parser);
+   /* Now, pretend that we want to see if the construct was
+      successfully parsed.  */
+Index: gcc/cp/call.c
+===================================================================
+--- gcc/cp/call.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cp/call.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1464,7 +1464,7 @@
+     {
+       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
+       conv = implicit_conversion (to, from, expr, c_cast_p,
+-                                flags, complain);
++                                flags|LOOKUP_NO_TEMP_BIND, complain);
+       if (!CLASS_TYPE_P (to)
+         && CONSTRUCTOR_NELTS (expr) == 1)
+       {
+@@ -1624,9 +1624,9 @@
+   /* [dcl.init.ref]
+-     Otherwise, the reference shall be to a non-volatile const type.
+-
+-     Under C++0x, [8.5.3/5 dcl.init.ref] it may also be an rvalue reference */
++     Otherwise, the reference shall be an lvalue reference to a
++     non-volatile const type, or the reference shall be an rvalue
++     reference.  */
+   if (!CP_TYPE_CONST_NON_VOLATILE_P (to) && !TYPE_REF_IS_RVALUE (rto))
+     return NULL;
+@@ -1664,7 +1664,16 @@
+   /* This reference binding, unlike those above, requires the
+      creation of a temporary.  */
+   conv->need_temporary_p = true;
+-  conv->rvaluedness_matches_p = TYPE_REF_IS_RVALUE (rto);
++  if (TYPE_REF_IS_RVALUE (rto))
++    {
++      conv->rvaluedness_matches_p = 1;
++      /* In the second case, if the reference is an rvalue reference and
++       the second standard conversion sequence of the user-defined
++       conversion sequence includes an lvalue-to-rvalue conversion, the
++       program is ill-formed.  */
++      if (conv->user_conv_p && next_conversion (conv)->kind == ck_rvalue)
++      conv->bad_p = 1;
++    }
+   return conv;
+ }
+@@ -5811,7 +5820,7 @@
+       && convs->kind != ck_list
+       && convs->kind != ck_ambig
+       && (convs->kind != ck_ref_bind
+-        || convs->user_conv_p)
++        || (convs->user_conv_p && next_conversion (convs)->bad_p))
+       && (convs->kind != ck_rvalue
+         || SCALAR_TYPE_P (totype))
+       && convs->kind != ck_base)
+@@ -6110,7 +6119,8 @@
+       if (convs->bad_p && !next_conversion (convs)->bad_p)
+         {
+           gcc_assert (TYPE_REF_IS_RVALUE (ref_type)
+-                      && real_lvalue_p (expr));
++                      && (real_lvalue_p (expr)
++                          || next_conversion(convs)->kind == ck_rvalue));
+           error_at (loc, "cannot bind %qT lvalue to %qT",
+                     TREE_TYPE (expr), totype);
+Index: gcc/cp/friend.c
+===================================================================
+--- gcc/cp/friend.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/cp/friend.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -502,7 +502,13 @@
+                                 ? current_template_parms
+                                 : NULL_TREE);
+-        if (template_member_p && decl && TREE_CODE (decl) == FUNCTION_DECL)
++        if ((template_member_p
++             /* Always pull out the TEMPLATE_DECL if we have a friend
++                template in a class template so that it gets tsubsted
++                properly later on (59956).  tsubst_friend_function knows
++                how to tell this apart from a member template.  */
++             || (class_template_depth && friend_depth))
++            && decl && TREE_CODE (decl) == FUNCTION_DECL)
+           decl = DECL_TI_TEMPLATE (decl);
+         if (decl)
+Index: gcc/haifa-sched.c
+===================================================================
+--- gcc/haifa-sched.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/haifa-sched.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2931,7 +2931,7 @@
+ {
+   advance_state (curr_state);
+   if (sched_verbose >= 6)
+-    fprintf (sched_dump, ";;\tAdvanced a state.\n");
++    fprintf (sched_dump, ";;\tAdvance the current state.\n");
+ }
+ /* Update register pressure after scheduling INSN.  */
+@@ -5964,6 +5964,7 @@
+   modulo_insns_scheduled = 0;
+   ls.modulo_epilogue = false;
++  ls.first_cycle_insn_p = true;
+   /* Loop until all the insns in BB are scheduled.  */
+   while ((*current_sched_info->schedule_more_p) ())
+@@ -6034,7 +6035,6 @@
+       if (must_backtrack)
+       goto do_backtrack;
+-      ls.first_cycle_insn_p = true;
+       ls.shadows_only_p = false;
+       cycle_issued_insns = 0;
+       ls.can_issue_more = issue_rate;
+@@ -6321,11 +6321,13 @@
+             break;
+           }
+       }
++      ls.first_cycle_insn_p = true;
+     }
+   if (ls.modulo_epilogue)
+     success = true;
+  end_schedule:
+-  advance_one_cycle ();
++  if (!ls.first_cycle_insn_p)
++    advance_one_cycle ();
+   perform_replacements_new_cycle ();
+   if (modulo_ii > 0)
+     {
+Index: gcc/double-int.c
+===================================================================
+--- gcc/double-int.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/double-int.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -616,7 +616,7 @@
+                == (unsigned HOST_WIDE_INT) htwice)
+               && (labs_den <= ltwice)))
+         {
+-          if (*hquo < 0)
++          if (quo_neg)
+             /* quo = quo - 1;  */
+             add_double (*lquo, *hquo,
+                         (HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
+Index: gcc/tree-ssa-math-opts.c
+===================================================================
+--- gcc/tree-ssa-math-opts.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-ssa-math-opts.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1537,7 +1537,7 @@
+ struct symbolic_number {
+   unsigned HOST_WIDEST_INT n;
+-  int size;
++  tree type;
+ };
+ /* Perform a SHIFT or ROTATE operation by COUNT bits on symbolic
+@@ -1549,13 +1549,15 @@
+                struct symbolic_number *n,
+                int count)
+ {
++  int bitsize = TYPE_PRECISION (n->type);
++
+   if (count % 8 != 0)
+     return false;
+   /* Zero out the extra bits of N in order to avoid them being shifted
+      into the significant bits.  */
+-  if (n->size < (int)sizeof (HOST_WIDEST_INT))
+-    n->n &= ((unsigned HOST_WIDEST_INT)1 << (n->size * BITS_PER_UNIT)) - 1;
++  if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT))
++    n->n &= ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1;
+   switch (code)
+     {
+@@ -1563,20 +1565,24 @@
+       n->n <<= count;
+       break;
+     case RSHIFT_EXPR:
++      /* Arithmetic shift of signed type: result is dependent on the value.  */
++      if (!TYPE_UNSIGNED (n->type)
++        && (n->n & ((unsigned HOST_WIDEST_INT) 0xff << (bitsize - 8))))
++      return false;
+       n->n >>= count;
+       break;
+     case LROTATE_EXPR:
+-      n->n = (n->n << count) | (n->n >> ((n->size * BITS_PER_UNIT) - count));
++      n->n = (n->n << count) | (n->n >> (bitsize - count));
+       break;
+     case RROTATE_EXPR:
+-      n->n = (n->n >> count) | (n->n << ((n->size * BITS_PER_UNIT) - count));
++      n->n = (n->n >> count) | (n->n << (bitsize - count));
+       break;
+     default:
+       return false;
+     }
+   /* Zero unused bits for size.  */
+-  if (n->size < (int)sizeof (HOST_WIDEST_INT))
+-    n->n &= ((unsigned HOST_WIDEST_INT)1 << (n->size * BITS_PER_UNIT)) - 1;
++  if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT))
++    n->n &= ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1;
+   return true;
+ }
+@@ -1593,7 +1599,7 @@
+   if (TREE_CODE (lhs_type) != INTEGER_TYPE)
+     return false;
+-  if (TYPE_PRECISION (lhs_type) != n->size * BITS_PER_UNIT)
++  if (TYPE_PRECISION (lhs_type) != TYPE_PRECISION (n->type))
+     return false;
+   return true;
+@@ -1650,20 +1656,25 @@
+        to initialize the symbolic number.  */
+       if (!source_expr1)
+       {
++        int size;
++
+         /* Set up the symbolic number N by setting each byte to a
+            value between 1 and the byte size of rhs1.  The highest
+            order byte is set to n->size and the lowest order
+            byte to 1.  */
+-        n->size = TYPE_PRECISION (TREE_TYPE (rhs1));
+-        if (n->size % BITS_PER_UNIT != 0)
++        n->type = TREE_TYPE (rhs1);
++        size = TYPE_PRECISION (n->type);
++        if (size % BITS_PER_UNIT != 0)
+           return NULL_TREE;
+-        n->size /= BITS_PER_UNIT;
++        if (size > HOST_BITS_PER_WIDEST_INT)
++          return NULL_TREE;
++        size /= BITS_PER_UNIT;
+         n->n = (sizeof (HOST_WIDEST_INT) < 8 ? 0 :
+                 (unsigned HOST_WIDEST_INT)0x08070605 << 32 | 0x04030201);
+-        if (n->size < (int)sizeof (HOST_WIDEST_INT))
++        if (size < (int)sizeof (HOST_WIDEST_INT))
+           n->n &= ((unsigned HOST_WIDEST_INT)1 <<
+-                   (n->size * BITS_PER_UNIT)) - 1;
++                   (size * BITS_PER_UNIT)) - 1;
+         source_expr1 = rhs1;
+       }
+@@ -1672,12 +1683,12 @@
+       {
+       case BIT_AND_EXPR:
+         {
+-          int i;
++          int i, size = TYPE_PRECISION (n->type) / BITS_PER_UNIT;
+           unsigned HOST_WIDEST_INT val = widest_int_cst_value (rhs2);
+           unsigned HOST_WIDEST_INT tmp = val;
+           /* Only constants masking full bytes are allowed.  */
+-          for (i = 0; i < n->size; i++, tmp >>= BITS_PER_UNIT)
++          for (i = 0; i < size; i++, tmp >>= BITS_PER_UNIT)
+             if ((tmp & 0xff) != 0 && (tmp & 0xff) != 0xff)
+               return NULL_TREE;
+@@ -1693,12 +1704,24 @@
+         break;
+       CASE_CONVERT:
+         {
+-          int type_size;
++          int type_size, old_type_size;
++          tree type;
+-          type_size = TYPE_PRECISION (gimple_expr_type (stmt));
++          type = gimple_expr_type (stmt);
++          type_size = TYPE_PRECISION (type);
+           if (type_size % BITS_PER_UNIT != 0)
+             return NULL_TREE;
++          if (type_size > (int) HOST_BITS_PER_WIDEST_INT)
++            return NULL_TREE;
++          /* Sign extension: result is dependent on the value.  */
++          old_type_size = TYPE_PRECISION (n->type);
++          if (!TYPE_UNSIGNED (n->type)
++              && type_size > old_type_size
++              && n->n &
++                 ((unsigned HOST_WIDEST_INT) 0xff << (old_type_size - 8)))
++            return NULL_TREE;
++
+           if (type_size / BITS_PER_UNIT < (int)(sizeof (HOST_WIDEST_INT)))
+             {
+               /* If STMT casts to a smaller type mask out the bits not
+@@ -1705,7 +1728,7 @@
+                  belonging to the target type.  */
+               n->n &= ((unsigned HOST_WIDEST_INT)1 << type_size) - 1;
+             }
+-          n->size = type_size / BITS_PER_UNIT;
++          n->type = type;
+         }
+         break;
+       default:
+@@ -1718,7 +1741,7 @@
+   if (rhs_class == GIMPLE_BINARY_RHS)
+     {
+-      int i;
++      int i, size;
+       struct symbolic_number n1, n2;
+       unsigned HOST_WIDEST_INT mask;
+       tree source_expr2;
+@@ -1742,11 +1765,12 @@
+         source_expr2 = find_bswap_1 (rhs2_stmt, &n2, limit - 1);
+         if (source_expr1 != source_expr2
+-            || n1.size != n2.size)
++            || TYPE_PRECISION (n1.type) != TYPE_PRECISION (n2.type))
+           return NULL_TREE;
+-        n->size = n1.size;
+-        for (i = 0, mask = 0xff; i < n->size; i++, mask <<= BITS_PER_UNIT)
++        n->type = n1.type;
++        size = TYPE_PRECISION (n->type) / BITS_PER_UNIT;
++        for (i = 0, mask = 0xff; i < size; i++, mask <<= BITS_PER_UNIT)
+           {
+             unsigned HOST_WIDEST_INT masked1, masked2;
+@@ -1785,7 +1809,7 @@
+   struct symbolic_number n;
+   tree source_expr;
+-  int limit;
++  int limit, bitsize;
+   /* The last parameter determines the depth search limit.  It usually
+      correlates directly to the number of bytes to be touched.  We
+@@ -1800,13 +1824,14 @@
+     return NULL_TREE;
+   /* Zero out the extra bits of N and CMP.  */
+-  if (n.size < (int)sizeof (HOST_WIDEST_INT))
++  bitsize = TYPE_PRECISION (n.type);
++  if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT))
+     {
+       unsigned HOST_WIDEST_INT mask =
+-      ((unsigned HOST_WIDEST_INT)1 << (n.size * BITS_PER_UNIT)) - 1;
++      ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1;
+       n.n &= mask;
+-      cmp >>= (sizeof (HOST_WIDEST_INT) - n.size) * BITS_PER_UNIT;
++      cmp >>= sizeof (HOST_WIDEST_INT) * BITS_PER_UNIT - bitsize;
+     }
+   /* A complete byte swap should make the symbolic number to start
+@@ -1828,7 +1853,7 @@
+   bool changed = false;
+   tree bswap16_type = NULL_TREE, bswap32_type = NULL_TREE, bswap64_type = NULL_TREE;
+-  if (BITS_PER_UNIT != 8)
++  if (BITS_PER_UNIT != 8 || CHAR_BIT != 8)
+     return 0;
+   if (sizeof (HOST_WIDEST_INT) < 8)
+Index: gcc/ifcvt.c
+===================================================================
+--- gcc/ifcvt.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ifcvt.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -294,6 +294,28 @@
+   return (e) ? e->dest : NULL_BLOCK;
+ }
++
++/* Return true if RTXs A and B can be safely interchanged.  */
++
++static bool
++rtx_interchangeable_p (const_rtx a, const_rtx b)
++{
++  if (!rtx_equal_p (a, b))
++    return false;
++
++  if (GET_CODE (a) != MEM)
++    return true;
++
++  /* A dead type-unsafe memory reference is legal, but a live type-unsafe memory
++     reference is not.  Interchanging a dead type-unsafe memory reference with
++     a live type-safe one creates a live type-unsafe memory reference, in other
++     words, it makes the program illegal.
++     We check here conservatively whether the two memory references have equal
++     memory attributes.  */
++
++  return mem_attrs_eq_p (get_mem_attrs (a), get_mem_attrs (b));
++}
++
\f
+ /* Go through a bunch of insns, converting them to conditional
+    execution format if possible.  Return TRUE if all of the non-note
+@@ -1014,6 +1036,9 @@
+       || (rtx_equal_p (if_info->a, XEXP (cond, 1))
+         && rtx_equal_p (if_info->b, XEXP (cond, 0))))
+     {
++      if (!rtx_interchangeable_p (if_info->a, if_info->b))
++      return FALSE;
++
+       y = (code == EQ) ? if_info->a : if_info->b;
+       /* Avoid generating the move if the source is the destination.  */
+@@ -2483,7 +2508,7 @@
+       if (! insn_b
+         || insn_b != last_active_insn (else_bb, FALSE)
+         || (set_b = single_set (insn_b)) == NULL_RTX
+-        || ! rtx_equal_p (x, SET_DEST (set_b)))
++        || ! rtx_interchangeable_p (x, SET_DEST (set_b)))
+       return FALSE;
+     }
+   else
+@@ -2496,7 +2521,7 @@
+         || BLOCK_FOR_INSN (insn_b) != BLOCK_FOR_INSN (if_info->cond_earliest)
+         || !NONJUMP_INSN_P (insn_b)
+         || (set_b = single_set (insn_b)) == NULL_RTX
+-        || ! rtx_equal_p (x, SET_DEST (set_b))
++        || ! rtx_interchangeable_p (x, SET_DEST (set_b))
+         || ! noce_operand_ok (SET_SRC (set_b))
+         || reg_overlap_mentioned_p (x, SET_SRC (set_b))
+         || modified_between_p (SET_SRC (set_b), insn_b, jump)
+@@ -2562,7 +2587,7 @@
+   /* Look and see if A and B are really the same.  Avoid creating silly
+      cmove constructs that no one will fix up later.  */
+-  if (rtx_equal_p (a, b))
++  if (rtx_interchangeable_p (a, b))
+     {
+       /* If we have an INSN_B, we don't have to create any new rtl.  Just
+        move the instruction that we already have.  If we don't have an
+@@ -4246,6 +4271,9 @@
+   old_dest = JUMP_LABEL (jump);
+   if (other_bb != new_dest)
+     {
++      if (!any_condjump_p (jump))
++      goto cancel;
++
+       if (JUMP_P (BB_END (dest_edge->src)))
+       new_dest_label = JUMP_LABEL (BB_END (dest_edge->src));
+       else if (new_dest == EXIT_BLOCK_PTR)
+Index: gcc/dwarf2out.c
+===================================================================
+--- gcc/dwarf2out.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/dwarf2out.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -12234,7 +12234,7 @@
+             op1 = mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode,
+                                       VAR_INIT_STATUS_INITIALIZED);
+             if (op1 == 0)
+-              break;
++              return NULL;
+             add_loc_descr (&mem_loc_result, op1);
+             add_loc_descr (&mem_loc_result,
+                            new_loc_descr (DW_OP_plus, 0, 0));
+@@ -13882,6 +13882,10 @@
+       have_address = 1;
+       break;
++    case TARGET_MEM_REF:
++    case SSA_NAME:
++      return NULL;
++
+     case COMPOUND_EXPR:
+       return loc_list_from_tree (TREE_OPERAND (loc, 1), want_address);
+Index: gcc/expr.c
+===================================================================
+--- gcc/expr.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/expr.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -10603,7 +10603,7 @@
+       || !host_integerp (TREE_OPERAND (offset, 1), 1)
+       || compare_tree_int (TREE_OPERAND (offset, 1),
+                          BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0
+-      || !exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0)
++      || exact_log2 (tree_low_cst (TREE_OPERAND (offset, 1), 1) + 1) < 0)
+     return 0;
+   /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
+Index: gcc/ada/socket.c
+===================================================================
+--- gcc/ada/socket.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ada/socket.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -212,7 +212,7 @@
+   struct hostent *rh;
+   int ri;
+-#if defined(__linux__) || defined(__GLIBC__)
++#if defined(__linux__) || defined(__GLIBC__) || defined(__rtems__)
+   (void) gethostbyname_r (name, ret, buf, buflen, &rh, h_errnop);
+ #else
+   rh = gethostbyname_r (name, ret, buf, buflen, h_errnop);
+Index: gcc/ada/uintp.adb
+===================================================================
+--- gcc/ada/uintp.adb  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ada/uintp.adb  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -171,22 +171,6 @@
+    --  If Discard_Quotient is True, Quotient is set to No_Uint
+    --  If Discard_Remainder is True, Remainder is set to No_Uint
+-   function Vector_To_Uint
+-     (In_Vec   : UI_Vector;
+-      Negative : Boolean) return Uint;
+-   --  Functions that calculate values in UI_Vectors, call this function to
+-   --  create and return the Uint value. In_Vec contains the multiple precision
+-   --  (Base) representation of a non-negative value. Leading zeroes are
+-   --  permitted. Negative is set if the desired result is the negative of the
+-   --  given value. The result will be either the appropriate directly
+-   --  represented value, or a table entry in the proper canonical format is
+-   --  created and returned.
+-   --
+-   --  Note that Init_Operand puts a signed value in the result vector, but
+-   --  Vector_To_Uint is always presented with a non-negative value. The
+-   --  processing of signs is something that is done by the caller before
+-   --  calling Vector_To_Uint.
+-
+    ------------
+    -- Direct --
+    ------------
+Index: gcc/ada/uintp.ads
+===================================================================
+--- gcc/ada/uintp.ads  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ada/uintp.ads  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -90,6 +90,18 @@
+    Uint_Minus_80  : constant Uint;
+    Uint_Minus_128 : constant Uint;
++   type UI_Vector is array (Pos range <>) of Int;
++   --  Vector containing the integer values of a Uint value
++
++   --  Note: An earlier version of this package used pointers of arrays of Ints
++   --  (dynamically allocated) for the Uint type. The change leads to a few
++   --  less natural idioms used throughout this code, but eliminates all uses
++   --  of the heap except for the table package itself. For example, Uint
++   --  parameters are often converted to UI_Vectors for internal manipulation.
++   --  This is done by creating the local UI_Vector using the function N_Digits
++   --  on the Uint to find the size needed for the vector, and then calling
++   --  Init_Operand to copy the values out of the table into the vector.
++
+    -----------------
+    -- Subprograms --
+    -----------------
+@@ -252,6 +264,22 @@
+    --  function is used for capacity checks, and it can be one bit off
+    --  without affecting its usage.
++   function Vector_To_Uint
++     (In_Vec   : UI_Vector;
++      Negative : Boolean) return Uint;
++   --  Functions that calculate values in UI_Vectors, call this function to
++   --  create and return the Uint value. In_Vec contains the multiple precision
++   --  (Base) representation of a non-negative value. Leading zeroes are
++   --  permitted. Negative is set if the desired result is the negative of the
++   --  given value. The result will be either the appropriate directly
++   --  represented value, or a table entry in the proper canonical format is
++   --  created and returned.
++   --
++   --  Note that Init_Operand puts a signed value in the result vector, but
++   --  Vector_To_Uint is always presented with a non-negative value. The
++   --  processing of signs is something that is done by the caller before
++   --  calling Vector_To_Uint.
++
+    ---------------------
+    -- Output Routines --
+    ---------------------
+@@ -494,18 +522,6 @@
+    --  UI_Vector is defined for this purpose and some internal subprograms
+    --  used for converting from one to the other are defined.
+-   type UI_Vector is array (Pos range <>) of Int;
+-   --  Vector containing the integer values of a Uint value
+-
+-   --  Note: An earlier version of this package used pointers of arrays of Ints
+-   --  (dynamically allocated) for the Uint type. The change leads to a few
+-   --  less natural idioms used throughout this code, but eliminates all uses
+-   --  of the heap except for the table package itself. For example, Uint
+-   --  parameters are often converted to UI_Vectors for internal manipulation.
+-   --  This is done by creating the local UI_Vector using the function N_Digits
+-   --  on the Uint to find the size needed for the vector, and then calling
+-   --  Init_Operand to copy the values out of the table into the vector.
+-
+    type Uint_Entry is record
+       Length : Pos;
+       --  Length of entry in Udigits table in digits (i.e. in words)
+Index: gcc/ada/ChangeLog
+===================================================================
+--- gcc/ada/ChangeLog  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ada/ChangeLog  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,20 @@
++2014-10-13  Eric Botcazou  <ebotcazou@adacore.com>
++            Alan Modra  <amodra@gmail.com>
++
++      PR ada/63225
++      * uintp.adb (Vector_To_Uint): Move from here to...
++      * uintp.ads (UI_Vector): Make public.
++      (Vector_To_Uint): ...here.
++
++2014-08-12  Joel Sherrill <joel.sherrill@oarcorp.com>
++
++      * socket.c: For RTEMS, use correct prototype of gethostbyname_r().
++      * gsocket.h Add include of <unistd.h> on RTEMS.
++
++2014-08-11  Joel Sherrill <joel.sherrill@oarcorp.com>
++
++      * s-osinte-rtems.adb: Correct formatting of line in license block.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: gcc/ada/s-osinte-rtems.adb
+===================================================================
+--- gcc/ada/s-osinte-rtems.adb (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ada/s-osinte-rtems.adb (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -22,7 +22,7 @@
+ -- You should have received a copy of the GNU General Public License and    --
+ -- a copy of the GCC Runtime Library Exception along with this program;     --
+ -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+--- <http://www.gnu.org/licenses/>.                                         
++-- <http://www.gnu.org/licenses/>.                                          --
+ --                                                                          --
+ -- GNARL was developed by the GNARL team at Florida State University. It is --
+ -- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
+Index: gcc/ada/gsocket.h
+===================================================================
+--- gcc/ada/gsocket.h  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/ada/gsocket.h  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -183,6 +183,11 @@
+ #include <sys/time.h>
+ #endif
++#if defined(__rtems__)
++#include <unistd.h>
++/* Required, for read(), write(), and close() */
++#endif
++
+ /*
+  * RTEMS has these .h files but not until you have built and installed RTEMS.
+  * When building a C/C++ toolset, you also build the newlib C library, so the
+Index: gcc/tree-ssa-ifcombine.c
+===================================================================
+--- gcc/tree-ssa-ifcombine.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-ssa-ifcombine.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -105,7 +105,11 @@
+     {
+       gimple stmt = gsi_stmt (gsi);
++      if (is_gimple_debug (stmt))
++      continue;
++
+       if (gimple_has_side_effects (stmt)
++        || gimple_could_trap_p (stmt)
+         || gimple_vuse (stmt))
+       return false;
+     }
+@@ -197,7 +201,8 @@
+       while (is_gimple_assign (stmt)
+            && ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt))
+                 && (TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (stmt)))
+-                    <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt)))))
++                    <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt))))
++                && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
+                || gimple_assign_ssa_name_copy_p (stmt)))
+       stmt = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt));
+Index: gcc/sel-sched-ir.c
+===================================================================
+--- gcc/sel-sched-ir.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/sel-sched-ir.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -162,7 +162,7 @@
+ static void free_av_set (basic_block);
+ static void invalidate_av_set (basic_block);
+ static void extend_insn_data (void);
+-static void sel_init_new_insn (insn_t, int);
++static void sel_init_new_insn (insn_t, int, int = -1);
+ static void finish_insns (void);
\f
+ /* Various list functions.  */
+@@ -4011,9 +4011,10 @@
+   return seqno;
+ }
+-/* Compute seqno for INSN by its preds or succs.  */
++/* Compute seqno for INSN by its preds or succs.  Use OLD_SEQNO to compute
++   seqno in corner cases.  */
+ static int
+-get_seqno_for_a_jump (insn_t insn)
++get_seqno_for_a_jump (insn_t insn, int old_seqno)
+ {
+   int seqno;
+@@ -4069,8 +4070,16 @@
+   if (seqno < 0)
+     seqno = get_seqno_by_succs (insn);
++  if (seqno < 0)
++    {
++      /* The only case where this could be here legally is that the only
++       unscheduled insn was a conditional jump that got removed and turned
++       into this unconditional one.  Initialize from the old seqno
++       of that jump passed down to here.  */
++      seqno = old_seqno;
++    }
++
+   gcc_assert (seqno >= 0);
+-
+   return seqno;
+ }
+@@ -4250,22 +4259,24 @@
+ }
+ /* This is used to initialize spurious jumps generated by
+-   sel_redirect_edge ().  */
++   sel_redirect_edge ().  OLD_SEQNO is used for initializing seqnos
++   in corner cases within get_seqno_for_a_jump.  */
+ static void
+-init_simplejump_data (insn_t insn)
++init_simplejump_data (insn_t insn, int old_seqno)
+ {
+   init_expr (INSN_EXPR (insn), vinsn_create (insn, false), 0,
+            REG_BR_PROB_BASE, 0, 0, 0, 0, 0, 0,
+            vNULL, true, false, false,
+            false, true);
+-  INSN_SEQNO (insn) = get_seqno_for_a_jump (insn);
++  INSN_SEQNO (insn) = get_seqno_for_a_jump (insn, old_seqno);
+   init_first_time_insn_data (insn);
+ }
+ /* Perform deferred initialization of insns.  This is used to process
+-   a new jump that may be created by redirect_edge.  */
+-void
+-sel_init_new_insn (insn_t insn, int flags)
++   a new jump that may be created by redirect_edge.  OLD_SEQNO is used
++   for initializing simplejumps in init_simplejump_data.  */
++static void
++sel_init_new_insn (insn_t insn, int flags, int old_seqno)
+ {
+   /* We create data structures for bb when the first insn is emitted in it.  */
+   if (INSN_P (insn)
+@@ -4292,7 +4303,7 @@
+   if (flags & INSN_INIT_TODO_SIMPLEJUMP)
+     {
+       extend_insn_data ();
+-      init_simplejump_data (insn);
++      init_simplejump_data (insn, old_seqno);
+     }
+   gcc_assert (CONTAINING_RGN (BLOCK_NUM (insn))
+@@ -5578,8 +5589,7 @@
+ }
+ /* A wrapper for redirect_edge_and_branch_force, which also initializes
+-   data structures for possibly created bb and insns.  Returns the newly
+-   added bb or NULL, when a bb was not needed.  */
++   data structures for possibly created bb and insns.  */
+ void
+ sel_redirect_edge_and_branch_force (edge e, basic_block to)
+ {
+@@ -5586,6 +5596,7 @@
+   basic_block jump_bb, src, orig_dest = e->dest;
+   int prev_max_uid;
+   rtx jump;
++  int old_seqno = -1;
+   /* This function is now used only for bookkeeping code creation, where
+      we'll never get the single pred of orig_dest block and thus will not
+@@ -5594,8 +5605,13 @@
+               && !single_pred_p (orig_dest));
+   src = e->src;
+   prev_max_uid = get_max_uid ();
++  /* Compute and pass old_seqno down to sel_init_new_insn only for the case
++     when the conditional jump being redirected may become unconditional.  */
++  if (any_condjump_p (BB_END (src))
++      && INSN_SEQNO (BB_END (src)) >= 0)
++    old_seqno = INSN_SEQNO (BB_END (src));
++
+   jump_bb = redirect_edge_and_branch_force (e, to);
+-
+   if (jump_bb != NULL)
+     sel_add_bb (jump_bb);
+@@ -5607,7 +5623,8 @@
+   jump = find_new_jump (src, jump_bb, prev_max_uid);
+   if (jump)
+-    sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
++    sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP,
++                     old_seqno);
+   set_immediate_dominator (CDI_DOMINATORS, to,
+                          recompute_dominator (CDI_DOMINATORS, to));
+   set_immediate_dominator (CDI_DOMINATORS, orig_dest,
+@@ -5626,6 +5643,7 @@
+   edge redirected;
+   bool recompute_toporder_p = false;
+   bool maybe_unreachable = single_pred_p (orig_dest);
++  int old_seqno = -1;
+   latch_edge_p = (pipelining_p
+                   && current_loop_nest
+@@ -5634,6 +5652,12 @@
+   src = e->src;
+   prev_max_uid = get_max_uid ();
++  /* Compute and pass old_seqno down to sel_init_new_insn only for the case
++     when the conditional jump being redirected may become unconditional.  */
++  if (any_condjump_p (BB_END (src))
++      && INSN_SEQNO (BB_END (src)) >= 0)
++    old_seqno = INSN_SEQNO (BB_END (src));
++
+   redirected = redirect_edge_and_branch (e, to);
+   gcc_assert (redirected && !last_added_blocks.exists ());
+@@ -5654,7 +5678,7 @@
+   jump = find_new_jump (src, NULL, prev_max_uid);
+   if (jump)
+-    sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
++    sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP, old_seqno);
+   /* Only update dominator info when we don't have unreachable blocks.
+      Otherwise we'll update in maybe_tidy_empty_bb.  */
+Index: gcc/fortran/interface.c
+===================================================================
+--- gcc/fortran/interface.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/interface.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1923,7 +1923,7 @@
+   /* F2008, 12.5.2.5; IR F08/0073.  */
+   if (formal->ts.type == BT_CLASS && actual->expr_type != EXPR_NULL
+       && ((CLASS_DATA (formal)->attr.class_pointer
+-         && !formal->attr.intent == INTENT_IN)
++         && formal->attr.intent != INTENT_IN)
+           || CLASS_DATA (formal)->attr.allocatable))
+     {
+       if (actual->ts.type != BT_CLASS)
+Index: gcc/fortran/trans-expr.c
+===================================================================
+--- gcc/fortran/trans-expr.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/trans-expr.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -7096,7 +7096,7 @@
+   res_desc = gfc_evaluate_now (desc, &se->pre);
+   gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node);
+-  se->expr = gfc_build_addr_expr (TREE_TYPE (se->expr), res_desc);
++  se->expr = gfc_build_addr_expr (NULL_TREE, res_desc);
+   /* Free the lhs after the function call and copy the result data to
+      the lhs descriptor.  */
+Index: gcc/fortran/decl.c
+===================================================================
+--- gcc/fortran/decl.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/decl.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1996,6 +1996,13 @@
+       if (gfc_notify_std (GFC_STD_GNU, "Old-style "
+                         "initialization at %C") == FAILURE)
+       return MATCH_ERROR;
++      else if (gfc_current_state () == COMP_DERIVED)
++      {
++        gfc_error ("Invalid old style initialization for derived type "
++                   "component at %C");
++        m = MATCH_ERROR;
++        goto cleanup;
++      }
+       return match_old_style_init (name);
+     }
+Index: gcc/fortran/trans-openmp.c
+===================================================================
+--- gcc/fortran/trans-openmp.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/trans-openmp.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -115,6 +115,16 @@
+   if (GFC_DECL_RESULT (decl) && ! DECL_HAS_VALUE_EXPR_P (decl))
+     return OMP_CLAUSE_DEFAULT_SHARED;
++  /* These are either array or derived parameters, or vtables.
++     In the former cases, the OpenMP standard doesn't consider them to be
++     variables at all (they can't be redefined), but they can nevertheless appear
++     in parallel/task regions and for default(none) purposes treat them as shared.
++     For vtables likely the same handling is desirable.  */
++  if (TREE_CODE (decl) == VAR_DECL
++      && TREE_READONLY (decl)
++      && TREE_STATIC (decl))
++    return OMP_CLAUSE_DEFAULT_SHARED;
++
+   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
+ }
+Index: gcc/fortran/ChangeLog
+===================================================================
+--- gcc/fortran/ChangeLog      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/ChangeLog      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,63 @@
++2014-10-10  Jakub Jelinek  <jakub@redhat.com>
++
++      PR fortran/59488
++      * trans-openmp.c (gfc_omp_predetermined_sharing): Return
++      OMP_CLAUSE_DEFAULT_SHARED for parameters or vtables.
++
++2014-09-03  Marek Polacek  <polacek@redhat.com>
++
++      Backport from trunk
++      PR fortran/62270
++      * interface.c (compare_parameter): Fix condition.
++
++2014-08-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
++
++      Backport from trunk
++      PR fortran/62214
++      * gfortran.dg/array_assignment_5.f90:  New test.
++
++2014-08-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
++
++      Backport from trunk
++      PR fortran/61999
++      * simplify.c (gfc_simplify_dot_product): Convert types of
++      vectors before calculating the result.
++
++2014-07-19  Paul Thomas  <pault@gcc.gnu.org>
++
++      Backport from trunk.
++      PR fortran/61780
++      * dependency.c (gfc_dep_resolver): Index the 'reverse' array so
++      that elements are skipped. This then correctly aligns 'reverse'
++      with the scalarizer loops.
++
++2014-07-08  Paul Thomas  <pault@gcc.gnu.org>
++
++      PR fortran/61459
++      PR fortran/58883
++      * trans-expr.c (fcncall_realloc_result): Use the natural type
++      for the address expression of 'res_desc'.
++
++2014-07-02  Jakub Jelinek  <jakub@redhat.com>
++          Fritz Reese  <Reese-Fritz@zai.com>
++
++      * decl.c (variable_decl): Reject old style initialization
++      for derived type components.
++
++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-05-26  Janne Blomqvist  <jb@gcc.gnu.org>
++
++      Backport from mainline
++      PR libfortran/61310
++      * intrinsics.texi (CTIME): Remove mention of locale-dependent
++      behavior.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: gcc/fortran/frontend-passes.c
+===================================================================
+--- gcc/fortran/frontend-passes.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/frontend-passes.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -874,6 +874,10 @@
+           return true;
+         break;
++      case INTRINSIC_CONCAT:
++        /* Do not do string concatenations.  */
++        break;
++
+       default:
+         /* Binary operators.  */
+         if (optimize_binop_array_assignment (c, &e->value.op.op1, true))
+Index: gcc/fortran/trans-decl.c
+===================================================================
+--- gcc/fortran/trans-decl.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/trans-decl.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -4084,8 +4084,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/fortran/dependency.c
+===================================================================
+--- gcc/fortran/dependency.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/dependency.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1779,6 +1779,7 @@
+ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse)
+ {
+   int n;
++  int m;
+   gfc_dependency fin_dep;
+   gfc_dependency this_dep;
+@@ -1828,6 +1829,8 @@
+             break;
+           }
++        /* Index for the reverse array.  */
++        m = -1;
+         for (n=0; n < lref->u.ar.dimen; n++)
+           {
+             /* Assume dependency when either of array reference is vector
+@@ -1862,31 +1865,37 @@
+                The ability to reverse or not is set by previous conditions
+                in this dimension.  If reversal is not activated, the
+                value GFC_DEP_BACKWARD is reset to GFC_DEP_OVERLAP.  */
++
++            /* Get the indexing right for the scalarizing loop. If this
++               is an element, there is no corresponding loop.  */
++            if (lref->u.ar.dimen_type[n] != DIMEN_ELEMENT)
++              m++;
++
+             if (rref->u.ar.dimen_type[n] == DIMEN_RANGE
+                   && lref->u.ar.dimen_type[n] == DIMEN_RANGE)
+               {
+                 /* Set reverse if backward dependence and not inhibited.  */
+-                if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
+-                  reverse[n] = (this_dep == GFC_DEP_BACKWARD) ?
+-                               GFC_REVERSE_SET : reverse[n];
++                if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
++                  reverse[m] = (this_dep == GFC_DEP_BACKWARD) ?
++                               GFC_REVERSE_SET : reverse[m];
+                 /* Set forward if forward dependence and not inhibited.  */
+-                if (reverse && reverse[n] == GFC_ENABLE_REVERSE)
+-                  reverse[n] = (this_dep == GFC_DEP_FORWARD) ?
+-                               GFC_FORWARD_SET : reverse[n];
++                if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
++                  reverse[m] = (this_dep == GFC_DEP_FORWARD) ?
++                               GFC_FORWARD_SET : reverse[m];
+                 /* Flag up overlap if dependence not compatible with
+                    the overall state of the expression.  */
+-                if (reverse && reverse[n] == GFC_REVERSE_SET
++                if (reverse && reverse[m] == GFC_REVERSE_SET
+                       && this_dep == GFC_DEP_FORWARD)
+                   {
+-                    reverse[n] = GFC_INHIBIT_REVERSE;
++                    reverse[m] = GFC_INHIBIT_REVERSE;
+                     this_dep = GFC_DEP_OVERLAP;
+                   }
+-                else if (reverse && reverse[n] == GFC_FORWARD_SET
++                else if (reverse && reverse[m] == GFC_FORWARD_SET
+                       && this_dep == GFC_DEP_BACKWARD)
+                   {
+-                    reverse[n] = GFC_INHIBIT_REVERSE;
++                    reverse[m] = GFC_INHIBIT_REVERSE;
+                     this_dep = GFC_DEP_OVERLAP;
+                   }
+@@ -1893,7 +1902,7 @@
+                 /* If no intention of reversing or reversing is explicitly
+                    inhibited, convert backward dependence to overlap.  */
+                 if ((reverse == NULL && this_dep == GFC_DEP_BACKWARD)
+-                    || (reverse != NULL && reverse[n] == GFC_INHIBIT_REVERSE))
++                    || (reverse != NULL && reverse[m] == GFC_INHIBIT_REVERSE))
+                   this_dep = GFC_DEP_OVERLAP;
+               }
+Index: gcc/fortran/intrinsic.texi
+===================================================================
+--- gcc/fortran/intrinsic.texi (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/intrinsic.texi (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3343,10 +3343,8 @@
+ @table @asis
+ @item @emph{Description}:
+ @code{CTIME} converts a system time value, such as returned by
+-@code{TIME8}, to a string. Unless the application has called
+-@code{setlocale}, the output will be in the default locale, of length
+-24 and of the form @samp{Sat Aug 19 18:13:14 1995}. In other locales,
+-a longer string may result.
++@code{TIME8}, to a string. The output will be of the form @samp{Sat
++Aug 19 18:13:14 1995}.
+ This intrinsic is provided in both subroutine and function forms; however,
+ only one form can be used in any given program unit.
+Index: gcc/fortran/simplify.c
+===================================================================
+--- gcc/fortran/simplify.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/fortran/simplify.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1877,6 +1877,9 @@
+ gfc_expr*
+ gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
+ {
++
++  gfc_expr temp;
++
+   if (!is_constant_array_expr (vector_a)
+       || !is_constant_array_expr (vector_b))
+     return NULL;
+@@ -1883,8 +1886,14 @@
+   gcc_assert (vector_a->rank == 1);
+   gcc_assert (vector_b->rank == 1);
+-  gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
++  temp.expr_type = EXPR_OP;
++  gfc_clear_ts (&temp.ts);
++  temp.value.op.op = INTRINSIC_NONE;
++  temp.value.op.op1 = vector_a;
++  temp.value.op.op2 = vector_b;
++  gfc_type_convert_binary (&temp, 1);
++
+   return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true);
+ }
+Index: gcc/configure.ac
+===================================================================
+--- gcc/configure.ac   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/configure.ac   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3443,6 +3443,32 @@
+ AC_MSG_RESULT($gcc_cv_lto_plugin)
+ case "$target" in
++
++  aarch64*-*-*)
++    # Enable default workaround for AArch64 Cortex-A53 erratum 835769.
++    AC_ARG_ENABLE(fix-cortex-a53-835769,
++    [
++AS_HELP_STRING([--enable-fix-cortex-a53-835769],
++        [enable workaround for AArch64 Cortex-A53 erratum 835769 by default])
++AS_HELP_STRING([--disable-fix-cortex-a53-835769],
++        [disable workaround for AArch64 Cortex-A53 erratum 835769 by default])
++    ],
++      [
++        case $enableval in
++          yes)
++            tm_defines="${tm_defines} TARGET_FIX_ERR_A53_835769_DEFAULT=1"
++            ;;
++          no)
++            ;;
++          *)
++            AC_MSG_ERROR(['$enableval' is an invalid value for --enable-fix-cortex-a53-835769.\
++  Valid choices are 'yes' and 'no'.])
++            ;;
++
++        esac
++      ],
++    [])
++  ;;
+   # All TARGET_ABI_OSF targets.
+   alpha*-*-linux* | alpha*-*-*bsd*)
+     gcc_GAS_CHECK_FEATURE([explicit relocation support],
+Index: gcc/function.c
+===================================================================
+--- gcc/function.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/function.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1354,9 +1354,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
+@@ -1368,12 +1372,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)  \
+@@ -2211,8 +2215,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
+ }
+@@ -4518,6 +4523,7 @@
+       /* ??? This could be set on a per-function basis by the front-end
+          but is this worth the hassle?  */
+       cfun->can_throw_non_call_exceptions = flag_non_call_exceptions;
++      cfun->can_delete_dead_exceptions = flag_delete_dead_exceptions;
+     }
+ }
+Index: gcc/tree-vectorizer.h
+===================================================================
+--- gcc/tree-vectorizer.h      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-vectorizer.h      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -324,9 +324,9 @@
+ #define LOOP_VINFO_OPERANDS_SWAPPED(L)     (L)->operands_swapped
+ #define LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT(L) \
+-(L)->may_misalign_stmts.length () > 0
++((L)->may_misalign_stmts.length () > 0)
+ #define LOOP_REQUIRES_VERSIONING_FOR_ALIAS(L)     \
+-(L)->may_alias_ddrs.length () > 0
++((L)->may_alias_ddrs.length () > 0)
+ #define NITERS_KNOWN_P(n)                     \
+ (host_integerp ((n),0)                        \
+@@ -931,7 +931,8 @@
+ extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *);
+ extern tree vect_create_data_ref_ptr (gimple, tree, struct loop *, tree,
+                                     tree *, gimple_stmt_iterator *,
+-                                    gimple *, bool, bool *);
++                                    gimple *, bool, bool *,
++                                    tree = NULL_TREE);
+ extern tree bump_vector_ptr (tree, gimple, gimple_stmt_iterator *, gimple, tree);
+ extern tree vect_create_destination_var (tree, tree);
+ extern bool vect_grouped_store_supported (tree, unsigned HOST_WIDE_INT);
+@@ -949,7 +950,8 @@
+ extern int vect_get_place_in_interleaving_chain (gimple, gimple);
+ extern tree vect_get_new_vect_var (tree, enum vect_var_kind, const char *);
+ extern tree vect_create_addr_base_for_vector_ref (gimple, gimple_seq *,
+-                                                  tree, struct loop *);
++                                                tree, struct loop *,
++                                                tree = NULL_TREE);
+ /* In tree-vect-loop.c.  */
+ /* FORNOW: Used in tree-parloops.c.  */
+Index: gcc/stor-layout.c
+===================================================================
+--- gcc/stor-layout.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/stor-layout.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -234,12 +234,7 @@
+       param_type = TREE_TYPE (ref);
+       param_decl
+       = build_decl (input_location, PARM_DECL, param_name, param_type);
+-      if (targetm.calls.promote_prototypes (NULL_TREE)
+-        && INTEGRAL_TYPE_P (param_type)
+-        && TYPE_PRECISION (param_type) < TYPE_PRECISION (integer_type_node))
+-      DECL_ARG_TYPE (param_decl) = integer_type_node;
+-      else
+-      DECL_ARG_TYPE (param_decl) = param_type;
++      DECL_ARG_TYPE (param_decl) = param_type;
+       DECL_ARTIFICIAL (param_decl) = 1;
+       TREE_READONLY (param_decl) = 1;
+Index: gcc/tree-vect-loop.c
+===================================================================
+--- gcc/tree-vect-loop.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-vect-loop.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2205,7 +2205,8 @@
+         }
+       def1 = SSA_NAME_DEF_STMT (op1);
+-      if (flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
++      if (gimple_bb (def1)
++        && flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
+           && loop->inner
+           && flow_bb_inside_loop_p (loop->inner, gimple_bb (def1))
+           && is_gimple_assign (def1))
+Index: gcc/tree-vect-data-refs.c
+===================================================================
+--- gcc/tree-vect-data-refs.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-vect-data-refs.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3553,6 +3553,9 @@
+           is as follows:
+           if LOOP=i_loop:     &in             (relative to i_loop)
+           if LOOP=j_loop:     &in+i*2B        (relative to j_loop)
++   BYTE_OFFSET: Optional, defaulted to NULL.  If supplied, it is added to the
++          initial address.  Unlike OFFSET, which is number of elements to
++          be added, BYTE_OFFSET is measured in bytes.
+    Output:
+    1. Return an SSA_NAME whose value is the address of the memory location of
+@@ -3566,7 +3569,8 @@
+ vect_create_addr_base_for_vector_ref (gimple stmt,
+                                     gimple_seq *new_stmt_list,
+                                     tree offset,
+-                                    struct loop *loop)
++                                    struct loop *loop,
++                                    tree byte_offset)
+ {
+   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
+@@ -3628,7 +3632,17 @@
+       base_offset = force_gimple_operand (base_offset, &seq, false, tmp);
+       gimple_seq_add_seq (new_stmt_list, seq);
+     }
++  if (byte_offset)
++    {
++      tree tmp = create_tmp_var (sizetype, "offset");
++      byte_offset = fold_convert (sizetype, byte_offset);
++      base_offset = fold_build2 (PLUS_EXPR, sizetype,
++                               base_offset, byte_offset);
++      base_offset = force_gimple_operand (base_offset, &seq, false, tmp);
++      gimple_seq_add_seq (new_stmt_list, seq);
++    }
++
+   /* base + base_offset */
+   if (loop_vinfo)
+     addr_base = fold_build_pointer_plus (data_ref_base, base_offset);
+@@ -3692,6 +3706,10 @@
+    5. BSI: location where the new stmts are to be placed if there is no loop
+    6. ONLY_INIT: indicate if ap is to be updated in the loop, or remain
+         pointing to the initial address.
++   7. BYTE_OFFSET (optional, defaults to NULL): a byte offset to be added
++      to the initial address accessed by the data-ref in STMT.  This is
++      similar to OFFSET, but OFFSET is counted in elements, while BYTE_OFFSET
++      in bytes.
+    Output:
+    1. Declare a new ptr to vector_type, and have it point to the base of the
+@@ -3705,6 +3723,8 @@
+          initial_address = &a[init];
+       if OFFSET is supplied:
+          initial_address = &a[init + OFFSET];
++      if BYTE_OFFSET is supplied:
++       initial_address = &a[init] + BYTE_OFFSET;
+       Return the initial_address in INITIAL_ADDRESS.
+@@ -3722,7 +3742,7 @@
+ vect_create_data_ref_ptr (gimple stmt, tree aggr_type, struct loop *at_loop,
+                         tree offset, tree *initial_address,
+                         gimple_stmt_iterator *gsi, gimple *ptr_incr,
+-                        bool only_init, bool *inv_p)
++                        bool only_init, bool *inv_p, tree byte_offset)
+ {
+   const char *base_name;
+   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+@@ -3881,10 +3901,10 @@
+   /* (2) Calculate the initial address of the aggregate-pointer, and set
+      the aggregate-pointer to point to it before the loop.  */
+-  /* Create: (&(base[init_val+offset]) in the loop preheader.  */
++  /* Create: (&(base[init_val+offset]+byte_offset) in the loop preheader.  */
+   new_temp = vect_create_addr_base_for_vector_ref (stmt, &new_stmt_list,
+-                                                   offset, loop);
++                                                 offset, loop, byte_offset);
+   if (new_stmt_list)
+     {
+       if (pe)
+Index: gcc/emit-rtl.c
+===================================================================
+--- gcc/emit-rtl.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/emit-rtl.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -263,7 +263,7 @@
+ /* Return true if the given memory attributes are equal.  */
+-static bool
++bool
+ mem_attrs_eq_p (const struct mem_attrs *p, const struct mem_attrs *q)
+ {
+   return (p->alias == q->alias
+Index: gcc/gimple-fold.c
+===================================================================
+--- gcc/gimple-fold.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/gimple-fold.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2955,8 +2955,8 @@
+      result.  */
+   if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor)) && !offset
+       /* VIEW_CONVERT_EXPR is defined only for matching sizes.  */
+-      && operand_equal_p (TYPE_SIZE (type),
+-                        TYPE_SIZE (TREE_TYPE (ctor)), 0))
++      && !compare_tree_int (TYPE_SIZE (type), size)
++      && !compare_tree_int (TYPE_SIZE (TREE_TYPE (ctor)), size))
+     {
+       ret = canonicalize_constructor_val (unshare_expr (ctor), from_decl);
+       ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
+Index: gcc/emit-rtl.h
+===================================================================
+--- gcc/emit-rtl.h     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/emit-rtl.h     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -20,6 +20,9 @@
+ #ifndef GCC_EMIT_RTL_H
+ #define GCC_EMIT_RTL_H
++/* Return whether two MEM_ATTRs are equal.  */
++bool mem_attrs_eq_p (const struct mem_attrs *, const struct mem_attrs *);
++
+ /* Set the alias set of MEM to SET.  */
+ extern void set_mem_alias_set (rtx, alias_set_type);
+Index: gcc/tree-cfgcleanup.c
+===================================================================
+--- gcc/tree-cfgcleanup.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-cfgcleanup.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -498,7 +498,20 @@
+   /* First split basic block if stmt is not last.  */
+   if (stmt != gsi_stmt (gsi_last_bb (bb)))
+-    split_block (bb, stmt);
++    {
++      if (stmt == gsi_stmt (gsi_last_nondebug_bb (bb)))
++      {
++        /* Don't split if there are only debug stmts
++           after stmt, that can result in -fcompare-debug
++           failures.  Remove the debug stmts instead,
++           they should be all unreachable anyway.  */
++        gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
++        for (gsi_next (&gsi); !gsi_end_p (gsi); )
++          gsi_remove (&gsi, true);
++      }
++      else
++      split_block (bb, stmt);
++    }
+   changed |= remove_fallthru_edge (bb->succs);
+Index: gcc/tree-sra.c
+===================================================================
+--- gcc/tree-sra.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-sra.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1030,6 +1030,11 @@
+                              "component.");
+       return NULL;
+     }
++  if (TREE_THIS_VOLATILE (expr))
++    {
++      disqualify_base_of_expr (expr, "part of a volatile reference.");
++      return NULL;
++    }
+   switch (TREE_CODE (expr))
+     {
+Index: gcc/common.opt
+===================================================================
+--- gcc/common.opt     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/common.opt     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1226,6 +1226,10 @@
+ Common Report Var(flag_tm)
+ Enable support for GNU transactional memory
++fgnu-unique
++Common Report Var(flag_gnu_unique) Init(1)
++Use STB_GNU_UNIQUE if supported by the assembler
++
+ floop-flatten
+ Common Ignore
+ Does nothing. Preserved for backward compatibility.
+Index: gcc/tree-vect-patterns.c
+===================================================================
+--- gcc/tree-vect-patterns.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-vect-patterns.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -395,7 +395,7 @@
+           || !promotion)
+         return NULL;
+       oprnd00 = gimple_assign_rhs1 (def_stmt);
+-      if (!type_conversion_p (oprnd0, stmt, true, &half_type1, &def_stmt,
++      if (!type_conversion_p (oprnd1, stmt, true, &half_type1, &def_stmt,
+                                 &promotion)
+           || !promotion)
+         return NULL;
+Index: gcc/sched-deps.c
+===================================================================
+--- gcc/sched-deps.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/sched-deps.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2744,7 +2744,8 @@
+          Consider for instance a volatile asm that changes the fpu rounding
+          mode.  An insn should not be moved across this even if it only uses
+          pseudo-regs because it might give an incorrectly rounded result.  */
+-      if (code != ASM_OPERANDS || MEM_VOLATILE_P (x))
++      if ((code != ASM_OPERANDS || MEM_VOLATILE_P (x))
++          && !DEBUG_INSN_P (insn))
+         reg_pending_barrier = TRUE_BARRIER;
+       /* For all ASM_OPERANDS, we must traverse the vector of input operands.
+Index: gcc/tree-vect-stmts.c
+===================================================================
+--- gcc/tree-vect-stmts.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-vect-stmts.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -4319,6 +4319,7 @@
+   int i, j, group_size;
+   tree msq = NULL_TREE, lsq;
+   tree offset = NULL_TREE;
++  tree byte_offset = NULL_TREE;
+   tree realignment_token = NULL_TREE;
+   gimple phi = NULL;
+   vec<tree> dr_chain = vNULL;
+@@ -4934,7 +4935,8 @@
+       if (alignment_support_scheme == dr_explicit_realign_optimized)
+       {
+         phi = SSA_NAME_DEF_STMT (msq);
+-        offset = size_int (TYPE_VECTOR_SUBPARTS (vectype) - 1);
++        byte_offset = size_binop (MINUS_EXPR, TYPE_SIZE_UNIT (vectype),
++                                  size_one_node);
+       }
+     }
+   else
+@@ -4955,7 +4957,8 @@
+       if (j == 0)
+         dataref_ptr = vect_create_data_ref_ptr (first_stmt, aggr_type, at_loop,
+                                               offset, &dummy, gsi,
+-                                              &ptr_incr, false, &inv_p);
++                                              &ptr_incr, false, &inv_p,
++                                              byte_offset);
+       else
+         dataref_ptr = bump_vector_ptr (dataref_ptr, ptr_incr, gsi, stmt,
+                                      TYPE_SIZE_UNIT (aggr_type));
+Index: gcc/config/alpha/elf.h
+===================================================================
+--- gcc/config/alpha/elf.h     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/alpha/elf.h     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -126,6 +126,10 @@
+   "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+    %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
++/* This variable should be set to 'true' if the target ABI requires
++   unwinding tables even when exceptions are not used.  */
++#define TARGET_UNWIND_TABLES_DEFAULT true
++
+ /* Select a format to encode pointers in exception handling data.  CODE
+    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
+    true if the symbol may be affected by dynamic relocations.
+Index: gcc/config/alpha/alpha.c
+===================================================================
+--- gcc/config/alpha/alpha.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/alpha/alpha.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -8658,6 +8658,11 @@
+                       }
+                     break;
++                  case BARRIER:
++                    /* __builtin_unreachable can expand to no code at all,
++                       leaving (barrier) RTXes in the instruction stream.  */
++                    goto close_shadow_notrapb;
++
+                   case JUMP_INSN:
+                   case CALL_INSN:
+                   case CODE_LABEL:
+@@ -8673,6 +8678,7 @@
+                 n = emit_insn_before (gen_trapb (), i);
+                 PUT_MODE (n, TImode);
+                 PUT_MODE (i, TImode);
++              close_shadow_notrapb:
+                 trap_pending = 0;
+                 shadow.used.i = 0;
+                 shadow.used.fp = 0;
+Index: gcc/config/elfos.h
+===================================================================
+--- gcc/config/elfos.h (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/elfos.h (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -287,7 +287,7 @@
+ /* Write the extra assembler code needed to declare an object properly.  */
+ #ifdef HAVE_GAS_GNU_UNIQUE_OBJECT
+-#define USE_GNU_UNIQUE_OBJECT 1
++#define USE_GNU_UNIQUE_OBJECT flag_gnu_unique
+ #else
+ #define USE_GNU_UNIQUE_OBJECT 0
+ #endif
+Index: gcc/config/sparc/sync.md
+===================================================================
+--- gcc/config/sparc/sync.md   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/sparc/sync.md   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -64,11 +64,19 @@
+   "stbar"
+   [(set_attr "type" "multi")])
++;; For LEON3, STB has the effect of membar #StoreLoad.
++(define_insn "*membar_storeload_leon3"
++  [(set (match_operand:BLK 0 "" "")
++      (unspec:BLK [(match_dup 0) (const_int 2)] UNSPEC_MEMBAR))]
++  "TARGET_LEON3"
++  "stb\t%%g0, [%%sp-1]"
++  [(set_attr "type" "store")])
++
+ ;; For V8, LDSTUB has the effect of membar #StoreLoad.
+ (define_insn "*membar_storeload"
+   [(set (match_operand:BLK 0 "" "")
+       (unspec:BLK [(match_dup 0) (const_int 2)] UNSPEC_MEMBAR))]
+-  "TARGET_V8"
++  "TARGET_V8 && !TARGET_LEON3"
+   "ldstub\t[%%sp-1], %%g0"
+   [(set_attr "type" "multi")])
+Index: gcc/config/i386/i386.md
+===================================================================
+--- gcc/config/i386/i386.md    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/i386/i386.md    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -5339,66 +5339,37 @@
+ ;; Avoid store forwarding (partial memory) stall penalty by extending
+ ;; SImode value to DImode through XMM register instead of pushing two
+-;; SImode values to stack. Note that even !TARGET_INTER_UNIT_MOVES
+-;; targets benefit from this optimization. Also note that fild
+-;; loads from memory only.
++;; SImode values to stack. Also note that fild loads from memory only.
+-(define_insn "*floatunssi<mode>2_1"
+-  [(set (match_operand:X87MODEF 0 "register_operand" "=f,f")
++(define_insn_and_split "*floatunssi<mode>2_i387_with_xmm"
++  [(set (match_operand:X87MODEF 0 "register_operand" "=f")
+       (unsigned_float:X87MODEF
+-        (match_operand:SI 1 "nonimmediate_operand" "x,m")))
+-   (clobber (match_operand:DI 2 "memory_operand" "=m,m"))
+-   (clobber (match_scratch:SI 3 "=X,x"))]
++        (match_operand:SI 1 "nonimmediate_operand" "rm")))
++   (clobber (match_scratch:DI 3 "=x"))
++   (clobber (match_operand:DI 2 "memory_operand" "=m"))]
+   "!TARGET_64BIT
+    && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
+-   && TARGET_SSE"
++   && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES"
+   "#"
++  "&& reload_completed"
++  [(set (match_dup 3) (zero_extend:DI (match_dup 1)))
++   (set (match_dup 2) (match_dup 3))
++   (set (match_dup 0)
++      (float:X87MODEF (match_dup 2)))]
++  ""
+   [(set_attr "type" "multi")
+    (set_attr "mode" "<MODE>")])
+-(define_split
+-  [(set (match_operand:X87MODEF 0 "register_operand")
+-      (unsigned_float:X87MODEF
+-        (match_operand:SI 1 "register_operand")))
+-   (clobber (match_operand:DI 2 "memory_operand"))
+-   (clobber (match_scratch:SI 3))]
+-  "!TARGET_64BIT
+-   && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
+-   && TARGET_SSE
+-   && reload_completed"
+-  [(set (match_dup 2) (match_dup 1))
+-   (set (match_dup 0)
+-      (float:X87MODEF (match_dup 2)))]
+-  "operands[1] = simplify_gen_subreg (DImode, operands[1], SImode, 0);")
+-
+-(define_split
+-  [(set (match_operand:X87MODEF 0 "register_operand")
+-      (unsigned_float:X87MODEF
+-        (match_operand:SI 1 "memory_operand")))
+-   (clobber (match_operand:DI 2 "memory_operand"))
+-   (clobber (match_scratch:SI 3))]
+-  "!TARGET_64BIT
+-   && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
+-   && TARGET_SSE
+-   && reload_completed"
+-  [(set (match_dup 2) (match_dup 3))
+-   (set (match_dup 0)
+-      (float:X87MODEF (match_dup 2)))]
+-{
+-  emit_move_insn (operands[3], operands[1]);
+-  operands[3] = simplify_gen_subreg (DImode, operands[3], SImode, 0);
+-})
+-
+ (define_expand "floatunssi<mode>2"
+   [(parallel
+      [(set (match_operand:X87MODEF 0 "register_operand")
+          (unsigned_float:X87MODEF
+            (match_operand:SI 1 "nonimmediate_operand")))
+-      (clobber (match_dup 2))
+-      (clobber (match_scratch:SI 3))])]
++      (clobber (match_scratch:DI 3))
++      (clobber (match_dup 2))])]
+   "!TARGET_64BIT
+    && ((TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
+-      && TARGET_SSE)
++      && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES)
+        || (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))"
+ {
+   if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+@@ -13545,7 +13516,8 @@
+    (set (reg:CCFP FPSR_REG)
+       (unspec:CCFP [(match_dup 2) (match_dup 3)]
+                    UNSPEC_C2_FLAG))]
+-  "TARGET_USE_FANCY_MATH_387"
++  "TARGET_USE_FANCY_MATH_387
++   && flag_finite_math_only"
+   "fprem"
+   [(set_attr "type" "fpspc")
+    (set_attr "mode" "XF")])
+@@ -13554,7 +13526,8 @@
+   [(use (match_operand:XF 0 "register_operand"))
+    (use (match_operand:XF 1 "general_operand"))
+    (use (match_operand:XF 2 "general_operand"))]
+-  "TARGET_USE_FANCY_MATH_387"
++  "TARGET_USE_FANCY_MATH_387
++   && flag_finite_math_only"
+ {
+   rtx label = gen_label_rtx ();
+@@ -13577,7 +13550,8 @@
+   [(use (match_operand:MODEF 0 "register_operand"))
+    (use (match_operand:MODEF 1 "general_operand"))
+    (use (match_operand:MODEF 2 "general_operand"))]
+-  "TARGET_USE_FANCY_MATH_387"
++  "TARGET_USE_FANCY_MATH_387
++   && flag_finite_math_only"
+ {
+   rtx (*gen_truncxf) (rtx, rtx);
+@@ -13616,7 +13590,8 @@
+    (set (reg:CCFP FPSR_REG)
+       (unspec:CCFP [(match_dup 2) (match_dup 3)]
+                    UNSPEC_C2_FLAG))]
+-  "TARGET_USE_FANCY_MATH_387"
++  "TARGET_USE_FANCY_MATH_387
++   && flag_finite_math_only"
+   "fprem1"
+   [(set_attr "type" "fpspc")
+    (set_attr "mode" "XF")])
+@@ -13625,7 +13600,8 @@
+   [(use (match_operand:XF 0 "register_operand"))
+    (use (match_operand:XF 1 "general_operand"))
+    (use (match_operand:XF 2 "general_operand"))]
+-  "TARGET_USE_FANCY_MATH_387"
++  "TARGET_USE_FANCY_MATH_387
++   && flag_finite_math_only"
+ {
+   rtx label = gen_label_rtx ();
+@@ -13648,7 +13624,8 @@
+   [(use (match_operand:MODEF 0 "register_operand"))
+    (use (match_operand:MODEF 1 "general_operand"))
+    (use (match_operand:MODEF 2 "general_operand"))]
+-  "TARGET_USE_FANCY_MATH_387"
++  "TARGET_USE_FANCY_MATH_387
++   && flag_finite_math_only"
+ {
+   rtx (*gen_truncxf) (rtx, rtx);
+Index: gcc/config/i386/driver-i386.c
+===================================================================
+--- gcc/config/i386/driver-i386.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/i386/driver-i386.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -713,6 +713,11 @@
+                   /* Assume Core 2.  */
+                   cpu = "core2";
+               }
++            else if (has_longmode)
++              /* Perhaps some emulator?  Assume x86-64, otherwise gcc
++                 -march=native would be unusable for 64-bit compilations,
++                 as all the CPUs below are 32-bit only.  */
++              cpu = "x86-64";
+             else if (has_sse3)
+               /* It is Core Duo.  */
+               cpu = "pentium-m";
+Index: gcc/config/i386/i386.c
+===================================================================
+--- gcc/config/i386/i386.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/i386/i386.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -20505,7 +20505,7 @@
+         t1 = gen_reg_rtx (V32QImode);
+         t2 = gen_reg_rtx (V32QImode);
+         t3 = gen_reg_rtx (V32QImode);
+-        vt2 = GEN_INT (128);
++        vt2 = GEN_INT (-128);
+         for (i = 0; i < 32; i++)
+           vec[i] = vt2;
+         vt = gen_rtx_CONST_VECTOR (V32QImode, gen_rtvec_v (32, vec));
+@@ -24640,13 +24640,17 @@
+             {
+               edge e;
+               edge_iterator ei;
+-              /* Assume that region is SCC, i.e. all immediate predecessors
+-                 of non-head block are in the same region.  */
++
++              /* Regions are SCCs with the exception of selective
++                 scheduling with pipelining of outer blocks enabled.
++                 So also check that immediate predecessors of a non-head
++                 block are in the same region.  */
+               FOR_EACH_EDGE (e, ei, bb->preds)
+                 {
+                   /* Avoid creating of loop-carried dependencies through
+-                     using topological odering in region.  */
+-                  if (BLOCK_TO_BB (bb->index) > BLOCK_TO_BB (e->src->index))
++                     using topological ordering in the region.  */
++                  if (rgn == CONTAINING_RGN (e->src->index)
++                      && BLOCK_TO_BB (bb->index) > BLOCK_TO_BB (e->src->index))
+                     add_dependee_for_func_arg (first_arg, e->src); 
+                 }
+             }
+@@ -38807,8 +38811,8 @@
+             op0 = gen_lowpart (V4DImode, d->op0);
+             op1 = gen_lowpart (V4DImode, d->op1);
+             rperm[0]
+-              = GEN_INT (((d->perm[0] & (nelt / 2)) ? 1 : 0)
+-                         || ((d->perm[nelt / 2] & (nelt / 2)) ? 2 : 0));
++              = GEN_INT ((d->perm[0] / (nelt / 2))
++                         | ((d->perm[nelt / 2] / (nelt / 2)) * 16));
+             emit_insn (gen_avx2_permv2ti (target, op0, op1, rperm[0]));
+             return true;
+           }
+Index: gcc/config/sh/sh.c
+===================================================================
+--- gcc/config/sh/sh.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/sh/sh.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -808,6 +808,12 @@
+        targetm.asm_out.aligned_op.di = NULL;
+        targetm.asm_out.unaligned_op.di = NULL;
+     }
++
++  /* User/priviledged mode is supported only on SH3*, SH4* and SH5*.
++     Disable it for everything else.  */
++  if (! (TARGET_SH3 || TARGET_SH5) && TARGET_USERMODE)
++    TARGET_USERMODE = false;
++
+   if (TARGET_SH1)
+     {
+       if (! strcmp (sh_div_str, "call-div1"))
+Index: gcc/config/sh/sync.md
+===================================================================
+--- gcc/config/sh/sync.md      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/sh/sync.md      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -466,6 +466,7 @@
+    (set (mem:SI (match_dup 1))
+       (unspec:SI
+         [(match_operand:SI 2 "arith_operand" "rI08")] UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))]
+   "TARGET_ATOMIC_HARD_LLCS
+    || (TARGET_SH4A_ARCH && TARGET_ATOMIC_ANY && !TARGET_ATOMIC_STRICT)"
+@@ -484,6 +485,7 @@
+    (set (mem:QIHI (match_dup 1))
+       (unspec:QIHI
+         [(match_operand:QIHI 2 "register_operand" "r")] UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))
+    (clobber (match_scratch:SI 3 "=&r"))
+    (clobber (match_scratch:SI 4 "=1"))]
+@@ -617,6 +619,7 @@
+         [(FETCHOP:SI (mem:SI (match_dup 1))
+            (match_operand:SI 2 "<fetchop_predicate>" "<fetchop_constraint>"))]
+         UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))]
+   "TARGET_ATOMIC_HARD_LLCS
+    || (TARGET_SH4A_ARCH && TARGET_ATOMIC_ANY && !TARGET_ATOMIC_STRICT)"
+@@ -637,6 +640,7 @@
+         [(FETCHOP:QIHI (mem:QIHI (match_dup 1))
+            (match_operand:QIHI 2 "<fetchop_predicate>" "<fetchop_constraint>"))]
+         UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))
+    (clobber (match_scratch:SI 3 "=&r"))
+    (clobber (match_scratch:SI 4 "=1"))]
+@@ -784,6 +788,7 @@
+         [(not:SI (and:SI (mem:SI (match_dup 1))
+                  (match_operand:SI 2 "logical_operand" "rK08")))]
+         UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))]
+   "TARGET_ATOMIC_HARD_LLCS
+    || (TARGET_SH4A_ARCH && TARGET_ATOMIC_ANY && !TARGET_ATOMIC_STRICT)"
+@@ -805,6 +810,7 @@
+         [(not:QIHI (and:QIHI (mem:QIHI (match_dup 1))
+                    (match_operand:QIHI 2 "logical_operand" "rK08")))]
+         UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))
+    (clobber (match_scratch:SI 3 "=&r"))
+    (clobber (match_scratch:SI 4 "=1"))]
+@@ -903,7 +909,7 @@
+        "      and     %0,%3"                  "\n"
+        "      not     %3,%3"                  "\n"
+        "      mov.<bwl>       %3,@%1"         "\n"
+-       "      stc     %4,sr";
++       "      ldc     %4,sr";
+ }
+   [(set_attr "length" "20")])
+@@ -960,7 +966,8 @@
+    (set (mem:SI (match_dup 1))
+       (unspec:SI
+         [(FETCHOP:SI (mem:SI (match_dup 1)) (match_dup 2))]
+-        UNSPEC_ATOMIC))]
++        UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))]
+   "TARGET_ATOMIC_HARD_LLCS
+    || (TARGET_SH4A_ARCH && TARGET_ATOMIC_ANY && !TARGET_ATOMIC_STRICT)"
+ {
+@@ -980,6 +987,7 @@
+       (unspec:QIHI
+         [(FETCHOP:QIHI (mem:QIHI (match_dup 1)) (match_dup 2))]
+         UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))
+    (clobber (match_scratch:SI 3 "=&r"))
+    (clobber (match_scratch:SI 4 "=1"))]
+@@ -1124,7 +1132,8 @@
+    (set (mem:SI (match_dup 1))
+       (unspec:SI
+         [(not:SI (and:SI (mem:SI (match_dup 1)) (match_dup 2)))]
+-        UNSPEC_ATOMIC))]
++        UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))]
+   "TARGET_ATOMIC_HARD_LLCS
+    || (TARGET_SH4A_ARCH && TARGET_ATOMIC_ANY && !TARGET_ATOMIC_STRICT)"
+ {
+@@ -1145,6 +1154,7 @@
+       (unspec:QIHI
+         [(not:QIHI (and:QIHI (mem:QIHI (match_dup 1)) (match_dup 2)))]
+         UNSPEC_ATOMIC))
++   (set (reg:SI T_REG) (const_int 1))
+    (clobber (reg:SI R0_REG))
+    (clobber (match_scratch:SI 3 "=&r"))
+    (clobber (match_scratch:SI 4 "=1"))]
+@@ -1353,7 +1363,7 @@
+        "      ldc     r0,sr"          "\n"
+        "      mov.b   @%0,r0"         "\n"
+        "      mov.b   %1,@%0"         "\n"
+-       "      stc     %2,sr"          "\n"
++       "      ldc     %2,sr"          "\n"
+        "      tst     r0,r0";
+ }
+   [(set_attr "length" "16")])
+Index: gcc/config/sh/sh.opt
+===================================================================
+--- gcc/config/sh/sh.opt       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/sh/sh.opt       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -343,7 +343,7 @@
+ Cost to assume for a multiply insn
+ musermode
+-Target Report RejectNegative Var(TARGET_USERMODE)
++Target Var(TARGET_USERMODE)
+ Don't generate privileged-mode only code; implies -mno-inline-ic_invalidate if the inline code would not work in user mode.
+ ;; We might want to enable this by default for TARGET_HARD_SH4, because
+Index: gcc/config/microblaze/predicates.md
+===================================================================
+--- gcc/config/microblaze/predicates.md        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/microblaze/predicates.md        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -85,10 +85,6 @@
+   (ior (match_operand 0 "const_0_operand")
+        (match_operand 0 "register_operand")))
+-(define_predicate "reg_or_mem_operand"
+-  (ior (match_operand 0 "memory_operand")
+-       (match_operand 0 "register_operand")))
+-
+ ;;  Return if the operand is either the PC or a label_ref.  
+ (define_special_predicate "pc_or_label_operand"
+   (ior (match_code "pc,label_ref")
+Index: gcc/config/microblaze/microblaze.md
+===================================================================
+--- gcc/config/microblaze/microblaze.md        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/microblaze/microblaze.md        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1119,18 +1119,6 @@
+   }
+ )
+-;;Load and store reverse
+-(define_insn "movsi4_rev"
+-  [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,Q")
+-        (bswap:SI (match_operand:SF 1 "reg_or_mem_operand" "Q,r")))]
+-  "TARGET_REORDER"
+-  "@
+-   lwr\t%0,%y1,r0
+-   swr\t%1,%y0,r0"
+-  [(set_attr "type"     "load,store")
+-  (set_attr "mode"      "SI")
+-  (set_attr "length"    "4,4")])
+-
+ ;; 32-bit floating point moves
+ (define_expand "movsf"
+Index: gcc/config/avr/avr-fixed.md
+===================================================================
+--- gcc/config/avr/avr-fixed.md        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/avr/avr-fixed.md        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -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
+===================================================================
+--- gcc/config/avr/avr.md      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/avr/avr.md      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -367,6 +367,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);
+Index: gcc/config/avr/avr.h
+===================================================================
+--- gcc/config/avr/avr.h       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/avr/avr.h       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -250,18 +250,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/aarch64/arm_neon.h
+===================================================================
+--- gcc/config/aarch64/arm_neon.h      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/aarch64/arm_neon.h      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -13815,7 +13815,7 @@
+   int16x4_t result;
+   __asm__ ("sqdmulh %0.4h,%1.4h,%2.h[0]"
+            : "=w"(result)
+-           : "w"(a), "w"(b)
++           : "w"(a), "x"(b)
+            : /* No clobbers */);
+   return result;
+ }
+@@ -13837,7 +13837,7 @@
+   int16x8_t result;
+   __asm__ ("sqdmulh %0.8h,%1.8h,%2.h[0]"
+            : "=w"(result)
+-           : "w"(a), "w"(b)
++           : "w"(a), "x"(b)
+            : /* No clobbers */);
+   return result;
+ }
+Index: gcc/config/aarch64/aarch64.md
+===================================================================
+--- gcc/config/aarch64/aarch64.md      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/aarch64/aarch64.md      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3292,6 +3292,7 @@
+         (unspec:DI [(match_operand:DI 0 "aarch64_valid_symref" "S")]
+                  UNSPEC_TLSDESC))
+    (clobber (reg:DI LR_REGNUM))
++   (clobber (reg:CC CC_REGNUM))
+    (clobber (match_scratch:DI 1 "=r"))]
+   "TARGET_TLS_DESC"
+   "adrp\\tx0, %A0\;ldr\\t%1, [x0, #%L0]\;add\\tx0, x0, %L0\;.tlsdesccall\\t%0\;blr\\t%1"
+Index: gcc/config/aarch64/aarch64.opt
+===================================================================
+--- gcc/config/aarch64/aarch64.opt     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/aarch64/aarch64.opt     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -67,6 +67,10 @@
+ Target Report RejectNegative Mask(GENERAL_REGS_ONLY)
+ Generate code which uses only the general registers
++mfix-cortex-a53-835769
++Target Report Var(aarch64_fix_a53_err835769) Init(2)
++Workaround for ARM Cortex-A53 Erratum number 835769
++
+ mlittle-endian
+ Target Report RejectNegative InverseMask(BIG_END)
+ Assume target CPU is configured as little endian
+Index: gcc/config/aarch64/aarch64-protos.h
+===================================================================
+--- gcc/config/aarch64/aarch64-protos.h        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/aarch64/aarch64-protos.h        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -247,6 +247,8 @@
+ extern void aarch64_split_combinev16qi (rtx operands[3]);
+ extern void aarch64_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
++extern bool aarch64_madd_needs_nop (rtx);
++extern void aarch64_final_prescan_insn (rtx);
+ extern bool
+ aarch64_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
+Index: gcc/config/aarch64/aarch64.c
+===================================================================
+--- gcc/config/aarch64/aarch64.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/aarch64/aarch64.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1201,6 +1201,7 @@
+   CUMULATIVE_ARGS *pcum = get_cumulative_args (pcum_v);
+   int ncrn, nvrn, nregs;
+   bool allocate_ncrn, allocate_nvrn;
++  HOST_WIDE_INT size;
+   /* We need to do this once per argument.  */
+   if (pcum->aapcs_arg_processed)
+@@ -1208,6 +1209,11 @@
+   pcum->aapcs_arg_processed = true;
++  /* Size in bytes, rounded to the nearest multiple of 8 bytes.  */
++  size
++    = AARCH64_ROUND_UP (type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode),
++                      UNITS_PER_WORD);
++
+   allocate_ncrn = (type) ? !(FLOAT_TYPE_P (type)) : !FLOAT_MODE_P (mode);
+   allocate_nvrn = aarch64_vfp_is_call_candidate (pcum_v,
+                                                mode,
+@@ -1258,10 +1264,8 @@
+     }
+   ncrn = pcum->aapcs_ncrn;
+-  nregs = ((type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode))
+-         + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
++  nregs = size / UNITS_PER_WORD;
+-
+   /* C6 - C9.  though the sign and zero extension semantics are
+      handled elsewhere.  This is the case where the argument fits
+      entirely general registers.  */
+@@ -1309,13 +1313,12 @@
+   pcum->aapcs_nextncrn = NUM_ARG_REGS;
+   /* The argument is passed on stack; record the needed number of words for
+-     this argument (we can re-use NREGS) and align the total size if
+-     necessary.  */
++     this argument and align the total size if necessary.  */
+ on_stack:
+-  pcum->aapcs_stack_words = nregs;
++  pcum->aapcs_stack_words = size / UNITS_PER_WORD;
+   if (aarch64_function_arg_alignment (mode, type) == 16 * BITS_PER_UNIT)
+     pcum->aapcs_stack_size = AARCH64_ROUND_UP (pcum->aapcs_stack_size,
+-                                             16 / UNITS_PER_WORD) + 1;
++                                             16 / UNITS_PER_WORD);
+   return;
+ }
+@@ -4845,6 +4848,15 @@
+   aarch64_tune = selected_tune->core;
+   aarch64_tune_params = selected_tune->tune;
++  if (aarch64_fix_a53_err835769 == 2)
++    {
++#ifdef TARGET_FIX_ERR_A53_835769_DEFAULT
++      aarch64_fix_a53_err835769 = 1;
++#else
++      aarch64_fix_a53_err835769 = 0;
++#endif
++    }
++
+   aarch64_override_options_after_change ();
+ }
+@@ -6037,6 +6049,135 @@
+   return NULL;
+ }
++
++/* Return true iff X is a MEM rtx.  */
++
++static int
++is_mem_p (rtx *x, void *data ATTRIBUTE_UNUSED)
++{
++  return MEM_P (*x);
++}
++
++
++/*  Return true if mem_insn contains a MEM RTX somewhere in it.  */
++
++static bool
++has_memory_op (rtx mem_insn)
++{
++   rtx pattern = PATTERN (mem_insn);
++   return for_each_rtx (&pattern, is_mem_p, NULL);
++}
++
++
++/* Find the first rtx before insn that will generate an assembly
++   instruction.  */
++
++static rtx
++aarch64_prev_real_insn (rtx insn)
++{
++  if (!insn)
++    return NULL;
++
++  do
++    {
++      insn = prev_real_insn (insn);
++    }
++  while (insn && recog_memoized (insn) < 0);
++
++  return insn;
++}
++
++/*  Return true iff t1 is the v8type of a multiply-accumulate instruction.  */
++
++static bool
++is_madd_op (enum attr_v8type t1)
++{
++  return t1 == V8TYPE_MADD
++         || t1 == V8TYPE_MADDL;
++}
++
++
++/* Check if there is a register dependency between a load and the insn
++   for which we hold recog_data.  */
++
++static bool
++dep_between_memop_and_curr (rtx memop)
++{
++  rtx load_reg;
++  int opno;
++
++  gcc_assert (GET_CODE (memop) == SET);
++
++  if (!REG_P (SET_DEST (memop)))
++    return false;
++
++  load_reg = SET_DEST (memop);
++  for (opno = 1; opno < recog_data.n_operands; opno++)
++    {
++      rtx operand = recog_data.operand[opno];
++      if (REG_P (operand)
++          && reg_overlap_mentioned_p (load_reg, operand))
++        return true;
++
++    }
++  return false;
++}
++
++
++
++/* When working around the Cortex-A53 erratum 835769,
++   given rtx_insn INSN, return true if it is a 64-bit multiply-accumulate
++   instruction and has a preceding memory instruction such that a NOP
++   should be inserted between them.  */
++
++bool
++aarch64_madd_needs_nop (rtx insn)
++{
++  enum attr_v8type attr_type;
++  rtx prev;
++  rtx body;
++
++  if (!aarch64_fix_a53_err835769)
++    return false;
++
++  if (recog_memoized (insn) < 0)
++    return false;
++
++  attr_type = get_attr_v8type (insn);
++  if (!is_madd_op (attr_type))
++    return false;
++
++  prev = aarch64_prev_real_insn (insn);
++  /* aarch64_prev_real_insn can call recog_memoized on insns other than INSN.
++     Restore recog state to INSN to avoid state corruption.  */
++  extract_constrain_insn_cached (insn);
++
++  if (!prev || !has_memory_op (prev))
++    return false;
++
++  body = single_set (prev);
++
++  /* If the previous insn is a memory op and there is no dependency between
++     it and the madd, emit a nop between them.  If we know it's a memop but
++     body is NULL, return true to be safe.  */
++  if (GET_MODE (recog_data.operand[0]) == DImode
++      && (!body || !dep_between_memop_and_curr (body)))
++    return true;
++
++  return false;
++
++}
++
++/* Implement FINAL_PRESCAN_INSN.  */
++
++void
++aarch64_final_prescan_insn (rtx insn)
++{
++  if (aarch64_madd_needs_nop (insn))
++    fprintf (asm_out_file, "\tnop // between mem op and mult-accumulate\n");
++}
++
++
+ /* Return the equivalent letter for size.  */
+ static unsigned char
+ sizetochar (int size)
+Index: gcc/config/aarch64/aarch64-linux.h
+===================================================================
+--- gcc/config/aarch64/aarch64-linux.h (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/aarch64/aarch64-linux.h (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -43,4 +43,6 @@
+     }                                         \
+   while (0)
++#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
++
+ #endif  /* GCC_AARCH64_LINUX_H */
+Index: gcc/config/aarch64/aarch64.h
+===================================================================
+--- gcc/config/aarch64/aarch64.h       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/aarch64/aarch64.h       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -465,6 +465,18 @@
+   (TARGET_CPU_generic | (AARCH64_CPU_DEFAULT_FLAGS << 6))
+ #endif
++/* If inserting NOP before a mult-accumulate insn remember to adjust the
++   length so that conditional branching code is updated appropriately.  */
++#define ADJUST_INSN_LENGTH(insn, length)      \
++  do                                          \
++    {                                         \
++      if (aarch64_madd_needs_nop (insn))      \
++        length += 4;                          \
++    } while (0)
++
++#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS)    \
++    aarch64_final_prescan_insn (INSN);                        \
++
+ /* The processor for which instructions should be scheduled.  */
+ extern enum aarch64_processor aarch64_tune;
+Index: gcc/config/rs6000/constraints.md
+===================================================================
+--- gcc/config/rs6000/constraints.md   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/constraints.md   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -65,6 +65,20 @@
+ (define_register_constraint "wg" "rs6000_constraints[RS6000_CONSTRAINT_wg]"
+   "If -mmfpgpr was used, a floating point register or NO_REGS.")
++(define_register_constraint "wh" "rs6000_constraints[RS6000_CONSTRAINT_wh]"
++  "Floating point register if direct moves are available, or NO_REGS.")
++
++;; At present, DImode is not allowed in the Altivec registers.  If in the
++;; future it is allowed, wi/wj can be set to VSX_REGS instead of FLOAT_REGS.
++(define_register_constraint "wi" "rs6000_constraints[RS6000_CONSTRAINT_wi]"
++  "FP or VSX register to hold 64-bit integers for VSX insns or NO_REGS.")
++
++(define_register_constraint "wj" "rs6000_constraints[RS6000_CONSTRAINT_wj]"
++  "FP or VSX register to hold 64-bit integers for direct moves or NO_REGS.")
++
++(define_register_constraint "wk" "rs6000_constraints[RS6000_CONSTRAINT_wk]"
++  "FP or VSX register to hold 64-bit doubles for direct moves or NO_REGS.")
++
+ (define_register_constraint "wl" "rs6000_constraints[RS6000_CONSTRAINT_wl]"
+   "Floating point register if the LFIWAX instruction is enabled or NO_REGS.")
+@@ -98,7 +112,7 @@
+   "Floating point register if the STFIWX instruction is enabled or NO_REGS.")
+ (define_register_constraint "wy" "rs6000_constraints[RS6000_CONSTRAINT_wy]"
+-  "VSX vector register to hold scalar float values or NO_REGS.")
++  "FP or VSX register to perform ISA 2.07 float ops or NO_REGS.")
+ (define_register_constraint "wz" "rs6000_constraints[RS6000_CONSTRAINT_wz]"
+   "Floating point register if the LFIWZX instruction is enabled or NO_REGS.")
+Index: gcc/config/rs6000/predicates.md
+===================================================================
+--- gcc/config/rs6000/predicates.md    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/predicates.md    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1795,7 +1795,7 @@
+ (define_predicate "fusion_gpr_mem_load"
+   (match_code "mem,sign_extend,zero_extend")
+ {
+-  rtx addr;
++  rtx addr, base, offset;
+   /* Handle sign/zero extend.  */
+   if (GET_CODE (op) == ZERO_EXTEND
+@@ -1825,24 +1825,79 @@
+     }
+   addr = XEXP (op, 0);
++  if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
++    return 0;
++
++  base = XEXP (addr, 0);
++  if (!base_reg_operand (base, GET_MODE (base)))
++    return 0;
++
++  offset = XEXP (addr, 1);
++
+   if (GET_CODE (addr) == PLUS)
++    return satisfies_constraint_I (offset);
++
++  else if (GET_CODE (addr) == LO_SUM)
+     {
+-      rtx base = XEXP (addr, 0);
+-      rtx offset = XEXP (addr, 1);
++      if (TARGET_XCOFF || (TARGET_ELF && TARGET_POWERPC64))
++      return small_toc_ref (offset, GET_MODE (offset));
+-      return (base_reg_operand (base, GET_MODE (base))
+-            && satisfies_constraint_I (offset));
++      else if (TARGET_ELF && !TARGET_POWERPC64)
++      return CONSTANT_P (offset);
+     }
+-  else if (GET_CODE (addr) == LO_SUM)
++  return 0;
++})
++
++;; Match a GPR load (lbz, lhz, lwz, ld) that uses a combined address in the
++;; memory field with both the addis and the memory offset.  Sign extension
++;; is not handled here, since lha and lwa are not fused.
++(define_predicate "fusion_gpr_mem_combo"
++  (match_code "mem,zero_extend")
++{
++  rtx addr, base, offset;
++
++  /* Handle zero extend.  */
++  if (GET_CODE (op) == ZERO_EXTEND)
+     {
+-      rtx base = XEXP (addr, 0);
+-      rtx offset = XEXP (addr, 1);
++      op = XEXP (op, 0);
++      mode = GET_MODE (op);
++    }
+-      if (!base_reg_operand (base, GET_MODE (base)))
++  if (!MEM_P (op))
++    return 0;
++
++  switch (mode)
++    {
++    case QImode:
++    case HImode:
++    case SImode:
++      break;
++
++    case DImode:
++      if (!TARGET_POWERPC64)
+       return 0;
++      break;
+-      else if (TARGET_XCOFF || (TARGET_ELF && TARGET_POWERPC64))
++    default:
++      return 0;
++    }
++
++  addr = XEXP (op, 0);
++  if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
++    return 0;
++
++  base = XEXP (addr, 0);
++  if (!fusion_gpr_addis (base, GET_MODE (base)))
++    return 0;
++
++  offset = XEXP (addr, 1);
++  if (GET_CODE (addr) == PLUS)
++    return satisfies_constraint_I (offset);
++
++  else if (GET_CODE (addr) == LO_SUM)
++    {
++      if (TARGET_XCOFF || (TARGET_ELF && TARGET_POWERPC64))
+       return small_toc_ref (offset, GET_MODE (offset));
+       else if (TARGET_ELF && !TARGET_POWERPC64)
+Index: gcc/config/rs6000/htm.md
+===================================================================
+--- gcc/config/rs6000/htm.md   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/htm.md   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -179,7 +179,7 @@
+                            (const_int 0)]
+                           UNSPECV_HTM_TABORTWCI))
+    (set (subreg:CC (match_dup 2) 0) (match_dup 1))
+-   (set (match_dup 3) (lshiftrt:SI (match_dup 2) (const_int 24)))
++   (set (match_dup 3) (lshiftrt:SI (match_dup 2) (const_int 28)))
+    (parallel [(set (match_operand:SI 0 "int_reg_operand" "")
+                  (and:SI (match_dup 3) (const_int 15)))
+               (clobber (scratch:CC))])]
+Index: gcc/config/rs6000/freebsd64.h
+===================================================================
+--- gcc/config/rs6000/freebsd64.h      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/freebsd64.h      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -367,7 +367,7 @@
+ /* PowerPC64 Linux word-aligns FP doubles when -malign-power is given.  */
+ #undef  ADJUST_FIELD_ALIGN
+ #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
+-  ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)     \
++  (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED))          \
+    ? 128                                                                \
+    : (TARGET_64BIT                                                      \
+       && TARGET_ALIGN_NATURAL == 0                                      \
+Index: gcc/config/rs6000/rs6000-protos.h
+===================================================================
+--- gcc/config/rs6000/rs6000-protos.h  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/rs6000-protos.h  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -79,9 +79,9 @@
+ extern bool gpr_or_gpr_p (rtx, rtx);
+ extern bool direct_move_p (rtx, rtx);
+ extern bool quad_load_store_p (rtx, rtx);
+-extern bool fusion_gpr_load_p (rtx *, bool);
++extern bool fusion_gpr_load_p (rtx, rtx, rtx, rtx);
+ extern void expand_fusion_gpr_load (rtx *);
+-extern const char *emit_fusion_gpr_load (rtx *);
++extern const char *emit_fusion_gpr_load (rtx, rtx);
+ extern enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx,
+                                                           enum reg_class);
+ extern enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
+@@ -153,6 +153,7 @@
+ #ifdef TREE_CODE
+ extern unsigned int rs6000_data_alignment (tree, unsigned int, enum data_align);
++extern bool rs6000_special_adjust_field_align_p (tree, unsigned int);
+ extern unsigned int rs6000_special_round_type_align (tree, unsigned int,
+                                                    unsigned int);
+ extern unsigned int darwin_rs6000_special_round_type_align (tree, unsigned int,
+@@ -161,7 +162,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/rs6000-builtin.def
+===================================================================
+--- gcc/config/rs6000/rs6000-builtin.def       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/rs6000-builtin.def       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -622,20 +622,13 @@
+                    | 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_BTM_HARD_FLOAT              /* MASK */      \
++                   | RS6000_BTM_LDBL128),                             \
+                   (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_BTC_ ## ATTR                /* ATTR */      \
+                    | RS6000_BTC_BINARY),                              \
+                   CODE_FOR_ ## ICODE)                 /* ICODE */
+@@ -1593,10 +1586,8 @@
+ 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)
+Index: gcc/config/rs6000/rs6000-c.c
+===================================================================
+--- gcc/config/rs6000/rs6000-c.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/rs6000-c.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -4126,7 +4126,8 @@
+      argument) is reversed.  Patch the arguments here before building
+      the resolved CALL_EXPR.  */
+   if (desc->code == ALTIVEC_BUILTIN_VEC_VCMPGE_P
+-      && desc->overloaded_code != ALTIVEC_BUILTIN_VCMPGEFP_P)
++      && desc->overloaded_code != ALTIVEC_BUILTIN_VCMPGEFP_P
++      && desc->overloaded_code != VSX_BUILTIN_XVCMPGEDP_P)
+     {
+       tree t;
+       t = args[2], args[2] = args[1], args[1] = t;
+@@ -4184,6 +4185,14 @@
+   if (TARGET_DEBUG_BUILTIN)
+     fprintf (stderr, "altivec_resolve_overloaded_builtin, code = %4d, %s\n",
+            (int)fcode, IDENTIFIER_POINTER (DECL_NAME (fndecl)));
++ 
++  /* vec_lvsl and vec_lvsr are deprecated for use with LE element order.  */
++  if (fcode == ALTIVEC_BUILTIN_VEC_LVSL && !VECTOR_ELT_ORDER_BIG)
++    warning (OPT_Wdeprecated, "vec_lvsl is deprecated for little endian; use \
++assignment for unaligned loads and stores");
++  else if (fcode == ALTIVEC_BUILTIN_VEC_LVSR && !VECTOR_ELT_ORDER_BIG)
++    warning (OPT_Wdeprecated, "vec_lvsr is deprecated for little endian; use \
++assignment for unaligned loads and stores");
+   /* For now treat vec_splats and vec_promote as the same.  */
+   if (fcode == ALTIVEC_BUILTIN_VEC_SPLATS
+Index: gcc/config/rs6000/linux64.h
+===================================================================
+--- gcc/config/rs6000/linux64.h        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/linux64.h        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -246,7 +246,7 @@
+ /* PowerPC64 Linux word-aligns FP doubles when -malign-power is given.  */
+ #undef  ADJUST_FIELD_ALIGN
+ #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
+-  ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)   \
++  (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED))          \
+    ? 128                                                              \
+    : (TARGET_64BIT                                                    \
+       && TARGET_ALIGN_NATURAL == 0                                    \
+Index: gcc/config/rs6000/rs6000.c
+===================================================================
+--- gcc/config/rs6000/rs6000.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/rs6000.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -369,6 +369,7 @@
+   enum insn_code reload_gpr_vsx;      /* INSN to move from GPR to VSX.  */
+   enum insn_code reload_vsx_gpr;      /* INSN to move from VSX to GPR.  */
+   addr_mask_type addr_mask[(int)N_RELOAD_REG]; /* Valid address masks.  */
++  bool scalar_in_vmx_p;                       /* Scalar value can go in VMX.  */
+ };
+ static struct rs6000_reg_addr reg_addr[NUM_MACHINE_MODES];
+@@ -1704,8 +1705,7 @@
+      asked for it.  */
+   if (TARGET_VSX && VSX_REGNO_P (regno)
+       && (VECTOR_MEM_VSX_P (mode)
+-        || (TARGET_VSX_SCALAR_FLOAT && mode == SFmode)
+-        || (TARGET_VSX_SCALAR_DOUBLE && (mode == DFmode || mode == DImode))
++        || reg_addr[mode].scalar_in_vmx_p
+         || (TARGET_VSX_TIMODE && mode == TImode)
+         || (TARGET_VADDUQM && mode == V1TImode)))
+     {
+@@ -1714,12 +1714,9 @@
+       if (ALTIVEC_REGNO_P (regno))
+       {
+-        if (mode == SFmode && !TARGET_UPPER_REGS_SF)
++        if (GET_MODE_SIZE (mode) != 16 && !reg_addr[mode].scalar_in_vmx_p)
+           return 0;
+-        if ((mode == DFmode || mode == DImode) && !TARGET_UPPER_REGS_DF)
+-          return 0;
+-
+         return ALTIVEC_REGNO_P (last_regno);
+       }
+     }
+@@ -1897,14 +1894,16 @@
+   if (rs6000_vector_unit[m] != VECTOR_NONE
+       || rs6000_vector_mem[m] != VECTOR_NONE
+       || (reg_addr[m].reload_store != CODE_FOR_nothing)
+-      || (reg_addr[m].reload_load != CODE_FOR_nothing))
++      || (reg_addr[m].reload_load != CODE_FOR_nothing)
++      || reg_addr[m].scalar_in_vmx_p)
+     {
+       fprintf (stderr,
+-             "  Vector-arith=%-10s Vector-mem=%-10s Reload=%c%c",
++             "  Vector-arith=%-10s Vector-mem=%-10s Reload=%c%c Upper=%c",
+              rs6000_debug_vector_unit (rs6000_vector_unit[m]),
+              rs6000_debug_vector_unit (rs6000_vector_mem[m]),
+              (reg_addr[m].reload_store != CODE_FOR_nothing) ? 's' : '*',
+-             (reg_addr[m].reload_load != CODE_FOR_nothing) ? 'l' : '*');
++             (reg_addr[m].reload_load != CODE_FOR_nothing) ? 'l' : '*',
++             (reg_addr[m].scalar_in_vmx_p) ? 'y' : 'n');
+     }
+   fputs ("\n", stderr);
+@@ -2021,6 +2020,10 @@
+          "wd reg_class = %s\n"
+          "wf reg_class = %s\n"
+          "wg reg_class = %s\n"
++         "wh reg_class = %s\n"
++         "wi reg_class = %s\n"
++         "wj reg_class = %s\n"
++         "wk reg_class = %s\n"
+          "wl reg_class = %s\n"
+          "wm reg_class = %s\n"
+          "wr reg_class = %s\n"
+@@ -2040,6 +2043,10 @@
+          reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wd]],
+          reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wf]],
+          reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wg]],
++         reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wh]],
++         reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wi]],
++         reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wj]],
++         reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wk]],
+          reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wl]],
+          reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wm]],
+          reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wr]],
+@@ -2324,6 +2331,8 @@
+   for (m = 0; m < NUM_MACHINE_MODES; ++m)
+     {
++      enum machine_mode m2 = (enum machine_mode)m;
++
+       /* SDmode is special in that we want to access it only via REG+REG
+        addressing on power7 and above, since we want to use the LFIWZX and
+        STFIWZX instructions to load it.  */
+@@ -2358,13 +2367,12 @@
+             if (TARGET_UPDATE
+                 && (rc == RELOAD_REG_GPR || rc == RELOAD_REG_FPR)
+-                && GET_MODE_SIZE (m) <= 8
+-                && !VECTOR_MODE_P (m)
+-                && !COMPLEX_MODE_P (m)
++                && GET_MODE_SIZE (m2) <= 8
++                && !VECTOR_MODE_P (m2)
++                && !COMPLEX_MODE_P (m2)
+                 && !indexed_only_p
+-                && !(TARGET_E500_DOUBLE && GET_MODE_SIZE (m) == 8)
+-                && !(m == DFmode && TARGET_UPPER_REGS_DF)
+-                && !(m == SFmode && TARGET_UPPER_REGS_SF))
++                && !(TARGET_E500_DOUBLE && GET_MODE_SIZE (m2) == 8)
++                && !reg_addr[m2].scalar_in_vmx_p)
+               {
+                 addr_mask |= RELOAD_REG_PRE_INCDEC;
+@@ -2595,16 +2603,22 @@
+       f  - Register class to use with traditional SFmode instructions.
+       v  - Altivec register.
+       wa - Any VSX register.
++      wc - Reserved to represent individual CR bits (used in LLVM).
+       wd - Preferred register class for V2DFmode.
+       wf - Preferred register class for V4SFmode.
+       wg - Float register for power6x move insns.
++      wh - FP register for direct move instructions.
++      wi - FP or VSX register to hold 64-bit integers for VSX insns.
++      wj - FP or VSX register to hold 64-bit integers for direct moves.
++      wk - FP or VSX register to hold 64-bit doubles for direct moves.
+       wl - Float register if we can do 32-bit signed int loads.
+       wm - VSX register for ISA 2.07 direct move operations.
++      wn - always NO_REGS.
+       wr - GPR if 64-bit mode is permitted.
+       ws - Register class to do ISA 2.06 DF operations.
++      wt - VSX register for TImode in VSX registers.
+       wu - Altivec register for ISA 2.07 VSX SF/SI load/stores.
+       wv - Altivec register for ISA 2.06 VSX DF/DI load/stores.
+-      wt - VSX register for TImode in VSX registers.
+       ww - Register class to do SF conversions in with VSX operations.
+       wx - Float register if we can do 32-bit int stores.
+       wy - Register class to do ISA 2.07 SF operations.
+@@ -2611,21 +2625,22 @@
+       wz - Float register if we can do 32-bit unsigned int loads.  */
+   if (TARGET_HARD_FLOAT && TARGET_FPRS)
+-    rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;
++    rs6000_constraints[RS6000_CONSTRAINT_f] = FLOAT_REGS;     /* SFmode  */
+   if (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT)
+-    rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
++    rs6000_constraints[RS6000_CONSTRAINT_d]  = FLOAT_REGS;    /* DFmode  */
+   if (TARGET_VSX)
+     {
+       rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
+-      rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;
+-      rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;
++      rs6000_constraints[RS6000_CONSTRAINT_wd] = VSX_REGS;    /* V2DFmode  */
++      rs6000_constraints[RS6000_CONSTRAINT_wf] = VSX_REGS;    /* V4SFmode  */
++      rs6000_constraints[RS6000_CONSTRAINT_wi] = FLOAT_REGS;  /* DImode  */
+       if (TARGET_VSX_TIMODE)
+-      rs6000_constraints[RS6000_CONSTRAINT_wt] = VSX_REGS;
++      rs6000_constraints[RS6000_CONSTRAINT_wt] = VSX_REGS;    /* TImode  */
+-      if (TARGET_UPPER_REGS_DF)
++      if (TARGET_UPPER_REGS_DF)                                       /* DFmode  */
+       {
+         rs6000_constraints[RS6000_CONSTRAINT_ws] = VSX_REGS;
+         rs6000_constraints[RS6000_CONSTRAINT_wv] = ALTIVEC_REGS;
+@@ -2639,19 +2654,26 @@
+   if (TARGET_ALTIVEC)
+     rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
+-  if (TARGET_MFPGPR)
++  if (TARGET_MFPGPR)                                          /* DFmode  */
+     rs6000_constraints[RS6000_CONSTRAINT_wg] = FLOAT_REGS;
+   if (TARGET_LFIWAX)
+-    rs6000_constraints[RS6000_CONSTRAINT_wl] = FLOAT_REGS;
++    rs6000_constraints[RS6000_CONSTRAINT_wl] = FLOAT_REGS;    /* DImode  */
+   if (TARGET_DIRECT_MOVE)
+-    rs6000_constraints[RS6000_CONSTRAINT_wm] = VSX_REGS;
++    {
++      rs6000_constraints[RS6000_CONSTRAINT_wh] = FLOAT_REGS;
++      rs6000_constraints[RS6000_CONSTRAINT_wj]                        /* DImode  */
++      = rs6000_constraints[RS6000_CONSTRAINT_wi];
++      rs6000_constraints[RS6000_CONSTRAINT_wk]                        /* DFmode  */
++      = rs6000_constraints[RS6000_CONSTRAINT_ws];
++      rs6000_constraints[RS6000_CONSTRAINT_wm] = VSX_REGS;
++    }
+   if (TARGET_POWERPC64)
+     rs6000_constraints[RS6000_CONSTRAINT_wr] = GENERAL_REGS;
+-  if (TARGET_P8_VECTOR && TARGET_UPPER_REGS_SF)
++  if (TARGET_P8_VECTOR && TARGET_UPPER_REGS_SF)                       /* SFmode  */
+     {
+       rs6000_constraints[RS6000_CONSTRAINT_wu] = ALTIVEC_REGS;
+       rs6000_constraints[RS6000_CONSTRAINT_wy] = VSX_REGS;
+@@ -2666,10 +2688,10 @@
+     rs6000_constraints[RS6000_CONSTRAINT_ww] = FLOAT_REGS;
+   if (TARGET_STFIWX)
+-    rs6000_constraints[RS6000_CONSTRAINT_wx] = FLOAT_REGS;
++    rs6000_constraints[RS6000_CONSTRAINT_wx] = FLOAT_REGS;    /* DImode  */
+   if (TARGET_LFIWZX)
+-    rs6000_constraints[RS6000_CONSTRAINT_wz] = FLOAT_REGS;
++    rs6000_constraints[RS6000_CONSTRAINT_wz] = FLOAT_REGS;    /* DImode  */
+   /* Set up the reload helper and direct move functions.  */
+   if (TARGET_VSX || TARGET_ALTIVEC)
+@@ -2692,10 +2714,11 @@
+         reg_addr[V2DFmode].reload_load   = CODE_FOR_reload_v2df_di_load;
+         if (TARGET_VSX && TARGET_UPPER_REGS_DF)
+           {
+-            reg_addr[DFmode].reload_store  = CODE_FOR_reload_df_di_store;
+-            reg_addr[DFmode].reload_load   = CODE_FOR_reload_df_di_load;
+-            reg_addr[DDmode].reload_store  = CODE_FOR_reload_dd_di_store;
+-            reg_addr[DDmode].reload_load   = CODE_FOR_reload_dd_di_load;
++            reg_addr[DFmode].reload_store    = CODE_FOR_reload_df_di_store;
++            reg_addr[DFmode].reload_load     = CODE_FOR_reload_df_di_load;
++            reg_addr[DFmode].scalar_in_vmx_p = true;
++            reg_addr[DDmode].reload_store    = CODE_FOR_reload_dd_di_store;
++            reg_addr[DDmode].reload_load     = CODE_FOR_reload_dd_di_load;
+           }
+         if (TARGET_P8_VECTOR)
+           {
+@@ -2703,6 +2726,8 @@
+             reg_addr[SFmode].reload_load   = CODE_FOR_reload_sf_di_load;
+             reg_addr[SDmode].reload_store  = CODE_FOR_reload_sd_di_store;
+             reg_addr[SDmode].reload_load   = CODE_FOR_reload_sd_di_load;
++            if (TARGET_UPPER_REGS_SF)
++              reg_addr[SFmode].scalar_in_vmx_p = true;
+           }
+         if (TARGET_VSX_TIMODE)
+           {
+@@ -2759,10 +2784,11 @@
+         reg_addr[V2DFmode].reload_load   = CODE_FOR_reload_v2df_si_load;
+         if (TARGET_VSX && TARGET_UPPER_REGS_DF)
+           {
+-            reg_addr[DFmode].reload_store  = CODE_FOR_reload_df_si_store;
+-            reg_addr[DFmode].reload_load   = CODE_FOR_reload_df_si_load;
+-            reg_addr[DDmode].reload_store  = CODE_FOR_reload_dd_si_store;
+-            reg_addr[DDmode].reload_load   = CODE_FOR_reload_dd_si_load;
++            reg_addr[DFmode].reload_store    = CODE_FOR_reload_df_si_store;
++            reg_addr[DFmode].reload_load     = CODE_FOR_reload_df_si_load;
++            reg_addr[DFmode].scalar_in_vmx_p = true;
++            reg_addr[DDmode].reload_store    = CODE_FOR_reload_dd_si_store;
++            reg_addr[DDmode].reload_load     = CODE_FOR_reload_dd_si_load;
+           }
+         if (TARGET_P8_VECTOR)
+           {
+@@ -2770,6 +2796,8 @@
+             reg_addr[SFmode].reload_load   = CODE_FOR_reload_sf_si_load;
+             reg_addr[SDmode].reload_store  = CODE_FOR_reload_sd_si_store;
+             reg_addr[SDmode].reload_load   = CODE_FOR_reload_sd_si_load;
++            if (TARGET_UPPER_REGS_SF)
++              reg_addr[SFmode].scalar_in_vmx_p = true;
+           }
+         if (TARGET_VSX_TIMODE)
+           {
+@@ -2810,6 +2838,7 @@
+       for (m = 0; m < NUM_MACHINE_MODES; ++m)
+       {
++        enum machine_mode m2 = (enum machine_mode)m;
+         int reg_size2 = reg_size;
+         /* TFmode/TDmode always takes 2 registers, even in VSX.  */
+@@ -2818,7 +2847,7 @@
+           reg_size2 = UNITS_PER_FP_WORD;
+         rs6000_class_max_nregs[m][c]
+-          = (GET_MODE_SIZE (m) + reg_size2 - 1) / reg_size2;
++          = (GET_MODE_SIZE (m2) + reg_size2 - 1) / reg_size2;
+       }
+     }
+@@ -3014,7 +3043,8 @@
+         | ((TARGET_CRYPTO)                ? RS6000_BTM_CRYPTO    : 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
+@@ -5861,6 +5891,34 @@
+   return align;
+ }
++/* Previous GCC releases forced all vector types to have 16-byte alignment.  */
++
++bool
++rs6000_special_adjust_field_align_p (tree field, unsigned int computed)
++{
++  if (TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
++    {
++      if (computed != 128)
++      {
++        static bool warned;
++        if (!warned && warn_psabi)
++          {
++            warned = true;
++            inform (input_location,
++                    "the layout of aggregates containing vectors with"
++                    " %d-byte alignment will change in a future GCC release",
++                    computed / BITS_PER_UNIT);
++          }
++      }
++      /* GCC 4.8/4.9 Note: To avoid any ABI change on a release branch, we
++       keep the special treatment of vector types, but warn if there will
++       be differences in future GCC releases.  */
++      return true;
++    }
++
++  return false;
++}
++
+ /* AIX increases natural record alignment to doubleword if the first
+    field is an FP double while the FP fields remain word aligned.  */
+@@ -6109,7 +6167,8 @@
+     return false;
+   extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
+-  gcc_assert (extra >= 0);
++  if (extra < 0)
++    extra = 0;
+   if (GET_CODE (addr) == LO_SUM)
+     /* For lo_sum addresses, we must allow any offset except one that
+@@ -9198,14 +9257,51 @@
+          || (type && TREE_CODE (type) == VECTOR_TYPE
+              && int_size_in_bytes (type) >= 16))
+     return 128;
+-  else if (((TARGET_MACHO && rs6000_darwin64_abi)
+-          || DEFAULT_ABI == ABI_ELFv2
+-            || (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm))
+-         && mode == BLKmode
+-         && type && TYPE_ALIGN (type) > 64)
++
++  /* Aggregate types that need > 8 byte alignment are quadword-aligned
++     in the parameter area in the ELFv2 ABI, and in the AIX ABI unless
++     -mcompat-align-parm is used.  */
++  if (((DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm)
++       || DEFAULT_ABI == ABI_ELFv2)
++      && type && TYPE_ALIGN (type) > 64)
++    {
++      /* "Aggregate" means any AGGREGATE_TYPE except for single-element
++         or homogeneous float/vector aggregates here.  We already handled
++         vector aggregates above, but still need to check for float here. */
++      bool aggregate_p = (AGGREGATE_TYPE_P (type)
++                        && !SCALAR_FLOAT_MODE_P (elt_mode));
++
++      /* We used to check for BLKmode instead of the above aggregate type
++       check.  Warn when this results in any difference to the ABI.  */
++      if (aggregate_p != (mode == BLKmode))
++      {
++        static bool warned;
++        if (!warned && warn_psabi)
++          {
++            warned = true;
++            inform (input_location,
++                    "the ABI of passing aggregates with %d-byte alignment"
++                    " will change in a future GCC release",
++                    (int) TYPE_ALIGN (type) / BITS_PER_UNIT);
++          }
++      }
++
++      /* GCC 4.8/4.9 Note: To avoid any ABI change on a release branch, we
++       keep using the BLKmode check, but warn if there will be differences
++       in future GCC releases.  */
++      if (mode == BLKmode)
++      return 128;
++    }
++
++  /* Similar for the Darwin64 ABI.  Note that for historical reasons we
++     implement the "aggregate type" check as a BLKmode check here; this
++     means certain aggregate types are in fact not aligned.  */
++  if (TARGET_MACHO && rs6000_darwin64_abi
++      && mode == BLKmode
++      && type && TYPE_ALIGN (type) > 64)
+     return 128;
+-  else
+-    return PARM_BOUNDARY;
++
++  return PARM_BOUNDARY;
+ }
+ /* The offset in words to the start of the parameter save area.  */
+@@ -10243,6 +10339,7 @@
+         rtx r, off;
+         int i, k = 0;
+         unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
++        int fpr_words;
+         /* Do we also need to pass this argument in the parameter
+            save area?  */
+@@ -10271,6 +10368,37 @@
+             rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, r, off);
+           }
++        /* If there were not enough FPRs to hold the argument, the rest
++           usually goes into memory.  However, if the current position
++           is still within the register parameter area, a portion may
++           actually have to go into GPRs.
++
++           Note that it may happen that the portion of the argument
++           passed in the first "half" of the first GPR was already
++           passed in the last FPR as well.
++
++           For unnamed arguments, we already set up GPRs to cover the
++           whole argument in rs6000_psave_function_arg, so there is
++           nothing further to do at this point.
++
++           GCC 4.8/4.9 Note: This was implemented incorrectly in earlier
++           GCC releases.  To avoid any ABI change on the release branch,
++           we retain that original implementation here, but warn if we
++           encounter a case where the ABI will change in the future.  */
++        fpr_words = (i * GET_MODE_SIZE (elt_mode)) / (TARGET_32BIT ? 4 : 8);
++        if (i < n_elts && align_words + fpr_words < GP_ARG_NUM_REG
++            && cum->nargs_prototype > 0)
++            {
++            static bool warned;
++            if (!warned && warn_psabi)
++              {
++                warned = true;
++                inform (input_location,
++                        "the ABI of passing homogeneous float aggregates"
++                        " will change in a future GCC release");
++              }
++          }
++
+         return rs6000_finish_function_arg (mode, rvec, k);
+       }
+       else if (align_words < GP_ARG_NUM_REG)
+@@ -10497,10 +10625,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;
+@@ -10507,26 +10634,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;
+ }
+@@ -10537,7 +10695,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;
+@@ -10555,7 +10713,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;
+@@ -13544,11 +13702,15 @@
+   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
+@@ -13649,8 +13811,8 @@
+     case ALTIVEC_BUILTIN_MASK_FOR_LOAD:
+     case ALTIVEC_BUILTIN_MASK_FOR_STORE:
+       {
+-      int icode = (BYTES_BIG_ENDIAN ? (int) CODE_FOR_altivec_lvsr
+-                   : (int) CODE_FOR_altivec_lvsl);
++      int icode = (BYTES_BIG_ENDIAN ? (int) CODE_FOR_altivec_lvsr_direct
++                   : (int) CODE_FOR_altivec_lvsl_direct);
+       enum machine_mode tmode = insn_data[icode].operand[0].mode;
+       enum machine_mode mode = insn_data[icode].operand[1].mode;
+       tree arg;
+@@ -13678,7 +13840,6 @@
+           || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
+         target = gen_reg_rtx (tmode);
+-      /*pat = gen_altivec_lvsr (target, op);*/
+       pat = GEN_FCN (icode) (target, op);
+       if (!pat)
+         return 0;
+@@ -17099,7 +17260,14 @@
+      prefer Altivec loads..  */
+   if (rclass == VSX_REGS)
+     {
+-      if (GET_MODE_SIZE (mode) <= 8)
++      if (MEM_P (x) && reg_addr[mode].scalar_in_vmx_p)
++      {
++        rtx addr = XEXP (x, 0);
++        if (rs6000_legitimate_offset_address_p (mode, addr, false, true)
++            || legitimate_lo_sum_address_p (mode, addr, false))
++          return FLOAT_REGS;
++      }
++      else if (GET_MODE_SIZE (mode) <= 8 && !reg_addr[mode].scalar_in_vmx_p)
+       return FLOAT_REGS;
+       if (VECTOR_UNIT_ALTIVEC_P (mode) || VECTOR_MEM_ALTIVEC_P (mode)
+@@ -31413,6 +31581,7 @@
+   { "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
+@@ -32663,25 +32832,14 @@
\f
+ /* Return true if the peephole2 can combine a load involving a combination of
+    an addis instruction and a load with an offset that can be fused together on
+-   a power8.
++   a power8.  */
+-   The operands are:
+-      operands[0]     register set with addis
+-      operands[1]     value set via addis
+-      operands[2]     target register being loaded
+-      operands[3]     D-form memory reference using operands[0].
+-
+-   In addition, we are passed a boolean that is true if this is a peephole2,
+-   and we can use see if the addis_reg is dead after the insn and can be
+-   replaced by the target register.  */
+-
+ bool
+-fusion_gpr_load_p (rtx *operands, bool peep2_p)
++fusion_gpr_load_p (rtx addis_reg,     /* register set via addis.  */
++                 rtx addis_value,     /* addis value.  */
++                 rtx target,          /* target register that is loaded.  */
++                 rtx mem)             /* bottom part of the memory addr. */
+ {
+-  rtx addis_reg = operands[0];
+-  rtx addis_value = operands[1];
+-  rtx target = operands[2];
+-  rtx mem = operands[3];
+   rtx addr;
+   rtx base_reg;
+@@ -32695,9 +32853,6 @@
+   if (!fusion_gpr_addis (addis_value, GET_MODE (addis_value)))
+     return false;
+-  if (!fusion_gpr_mem_load (mem, GET_MODE (mem)))
+-    return false;
+-
+   /* Allow sign/zero extension.  */
+   if (GET_CODE (mem) == ZERO_EXTEND
+       || (GET_CODE (mem) == SIGN_EXTEND && TARGET_P8_FUSION_SIGN))
+@@ -32706,22 +32861,22 @@
+   if (!MEM_P (mem))
+     return false;
++  if (!fusion_gpr_mem_load (mem, GET_MODE (mem)))
++    return false;
++
+   addr = XEXP (mem, 0);                       /* either PLUS or LO_SUM.  */
+   if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
+     return false;
+   /* Validate that the register used to load the high value is either the
+-     register being loaded, or we can safely replace its use in a peephole2.
++     register being loaded, or we can safely replace its use.
+-     If this is a peephole2, we assume that there are 2 instructions in the
+-     peephole (addis and load), so we want to check if the target register was
+-     not used in the memory address and the register to hold the addis result
+-     is dead after the peephole.  */
++     This function is only called from the peephole2 pass and we assume that
++     there are 2 instructions in the peephole (addis and load), so we want to
++     check if the target register was not used in the memory address and the
++     register to hold the addis result is dead after the peephole.  */
+   if (REGNO (addis_reg) != REGNO (target))
+     {
+-      if (!peep2_p)
+-      return false;
+-
+       if (reg_mentioned_p (target, mem))
+       return false;
+@@ -32762,9 +32917,6 @@
+   enum machine_mode extend_mode = target_mode;
+   enum machine_mode ptr_mode = Pmode;
+   enum rtx_code extend = UNKNOWN;
+-  rtx addis_reg = ((ptr_mode == target_mode)
+-                 ? target
+-                 : simplify_subreg (ptr_mode, target, target_mode, 0));
+   if (GET_CODE (orig_mem) == ZERO_EXTEND
+       || (TARGET_P8_FUSION_SIGN && GET_CODE (orig_mem) == SIGN_EXTEND))
+@@ -32781,13 +32933,14 @@
+   gcc_assert (plus_or_lo_sum == PLUS || plus_or_lo_sum == LO_SUM);
+   offset = XEXP (orig_addr, 1);
+-  new_addr = gen_rtx_fmt_ee (plus_or_lo_sum, ptr_mode, addis_reg, offset);
+-  new_mem = change_address (orig_mem, target_mode, new_addr);
++  new_addr = gen_rtx_fmt_ee (plus_or_lo_sum, ptr_mode, addis_value, offset);
++  new_mem = replace_equiv_address_nv (orig_mem, new_addr);
+   if (extend != UNKNOWN)
+     new_mem = gen_rtx_fmt_e (ZERO_EXTEND, extend_mode, new_mem);
+-  emit_insn (gen_rtx_SET (VOIDmode, addis_reg, addis_value));
++  new_mem = gen_rtx_UNSPEC (extend_mode, gen_rtvec (1, new_mem),
++                          UNSPEC_FUSION_GPR);
+   emit_insn (gen_rtx_SET (VOIDmode, target, new_mem));
+   if (extend == SIGN_EXTEND)
+@@ -32806,55 +32959,40 @@
+ }
+ /* Return a string to fuse an addis instruction with a gpr load to the same
+-   register that we loaded up the addis instruction.  The code is complicated,
+-   so we call output_asm_insn directly, and just return "".
++   register that we loaded up the addis instruction.  The address that is used
++   is the logical address that was formed during peephole2:
++      (lo_sum (high) (low-part))
+-   The operands are:
+-      operands[0]     register set with addis (must be same reg as target).
+-      operands[1]     value set via addis
+-      operands[2]     target register being loaded
+-      operands[3]     D-form memory reference using operands[0].  */
++   The code is complicated, so we call output_asm_insn directly, and just
++   return "".  */
+ const char *
+-emit_fusion_gpr_load (rtx *operands)
++emit_fusion_gpr_load (rtx target, rtx mem)
+ {
+-  rtx addis_reg = operands[0];
+-  rtx addis_value = operands[1];
+-  rtx target = operands[2];
+-  rtx mem = operands[3];
++  rtx addis_value;
+   rtx fuse_ops[10];
+   rtx addr;
+   rtx load_offset;
+   const char *addis_str = NULL;
+   const char *load_str = NULL;
+-  const char *extend_insn = NULL;
+   const char *mode_name = NULL;
+   char insn_template[80];
+   enum machine_mode mode;
+   const char *comment_str = ASM_COMMENT_START;
+-  bool sign_p = false;
+-  gcc_assert (REG_P (addis_reg) && REG_P (target));
+-  gcc_assert (REGNO (addis_reg) == REGNO (target));
++  if (GET_CODE (mem) == ZERO_EXTEND)
++    mem = XEXP (mem, 0);
++  gcc_assert (REG_P (target) && MEM_P (mem));
++
+   if (*comment_str == ' ')
+     comment_str++;
+-  /* Allow sign/zero extension.  */
+-  if (GET_CODE (mem) == ZERO_EXTEND)
+-    mem = XEXP (mem, 0);
+-
+-  else if (GET_CODE (mem) == SIGN_EXTEND && TARGET_P8_FUSION_SIGN)
+-    {
+-      sign_p = true;
+-      mem = XEXP (mem, 0);
+-    }
+-
+-  gcc_assert (MEM_P (mem));
+   addr = XEXP (mem, 0);
+   if (GET_CODE (addr) != PLUS && GET_CODE (addr) != LO_SUM)
+     gcc_unreachable ();
++  addis_value = XEXP (addr, 0);
+   load_offset = XEXP (addr, 1);
+   /* Now emit the load instruction to the same register.  */
+@@ -32864,29 +33002,22 @@
+     case QImode:
+       mode_name = "char";
+       load_str = "lbz";
+-      extend_insn = "extsb %0,%0";
+       break;
+     case HImode:
+       mode_name = "short";
+       load_str = "lhz";
+-      extend_insn = "extsh %0,%0";
+       break;
+     case SImode:
+       mode_name = "int";
+       load_str = "lwz";
+-      extend_insn = "extsw %0,%0";
+       break;
+     case DImode:
+-      if (TARGET_POWERPC64)
+-      {
+-        mode_name = "long";
+-        load_str = "ld";
+-      }
+-      else
+-      gcc_unreachable ();
++      gcc_assert (TARGET_POWERPC64);
++      mode_name = "long";
++      load_str = "ld";
+       break;
+     default:
+@@ -33030,14 +33161,6 @@
+   else
+     fatal_insn ("Unable to generate load offset for fusion", load_offset);
+-  /* Handle sign extension.  The peephole2 pass generates this as a separate
+-     insn, but we handle it just in case it got reattached.  */
+-  if (sign_p)
+-    {
+-      gcc_assert (extend_insn != NULL);
+-      output_asm_insn (extend_insn, fuse_ops);
+-    }
+-
+   return "";
+ }
+Index: gcc/config/rs6000/vsx.md
+===================================================================
+--- gcc/config/rs6000/vsx.md   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/vsx.md   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -24,6 +24,13 @@
+ ;; Iterator for the 2 64-bit vector types
+ (define_mode_iterator VSX_D [V2DF V2DI])
++;; Iterator for the 2 64-bit vector types + 128-bit types that are loaded with
++;; lxvd2x to properly handle swapping words on little endian
++(define_mode_iterator VSX_LE [V2DF
++                            V2DI
++                            V1TI
++                            (TI       "VECTOR_MEM_VSX_P (TImode)")])
++
+ ;; Iterator for the 2 32-bit vector types
+ (define_mode_iterator VSX_W [V4SF V4SI])
+@@ -79,19 +86,26 @@
+                        (V4SF  "wf")
+                        (V2DI  "wd")
+                        (V2DF  "wd")
++                       (DI    "wi")
+                        (DF    "ws")
+-                       (SF    "d")
++                       (SF    "ww")
+                        (V1TI  "v")
+                        (TI    "wt")])
+-;; Map the register class used for float<->int conversions
++;; Map the register class used for float<->int conversions (floating point side)
++;; VSr2 is the preferred register class, VSr3 is any register class that will
++;; hold the data
+ (define_mode_attr VSr2        [(V2DF  "wd")
+                        (V4SF  "wf")
+-                       (DF    "ws")])
++                       (DF    "ws")
++                       (SF    "ww")
++                       (DI    "wi")])
+ (define_mode_attr VSr3        [(V2DF  "wa")
+                        (V4SF  "wa")
+-                       (DF    "ws")])
++                       (DF    "ws")
++                       (SF    "ww")
++                       (DI    "wi")])
+ ;; Map the register class for sp<->dp float conversions, destination
+ (define_mode_attr VSr4        [(SF    "ws")
+@@ -99,12 +113,27 @@
+                        (V2DF  "wd")
+                        (V4SF  "v")])
+-;; Map the register class for sp<->dp float conversions, destination
++;; Map the register class for sp<->dp float conversions, source
+ (define_mode_attr VSr5        [(SF    "ws")
+                        (DF    "f")
+                        (V2DF  "v")
+                        (V4SF  "wd")])
++;; The VSX register class that a type can occupy, even if it is not the
++;; preferred register class (VSr is the preferred register class that will get
++;; allocated first).
++(define_mode_attr VSa [(V16QI "wa")
++                       (V8HI  "wa")
++                       (V4SI  "wa")
++                       (V4SF  "wa")
++                       (V2DI  "wa")
++                       (V2DF  "wa")
++                       (DI    "wi")
++                       (DF    "ws")
++                       (SF    "ww")
++                       (V1TI  "wa")
++                       (TI    "wt")])
++
+ ;; Same size integer type for floating point data
+ (define_mode_attr VSi [(V4SF  "v4si")
+                      (V2DF  "v2di")
+@@ -200,6 +229,16 @@
+                            (V2DF      "V4DF")
+                            (V1TI      "V2TI")])
++;; Map register class for 64-bit element in 128-bit vector for direct moves
++;; to/from gprs
++(define_mode_attr VS_64dm [(V2DF      "wk")
++                         (V2DI        "wj")])
++
++;; Map register class for 64-bit element in 128-bit vector for normal register
++;; to register moves
++(define_mode_attr VS_64reg [(V2DF     "ws")
++                          (V2DI       "wi")])
++
+ ;; Constants for creating unspecs
+ (define_c_enum "unspec"
+   [UNSPEC_VSX_CONCAT
+@@ -228,8 +267,8 @@
+ ;; The patterns for LE permuted loads and stores come before the general
+ ;; VSX moves so they match first.
+ (define_insn_and_split "*vsx_le_perm_load_<mode>"
+-  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
+-        (match_operand:VSX_D 1 "memory_operand" "Z"))]
++  [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=<VSa>")
++        (match_operand:VSX_LE 1 "memory_operand" "Z"))]
+   "!BYTES_BIG_ENDIAN && TARGET_VSX"
+   "#"
+   "!BYTES_BIG_ENDIAN && TARGET_VSX"
+@@ -251,7 +290,7 @@
+    (set_attr "length" "8")])
+ (define_insn_and_split "*vsx_le_perm_load_<mode>"
+-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wa")
++  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=<VSa>")
+         (match_operand:VSX_W 1 "memory_operand" "Z"))]
+   "!BYTES_BIG_ENDIAN && TARGET_VSX"
+   "#"
+@@ -342,8 +381,8 @@
+    (set_attr "length" "8")])
+ (define_insn "*vsx_le_perm_store_<mode>"
+-  [(set (match_operand:VSX_D 0 "memory_operand" "=Z")
+-        (match_operand:VSX_D 1 "vsx_register_operand" "+wa"))]
++  [(set (match_operand:VSX_LE 0 "memory_operand" "=Z")
++        (match_operand:VSX_LE 1 "vsx_register_operand" "+<VSa>"))]
+   "!BYTES_BIG_ENDIAN && TARGET_VSX"
+   "#"
+   [(set_attr "type" "vecstore")
+@@ -350,8 +389,8 @@
+    (set_attr "length" "12")])
+ (define_split
+-  [(set (match_operand:VSX_D 0 "memory_operand" "")
+-        (match_operand:VSX_D 1 "vsx_register_operand" ""))]
++  [(set (match_operand:VSX_LE 0 "memory_operand" "")
++        (match_operand:VSX_LE 1 "vsx_register_operand" ""))]
+   "!BYTES_BIG_ENDIAN && TARGET_VSX && !reload_completed"
+   [(set (match_dup 2)
+         (vec_select:<MODE>
+@@ -369,8 +408,8 @@
+ ;; The post-reload split requires that we re-permute the source
+ ;; register in case it is still live.
+ (define_split
+-  [(set (match_operand:VSX_D 0 "memory_operand" "")
+-        (match_operand:VSX_D 1 "vsx_register_operand" ""))]
++  [(set (match_operand:VSX_LE 0 "memory_operand" "")
++        (match_operand:VSX_LE 1 "vsx_register_operand" ""))]
+   "!BYTES_BIG_ENDIAN && TARGET_VSX && reload_completed"
+   [(set (match_dup 1)
+         (vec_select:<MODE>
+@@ -388,7 +427,7 @@
+ (define_insn "*vsx_le_perm_store_<mode>"
+   [(set (match_operand:VSX_W 0 "memory_operand" "=Z")
+-        (match_operand:VSX_W 1 "vsx_register_operand" "+wa"))]
++        (match_operand:VSX_W 1 "vsx_register_operand" "+<VSa>"))]
+   "!BYTES_BIG_ENDIAN && TARGET_VSX"
+   "#"
+   [(set_attr "type" "vecstore")
+@@ -578,8 +617,8 @@
+ (define_insn "*vsx_mov<mode>"
+-  [(set (match_operand:VSX_M 0 "nonimmediate_operand" "=Z,<VSr>,<VSr>,?Z,?wa,?wa,wQ,?&r,??Y,??r,??r,<VSr>,?wa,*r,v,wZ, v")
+-      (match_operand:VSX_M 1 "input_operand" "<VSr>,Z,<VSr>,wa,Z,wa,r,wQ,r,Y,r,j,j,j,W,v,wZ"))]
++  [(set (match_operand:VSX_M 0 "nonimmediate_operand" "=Z,<VSr>,<VSr>,?Z,?<VSa>,?<VSa>,wQ,?&r,??Y,??r,??r,<VSr>,?<VSa>,*r,v,wZ, v")
++      (match_operand:VSX_M 1 "input_operand" "<VSr>,Z,<VSr>,<VSa>,Z,<VSa>,r,wQ,r,Y,r,j,j,j,W,v,wZ"))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)
+    && (register_operand (operands[0], <MODE>mode) 
+        || register_operand (operands[1], <MODE>mode))"
+@@ -681,9 +720,9 @@
+ ;; instructions are now combined with the insn for the traditional floating
+ ;; point unit.
+ (define_insn "*vsx_add<mode>3"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (plus:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (plus:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvadd<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -690,9 +729,9 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_sub<mode>3"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (minus:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                   (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (minus:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                   (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvsub<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -699,9 +738,9 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_mul<mode>3"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (mult:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (mult:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvmul<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -708,9 +747,9 @@
+    (set_attr "fp_type" "<VSfptype_mul>")])
+ (define_insn "*vsx_div<mode>3"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (div:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                 (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (div:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                 (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvdiv<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_div>")
+@@ -746,8 +785,8 @@
+ (define_insn "*vsx_tdiv<mode>3_internal"
+   [(set (match_operand:CCFP 0 "cc_reg_operand" "=x,x")
+-      (unspec:CCFP [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,wa")
+-                    (match_operand:VSX_B 2 "vsx_register_operand" "<VSr>,wa")]
++      (unspec:CCFP [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,<VSa>")
++                    (match_operand:VSX_B 2 "vsx_register_operand" "<VSr>,<VSa>")]
+                  UNSPEC_VSX_TDIV))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>tdiv<VSs> %0,%x1,%x2"
+@@ -755,8 +794,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_fre<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                     UNSPEC_FRES))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvre<VSs> %x0,%x1"
+@@ -764,8 +803,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_neg<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (neg:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (neg:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvneg<VSs> %x0,%x1"
+   [(set_attr "type" "<VStype_simple>")
+@@ -772,8 +811,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_abs<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (abs:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (abs:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvabs<VSs> %x0,%x1"
+   [(set_attr "type" "<VStype_simple>")
+@@ -780,10 +819,10 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_nabs<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+         (neg:VSX_F
+        (abs:VSX_F
+-        (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa"))))]
++        (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>"))))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvnabs<VSs> %x0,%x1"
+   [(set_attr "type" "<VStype_simple>")
+@@ -790,9 +829,9 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_smax<mode>3"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (smax:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (smax:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvmax<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -799,9 +838,9 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_smin<mode>3"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (smin:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (smin:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                  (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvmin<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -808,8 +847,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_sqrt<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-        (sqrt:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++        (sqrt:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvsqrt<VSs> %x0,%x1"
+   [(set_attr "type" "<VStype_sqrt>")
+@@ -816,8 +855,8 @@
+    (set_attr "fp_type" "<VSfptype_sqrt>")])
+ (define_insn "*vsx_rsqrte<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                     UNSPEC_RSQRT))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvrsqrte<VSs> %x0,%x1"
+@@ -852,7 +891,7 @@
+ (define_insn "*vsx_tsqrt<mode>2_internal"
+   [(set (match_operand:CCFP 0 "cc_reg_operand" "=x,x")
+-      (unspec:CCFP [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,wa")]
++      (unspec:CCFP [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                    UNSPEC_VSX_TSQRT))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>tsqrt<VSs> %0,%x1"
+@@ -865,11 +904,11 @@
+ ;; multiply.
+ (define_insn "*vsx_fmav4sf4"
+-  [(set (match_operand:V4SF 0 "vsx_register_operand" "=ws,ws,?wa,?wa,v")
++  [(set (match_operand:V4SF 0 "vsx_register_operand" "=wf,wf,?wa,?wa,v")
+       (fma:V4SF
+-        (match_operand:V4SF 1 "vsx_register_operand" "%ws,ws,wa,wa,v")
+-        (match_operand:V4SF 2 "vsx_register_operand" "ws,0,wa,0,v")
+-        (match_operand:V4SF 3 "vsx_register_operand" "0,ws,0,wa,v")))]
++        (match_operand:V4SF 1 "vsx_register_operand" "%wf,wf,wa,wa,v")
++        (match_operand:V4SF 2 "vsx_register_operand" "wf,0,wa,0,v")
++        (match_operand:V4SF 3 "vsx_register_operand" "0,wf,0,wa,v")))]
+   "VECTOR_UNIT_VSX_P (V4SFmode)"
+   "@
+    xvmaddasp %x0,%x1,%x2
+@@ -880,11 +919,11 @@
+   [(set_attr "type" "vecfloat")])
+ (define_insn "*vsx_fmav2df4"
+-  [(set (match_operand:V2DF 0 "vsx_register_operand" "=ws,ws,?wa,?wa")
++  [(set (match_operand:V2DF 0 "vsx_register_operand" "=wd,wd,?wa,?wa")
+       (fma:V2DF
+-        (match_operand:V2DF 1 "vsx_register_operand" "%ws,ws,wa,wa")
+-        (match_operand:V2DF 2 "vsx_register_operand" "ws,0,wa,0")
+-        (match_operand:V2DF 3 "vsx_register_operand" "0,ws,0,wa")))]
++        (match_operand:V2DF 1 "vsx_register_operand" "%wd,wd,wa,wa")
++        (match_operand:V2DF 2 "vsx_register_operand" "wd,0,wa,0")
++        (match_operand:V2DF 3 "vsx_register_operand" "0,wd,0,wa")))]
+   "VECTOR_UNIT_VSX_P (V2DFmode)"
+   "@
+    xvmaddadp %x0,%x1,%x2
+@@ -894,12 +933,12 @@
+   [(set_attr "type" "vecdouble")])
+ (define_insn "*vsx_fms<mode>4"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,<VSr>,?wa,?wa")
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,<VSr>,?<VSa>,?<VSa>")
+       (fma:VSX_F
+-        (match_operand:VSX_F 1 "vsx_register_operand" "%<VSr>,<VSr>,wa,wa")
+-        (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,0,wa,0")
++        (match_operand:VSX_F 1 "vsx_register_operand" "%<VSr>,<VSr>,<VSa>,<VSa>")
++        (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,0,<VSa>,0")
+         (neg:VSX_F
+-          (match_operand:VSX_F 3 "vsx_register_operand" "0,<VSr>,0,wa"))))]
++          (match_operand:VSX_F 3 "vsx_register_operand" "0,<VSr>,0,<VSa>"))))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "@
+    xvmsuba<VSs> %x0,%x1,%x2
+@@ -909,12 +948,12 @@
+   [(set_attr "type" "<VStype_mul>")])
+ (define_insn "*vsx_nfma<mode>4"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,<VSr>,?wa,?wa")
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,<VSr>,?<VSa>,?<VSa>")
+       (neg:VSX_F
+        (fma:VSX_F
+-        (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSr>,wa,wa")
+-        (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,0,wa,0")
+-        (match_operand:VSX_F 3 "vsx_register_operand" "0,<VSr>,0,wa"))))]
++        (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSr>,<VSa>,<VSa>")
++        (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,0,<VSa>,0")
++        (match_operand:VSX_F 3 "vsx_register_operand" "0,<VSr>,0,<VSa>"))))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "@
+    xvnmadda<VSs> %x0,%x1,%x2
+@@ -959,9 +998,9 @@
+ ;; Vector conditional expressions (no scalar version for these instructions)
+ (define_insn "vsx_eq<mode>"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (eq:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (eq:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvcmpeq<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -968,9 +1007,9 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_gt<mode>"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (gt:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (gt:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvcmpgt<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -977,9 +1016,9 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_ge<mode>"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (ge:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-                (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (ge:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++                (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvcmpge<VSs> %x0,%x1,%x2"
+   [(set_attr "type" "<VStype_simple>")
+@@ -990,10 +1029,10 @@
+ (define_insn "*vsx_eq_<mode>_p"
+   [(set (reg:CC 74)
+       (unspec:CC
+-       [(eq:CC (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,?wa")
+-               (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,?wa"))]
++       [(eq:CC (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,?<VSa>")
++               (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,?<VSa>"))]
+        UNSPEC_PREDICATE))
+-   (set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
++   (set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (eq:VSX_F (match_dup 1)
+                 (match_dup 2)))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+@@ -1003,10 +1042,10 @@
+ (define_insn "*vsx_gt_<mode>_p"
+   [(set (reg:CC 74)
+       (unspec:CC
+-       [(gt:CC (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,?wa")
+-               (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,?wa"))]
++       [(gt:CC (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,?<VSa>")
++               (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,?<VSa>"))]
+        UNSPEC_PREDICATE))
+-   (set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
++   (set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (gt:VSX_F (match_dup 1)
+                 (match_dup 2)))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+@@ -1016,10 +1055,10 @@
+ (define_insn "*vsx_ge_<mode>_p"
+   [(set (reg:CC 74)
+       (unspec:CC
+-       [(ge:CC (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,?wa")
+-               (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,?wa"))]
++       [(ge:CC (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,?<VSa>")
++               (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,?<VSa>"))]
+        UNSPEC_PREDICATE))
+-   (set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
++   (set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (ge:VSX_F (match_dup 1)
+                 (match_dup 2)))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+@@ -1028,23 +1067,23 @@
+ ;; Vector select
+ (define_insn "*vsx_xxsel<mode>"
+-  [(set (match_operand:VSX_L 0 "vsx_register_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_L 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (if_then_else:VSX_L
+-       (ne:CC (match_operand:VSX_L 1 "vsx_register_operand" "<VSr>,wa")
++       (ne:CC (match_operand:VSX_L 1 "vsx_register_operand" "<VSr>,<VSa>")
+               (match_operand:VSX_L 4 "zero_constant" ""))
+-       (match_operand:VSX_L 2 "vsx_register_operand" "<VSr>,wa")
+-       (match_operand:VSX_L 3 "vsx_register_operand" "<VSr>,wa")))]
++       (match_operand:VSX_L 2 "vsx_register_operand" "<VSr>,<VSa>")
++       (match_operand:VSX_L 3 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+   "xxsel %x0,%x3,%x2,%x1"
+   [(set_attr "type" "vecperm")])
+ (define_insn "*vsx_xxsel<mode>_uns"
+-  [(set (match_operand:VSX_L 0 "vsx_register_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_L 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (if_then_else:VSX_L
+-       (ne:CCUNS (match_operand:VSX_L 1 "vsx_register_operand" "<VSr>,wa")
++       (ne:CCUNS (match_operand:VSX_L 1 "vsx_register_operand" "<VSr>,<VSa>")
+                  (match_operand:VSX_L 4 "zero_constant" ""))
+-       (match_operand:VSX_L 2 "vsx_register_operand" "<VSr>,wa")
+-       (match_operand:VSX_L 3 "vsx_register_operand" "<VSr>,wa")))]
++       (match_operand:VSX_L 2 "vsx_register_operand" "<VSr>,<VSa>")
++       (match_operand:VSX_L 3 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+   "xxsel %x0,%x3,%x2,%x1"
+   [(set_attr "type" "vecperm")])
+@@ -1051,10 +1090,10 @@
+ ;; Copy sign
+ (define_insn "vsx_copysign<mode>3"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (unspec:VSX_F
+-       [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")
+-        (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,wa")]
++       [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")
++        (match_operand:VSX_F 2 "vsx_register_operand" "<VSr>,<VSa>")]
+        UNSPEC_COPYSIGN))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvcpsgn<VSs> %x0,%x2,%x1"
+@@ -1067,7 +1106,7 @@
+ ;; in rs6000.md so don't test VECTOR_UNIT_VSX_P, just test against VSX.
+ ;; Don't use vsx_register_operand here, use gpc_reg_operand to match rs6000.md.
+ (define_insn "vsx_float<VSi><mode>2"
+-  [(set (match_operand:VSX_B 0 "gpc_reg_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_B 0 "gpc_reg_operand" "=<VSr>,?<VSa>")
+       (float:VSX_B (match_operand:<VSI> 1 "gpc_reg_operand" "<VSr2>,<VSr3>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>cvsx<VSc><VSs> %x0,%x1"
+@@ -1075,7 +1114,7 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_floatuns<VSi><mode>2"
+-  [(set (match_operand:VSX_B 0 "gpc_reg_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_B 0 "gpc_reg_operand" "=<VSr>,?<VSa>")
+       (unsigned_float:VSX_B (match_operand:<VSI> 1 "gpc_reg_operand" "<VSr2>,<VSr3>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>cvux<VSc><VSs> %x0,%x1"
+@@ -1084,7 +1123,7 @@
+ (define_insn "vsx_fix_trunc<mode><VSi>2"
+   [(set (match_operand:<VSI> 0 "gpc_reg_operand" "=<VSr2>,?<VSr3>")
+-      (fix:<VSI> (match_operand:VSX_B 1 "gpc_reg_operand" "<VSr>,wa")))]
++      (fix:<VSI> (match_operand:VSX_B 1 "gpc_reg_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>cv<VSs>sx<VSc>s %x0,%x1"
+   [(set_attr "type" "<VStype_simple>")
+@@ -1092,7 +1131,7 @@
+ (define_insn "vsx_fixuns_trunc<mode><VSi>2"
+   [(set (match_operand:<VSI> 0 "gpc_reg_operand" "=<VSr2>,?<VSr3>")
+-      (unsigned_fix:<VSI> (match_operand:VSX_B 1 "gpc_reg_operand" "<VSr>,wa")))]
++      (unsigned_fix:<VSI> (match_operand:VSX_B 1 "gpc_reg_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>cv<VSs>ux<VSc>s %x0,%x1"
+   [(set_attr "type" "<VStype_simple>")
+@@ -1100,8 +1139,8 @@
+ ;; Math rounding functions
+ (define_insn "vsx_x<VSv>r<VSs>i"
+-  [(set (match_operand:VSX_B 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (unspec:VSX_B [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,wa")]
++  [(set (match_operand:VSX_B 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (unspec:VSX_B [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                     UNSPEC_VSX_ROUND_I))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>r<VSs>i %x0,%x1"
+@@ -1109,8 +1148,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_x<VSv>r<VSs>ic"
+-  [(set (match_operand:VSX_B 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (unspec:VSX_B [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,wa")]
++  [(set (match_operand:VSX_B 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (unspec:VSX_B [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                     UNSPEC_VSX_ROUND_IC))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>r<VSs>ic %x0,%x1"
+@@ -1118,8 +1157,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_btrunc<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (fix:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")))]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (fix:VSX_F (match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvr<VSs>iz %x0,%x1"
+   [(set_attr "type" "<VStype_simple>")
+@@ -1126,8 +1165,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "*vsx_b2trunc<mode>2"
+-  [(set (match_operand:VSX_B 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (unspec:VSX_B [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,wa")]
++  [(set (match_operand:VSX_B 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (unspec:VSX_B [(match_operand:VSX_B 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                     UNSPEC_FRIZ))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "x<VSv>r<VSs>iz %x0,%x1"
+@@ -1135,8 +1174,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_floor<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                     UNSPEC_FRIM))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvr<VSs>im %x0,%x1"
+@@ -1144,8 +1183,8 @@
+    (set_attr "fp_type" "<VSfptype_simple>")])
+ (define_insn "vsx_ceil<mode>2"
+-  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?wa")
+-      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,wa")]
++  [(set (match_operand:VSX_F 0 "vsx_register_operand" "=<VSr>,?<VSa>")
++      (unspec:VSX_F [(match_operand:VSX_F 1 "vsx_register_operand" "<VSr>,<VSa>")]
+                     UNSPEC_FRIP))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "xvr<VSs>ip %x0,%x1"
+@@ -1160,8 +1199,8 @@
+ ;; scalar single precision instructions internally use the double format.
+ ;; Prefer the altivec registers, since we likely will need to do a vperm
+ (define_insn "vsx_<VS_spdp_insn>"
+-  [(set (match_operand:<VS_spdp_res> 0 "vsx_register_operand" "=<VSr4>,?wa")
+-      (unspec:<VS_spdp_res> [(match_operand:VSX_SPDP 1 "vsx_register_operand" "<VSr5>,wa")]
++  [(set (match_operand:<VS_spdp_res> 0 "vsx_register_operand" "=<VSr4>,?<VSa>")
++      (unspec:<VS_spdp_res> [(match_operand:VSX_SPDP 1 "vsx_register_operand" "<VSr5>,<VSa>")]
+                             UNSPEC_VSX_CVSPDP))]
+   "VECTOR_UNIT_VSX_P (<MODE>mode)"
+   "<VS_spdp_insn> %x0,%x1"
+@@ -1169,8 +1208,8 @@
+ ;; xscvspdp, represent the scalar SF type as V4SF
+ (define_insn "vsx_xscvspdp"
+-  [(set (match_operand:DF 0 "vsx_register_operand" "=ws,?wa")
+-      (unspec:DF [(match_operand:V4SF 1 "vsx_register_operand" "wa,wa")]
++  [(set (match_operand:DF 0 "vsx_register_operand" "=ws")
++      (unspec:DF [(match_operand:V4SF 1 "vsx_register_operand" "wa")]
+                  UNSPEC_VSX_CVSPDP))]
+   "VECTOR_UNIT_VSX_P (V4SFmode)"
+   "xscvspdp %x0,%x1"
+@@ -1197,7 +1236,7 @@
+ ;; ISA 2.07 xscvdpspn/xscvspdpn that does not raise an error on signalling NaNs
+ (define_insn "vsx_xscvdpspn"
+-  [(set (match_operand:V4SF 0 "vsx_register_operand" "=ws,?wa")
++  [(set (match_operand:V4SF 0 "vsx_register_operand" "=ww,?ww")
+       (unspec:V4SF [(match_operand:DF 1 "vsx_register_operand" "wd,wa")]
+                    UNSPEC_VSX_CVDPSPN))]
+   "TARGET_XSCVDPSPN"
+@@ -1205,8 +1244,8 @@
+   [(set_attr "type" "fp")])
+ (define_insn "vsx_xscvspdpn"
+-  [(set (match_operand:DF 0 "vsx_register_operand" "=ws,?wa")
+-      (unspec:DF [(match_operand:V4SF 1 "vsx_register_operand" "wa,wa")]
++  [(set (match_operand:DF 0 "vsx_register_operand" "=ws,?ws")
++      (unspec:DF [(match_operand:V4SF 1 "vsx_register_operand" "wf,wa")]
+                  UNSPEC_VSX_CVSPDPN))]
+   "TARGET_XSCVSPDPN"
+   "xscvspdpn %x0,%x1"
+@@ -1213,8 +1252,8 @@
+   [(set_attr "type" "fp")])
+ (define_insn "vsx_xscvdpspn_scalar"
+-  [(set (match_operand:V4SF 0 "vsx_register_operand" "=wa")
+-      (unspec:V4SF [(match_operand:SF 1 "vsx_register_operand" "f")]
++  [(set (match_operand:V4SF 0 "vsx_register_operand" "=wf,?wa")
++      (unspec:V4SF [(match_operand:SF 1 "vsx_register_operand" "ww,ww")]
+                    UNSPEC_VSX_CVDPSPN))]
+   "TARGET_XSCVDPSPN"
+   "xscvdpspn %x0,%x1"
+@@ -1302,10 +1341,10 @@
+ ;; since the xsrdpiz instruction does not truncate the value if the floating
+ ;; point value is < LONG_MIN or > LONG_MAX.
+ (define_insn "*vsx_float_fix_<mode>2"
+-  [(set (match_operand:VSX_DF 0 "vsx_register_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_DF 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (float:VSX_DF
+        (fix:<VSI>
+-        (match_operand:VSX_DF 1 "vsx_register_operand" "<VSr>,?wa"))))]
++        (match_operand:VSX_DF 1 "vsx_register_operand" "<VSr>,?<VSa>"))))]
+   "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
+    && VECTOR_UNIT_VSX_P (<MODE>mode) && flag_unsafe_math_optimizations
+    && !flag_trapping_math && TARGET_FRIZ"
+@@ -1318,10 +1357,10 @@
+ ;; Build a V2DF/V2DI vector from two scalars
+ (define_insn "vsx_concat_<mode>"
+-  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=<VSr>,?wa")
++  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=<VSr>,?<VSa>")
+       (vec_concat:VSX_D
+-       (match_operand:<VS_scalar> 1 "vsx_register_operand" "ws,wa")
+-       (match_operand:<VS_scalar> 2 "vsx_register_operand" "ws,wa")))]
++       (match_operand:<VS_scalar> 1 "vsx_register_operand" "<VS_64reg>,<VSa>")
++       (match_operand:<VS_scalar> 2 "vsx_register_operand" "<VS_64reg>,<VSa>")))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+ {
+   if (BYTES_BIG_ENDIAN)
+@@ -1352,9 +1391,9 @@
+ ;; xxpermdi for little endian loads and stores.  We need several of
+ ;; these since the form of the PARALLEL differs by mode.
+ (define_insn "*vsx_xxpermdi2_le_<mode>"
+-  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
+-        (vec_select:VSX_D
+-          (match_operand:VSX_D 1 "vsx_register_operand" "wa")
++  [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=<VSa>")
++        (vec_select:VSX_LE
++          (match_operand:VSX_LE 1 "vsx_register_operand" "<VSa>")
+           (parallel [(const_int 1) (const_int 0)])))]
+   "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
+   "xxpermdi %x0,%x1,%x1,2"
+@@ -1361,9 +1400,9 @@
+   [(set_attr "type" "vecperm")])
+ (define_insn "*vsx_xxpermdi4_le_<mode>"
+-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wa")
++  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=<VSa>")
+         (vec_select:VSX_W
+-          (match_operand:VSX_W 1 "vsx_register_operand" "wa")
++          (match_operand:VSX_W 1 "vsx_register_operand" "<VSa>")
+           (parallel [(const_int 2) (const_int 3)
+                      (const_int 0) (const_int 1)])))]
+   "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
+@@ -1401,9 +1440,9 @@
+ ;; lxvd2x for little endian loads.  We need several of
+ ;; these since the form of the PARALLEL differs by mode.
+ (define_insn "*vsx_lxvd2x2_le_<mode>"
+-  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
+-        (vec_select:VSX_D
+-          (match_operand:VSX_D 1 "memory_operand" "Z")
++  [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=<VSa>")
++        (vec_select:VSX_LE
++          (match_operand:VSX_LE 1 "memory_operand" "Z")
+           (parallel [(const_int 1) (const_int 0)])))]
+   "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
+   "lxvd2x %x0,%y1"
+@@ -1410,7 +1449,7 @@
+   [(set_attr "type" "vecload")])
+ (define_insn "*vsx_lxvd2x4_le_<mode>"
+-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wa")
++  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=<VSa>")
+         (vec_select:VSX_W
+           (match_operand:VSX_W 1 "memory_operand" "Z")
+           (parallel [(const_int 2) (const_int 3)
+@@ -1450,9 +1489,9 @@
+ ;; stxvd2x for little endian stores.  We need several of
+ ;; these since the form of the PARALLEL differs by mode.
+ (define_insn "*vsx_stxvd2x2_le_<mode>"
+-  [(set (match_operand:VSX_D 0 "memory_operand" "=Z")
+-        (vec_select:VSX_D
+-          (match_operand:VSX_D 1 "vsx_register_operand" "wa")
++  [(set (match_operand:VSX_LE 0 "memory_operand" "=Z")
++        (vec_select:VSX_LE
++          (match_operand:VSX_LE 1 "vsx_register_operand" "<VSa>")
+           (parallel [(const_int 1) (const_int 0)])))]
+   "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
+   "stxvd2x %x1,%y0"
+@@ -1461,7 +1500,7 @@
+ (define_insn "*vsx_stxvd2x4_le_<mode>"
+   [(set (match_operand:VSX_W 0 "memory_operand" "=Z")
+         (vec_select:VSX_W
+-          (match_operand:VSX_W 1 "vsx_register_operand" "wa")
++          (match_operand:VSX_W 1 "vsx_register_operand" "<VSa>")
+           (parallel [(const_int 2) (const_int 3)
+                      (const_int 0) (const_int 1)])))]
+   "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
+@@ -1513,11 +1552,12 @@
+ ;; Set the element of a V2DI/VD2F mode
+ (define_insn "vsx_set_<mode>"
+-  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wd,?wa")
+-      (unspec:VSX_D [(match_operand:VSX_D 1 "vsx_register_operand" "wd,wa")
+-                     (match_operand:<VS_scalar> 2 "vsx_register_operand" "ws,wa")
+-                     (match_operand:QI 3 "u5bit_cint_operand" "i,i")]
+-                    UNSPEC_VSX_SET))]
++  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wd,?<VSa>")
++      (unspec:VSX_D
++       [(match_operand:VSX_D 1 "vsx_register_operand" "wd,<VSa>")
++        (match_operand:<VS_scalar> 2 "vsx_register_operand" "<VS_64reg>,<VSa>")
++        (match_operand:QI 3 "u5bit_cint_operand" "i,i")]
++       UNSPEC_VSX_SET))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+ {
+   int idx_first = BYTES_BIG_ENDIAN ? 0 : 1;
+@@ -1582,7 +1622,7 @@
+ (define_insn_and_split "vsx_extract_v4sf"
+   [(set (match_operand:SF 0 "vsx_register_operand" "=f,f")
+       (vec_select:SF
+-       (match_operand:V4SF 1 "vsx_register_operand" "wa,wa")
++       (match_operand:V4SF 1 "vsx_register_operand" "<VSa>,<VSa>")
+        (parallel [(match_operand:QI 2 "u5bit_cint_operand" "O,i")])))
+    (clobber (match_scratch:V4SF 3 "=X,0"))]
+   "VECTOR_UNIT_VSX_P (V4SFmode)"
+@@ -1606,7 +1646,7 @@
+     {
+       if (GET_CODE (op3) == SCRATCH)
+       op3 = gen_reg_rtx (V4SFmode);
+-      emit_insn (gen_vsx_xxsldwi_v4sf (op3, op1, op1, op2));
++      emit_insn (gen_vsx_xxsldwi_v4sf (op3, op1, op1, GEN_INT (ele)));
+       tmp = op3;
+     }
+   emit_insn (gen_vsx_xscvspdp_scalar2 (op0, tmp));
+@@ -1765,9 +1805,9 @@
+ ;; V2DF/V2DI splat
+ (define_insn "vsx_splat_<mode>"
+-  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wd,wd,wd,?wa,?wa,?wa")
++  [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wd,wd,wd,?<VSa>,?<VSa>,?<VSa>")
+       (vec_duplicate:VSX_D
+-       (match_operand:<VS_scalar> 1 "splat_input_operand" "ws,f,Z,wa,wa,Z")))]
++       (match_operand:<VS_scalar> 1 "splat_input_operand" "<VS_64reg>,f,Z,<VSa>,<VSa>,Z")))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+   "@
+    xxpermdi %x0,%x1,%x1,0
+@@ -1780,10 +1820,10 @@
+ ;; V4SF/V4SI splat
+ (define_insn "vsx_xxspltw_<mode>"
+-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?wa")
++  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?<VSa>")
+       (vec_duplicate:VSX_W
+        (vec_select:<VS_scalar>
+-        (match_operand:VSX_W 1 "vsx_register_operand" "wf,wa")
++        (match_operand:VSX_W 1 "vsx_register_operand" "wf,<VSa>")
+         (parallel
+          [(match_operand:QI 2 "u5bit_cint_operand" "i,i")]))))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+@@ -1796,8 +1836,8 @@
+   [(set_attr "type" "vecperm")])
+ (define_insn "vsx_xxspltw_<mode>_direct"
+-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?wa")
+-        (unspec:VSX_W [(match_operand:VSX_W 1 "vsx_register_operand" "wf,wa")
++  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?<VSa>")
++        (unspec:VSX_W [(match_operand:VSX_W 1 "vsx_register_operand" "wf,<VSa>")
+                        (match_operand:QI 2 "u5bit_cint_operand" "i,i")]
+                       UNSPEC_VSX_XXSPLTW))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+@@ -1806,11 +1846,11 @@
+ ;; V4SF/V4SI interleave
+ (define_insn "vsx_xxmrghw_<mode>"
+-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?wa")
++  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?<VSa>")
+         (vec_select:VSX_W
+         (vec_concat:<VS_double>
+-          (match_operand:VSX_W 1 "vsx_register_operand" "wf,wa")
+-          (match_operand:VSX_W 2 "vsx_register_operand" "wf,wa"))
++          (match_operand:VSX_W 1 "vsx_register_operand" "wf,<VSa>")
++          (match_operand:VSX_W 2 "vsx_register_operand" "wf,<VSa>"))
+         (parallel [(const_int 0) (const_int 4)
+                    (const_int 1) (const_int 5)])))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+@@ -1823,11 +1863,11 @@
+   [(set_attr "type" "vecperm")])
+ (define_insn "vsx_xxmrglw_<mode>"
+-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?wa")
++  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wf,?<VSa>")
+       (vec_select:VSX_W
+         (vec_concat:<VS_double>
+-          (match_operand:VSX_W 1 "vsx_register_operand" "wf,wa")
+-          (match_operand:VSX_W 2 "vsx_register_operand" "wf,?wa"))
++          (match_operand:VSX_W 1 "vsx_register_operand" "wf,<VSa>")
++          (match_operand:VSX_W 2 "vsx_register_operand" "wf,?<VSa>"))
+         (parallel [(const_int 2) (const_int 6)
+                    (const_int 3) (const_int 7)])))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+@@ -1841,9 +1881,9 @@
+ ;; Shift left double by word immediate
+ (define_insn "vsx_xxsldwi_<mode>"
+-  [(set (match_operand:VSX_L 0 "vsx_register_operand" "=wa")
+-      (unspec:VSX_L [(match_operand:VSX_L 1 "vsx_register_operand" "wa")
+-                     (match_operand:VSX_L 2 "vsx_register_operand" "wa")
++  [(set (match_operand:VSX_L 0 "vsx_register_operand" "=<VSa>")
++      (unspec:VSX_L [(match_operand:VSX_L 1 "vsx_register_operand" "<VSa>")
++                     (match_operand:VSX_L 2 "vsx_register_operand" "<VSa>")
+                      (match_operand:QI 3 "u5bit_cint_operand" "i")]
+                     UNSPEC_VSX_SLDWI))]
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+@@ -1924,7 +1964,7 @@
+ ;; to the top element of the V2DF array without doing an extract.
+ (define_insn_and_split "*vsx_reduc_<VEC_reduc_name>_v2df_scalar"
+-  [(set (match_operand:DF 0 "vfloat_operand" "=&ws,&?wa,ws,?wa")
++  [(set (match_operand:DF 0 "vfloat_operand" "=&ws,&?ws,ws,?ws")
+       (vec_select:DF
+        (VEC_reduc:V2DF
+         (vec_concat:V2DF
+Index: gcc/config/rs6000/rs6000.h
+===================================================================
+--- gcc/config/rs6000/rs6000.h (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/rs6000.h (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1438,6 +1438,10 @@
+   RS6000_CONSTRAINT_wd,               /* VSX register for V2DF */
+   RS6000_CONSTRAINT_wf,               /* VSX register for V4SF */
+   RS6000_CONSTRAINT_wg,               /* FPR register for -mmfpgpr */
++  RS6000_CONSTRAINT_wh,               /* FPR register for direct moves.  */
++  RS6000_CONSTRAINT_wi,               /* FPR/VSX register to hold DImode */
++  RS6000_CONSTRAINT_wj,               /* FPR/VSX register for DImode direct moves. */
++  RS6000_CONSTRAINT_wk,               /* FPR/VSX register for DFmode direct moves. */
+   RS6000_CONSTRAINT_wl,               /* FPR register for LFIWAX */
+   RS6000_CONSTRAINT_wm,               /* VSX register for direct move */
+   RS6000_CONSTRAINT_wr,               /* GPR register if 64-bit  */
+@@ -1462,6 +1466,9 @@
+ #define VSX_REG_CLASS_P(CLASS)                        \
+   ((CLASS) == VSX_REGS || (CLASS) == FLOAT_REGS || (CLASS) == ALTIVEC_REGS)
++/* Return whether a given register class targets general purpose registers.  */
++#define GPR_REG_CLASS_P(CLASS) ((CLASS) == GENERAL_REGS || (CLASS) == BASE_REGS)
++
+ /* Given an rtx X being reloaded into a reg required to be
+    in class CLASS, return the class of reg to actually use.
+    In general this is just CLASS; but on some machines
+@@ -1593,8 +1600,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
+@@ -2483,8 +2497,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).  */
+@@ -2501,6 +2515,7 @@
+ #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                       \
+@@ -2514,7 +2529,8 @@
+                                | RS6000_BTM_POPCNTD                   \
+                                | RS6000_BTM_CELL                      \
+                                | RS6000_BTM_DFP                       \
+-                               | RS6000_BTM_HARD_FLOAT)
++                               | RS6000_BTM_HARD_FLOAT                \
++                               | RS6000_BTM_LDBL128)
+ /* Define builtin enum index.  */
+Index: gcc/config/rs6000/altivec.md
+===================================================================
+--- gcc/config/rs6000/altivec.md       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/altivec.md       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2297,7 +2297,31 @@
+   "dststt %0,%1,%2"
+   [(set_attr "type" "vecsimple")])
+-(define_insn "altivec_lvsl"
++(define_expand "altivec_lvsl"
++  [(use (match_operand:V16QI 0 "register_operand" ""))
++   (use (match_operand:V16QI 1 "memory_operand" ""))]
++  "TARGET_ALTIVEC"
++{
++  if (VECTOR_ELT_ORDER_BIG)
++    emit_insn (gen_altivec_lvsl_direct (operands[0], operands[1]));
++  else
++    {
++      int i;
++      rtx mask, perm[16], constv, vperm;
++      mask = gen_reg_rtx (V16QImode);
++      emit_insn (gen_altivec_lvsl_direct (mask, operands[1]));
++      for (i = 0; i < 16; ++i)
++        perm[i] = GEN_INT (i);
++      constv = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm));
++      constv = force_reg (V16QImode, constv);
++      vperm = gen_rtx_UNSPEC (V16QImode, gen_rtvec (3, mask, mask, constv),
++                              UNSPEC_VPERM);
++      emit_insn (gen_rtx_SET (VOIDmode, operands[0], vperm));
++    }
++  DONE;
++})
++
++(define_insn "altivec_lvsl_direct"
+   [(set (match_operand:V16QI 0 "register_operand" "=v")
+       (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "Z")]
+                     UNSPEC_LVSL))]
+@@ -2305,7 +2329,31 @@
+   "lvsl %0,%y1"
+   [(set_attr "type" "vecload")])
+-(define_insn "altivec_lvsr"
++(define_expand "altivec_lvsr"
++  [(use (match_operand:V16QI 0 "register_operand" ""))
++   (use (match_operand:V16QI 1 "memory_operand" ""))]
++  "TARGET_ALTIVEC"
++{
++  if (VECTOR_ELT_ORDER_BIG)
++    emit_insn (gen_altivec_lvsr_direct (operands[0], operands[1]));
++  else
++    {
++      int i;
++      rtx mask, perm[16], constv, vperm;
++      mask = gen_reg_rtx (V16QImode);
++      emit_insn (gen_altivec_lvsr_direct (mask, operands[1]));
++      for (i = 0; i < 16; ++i)
++        perm[i] = GEN_INT (i);
++      constv = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm));
++      constv = force_reg (V16QImode, constv);
++      vperm = gen_rtx_UNSPEC (V16QImode, gen_rtvec (3, mask, mask, constv),
++                              UNSPEC_VPERM);
++      emit_insn (gen_rtx_SET (VOIDmode, operands[0], vperm));
++    }
++  DONE;
++})
++
++(define_insn "altivec_lvsr_direct"
+   [(set (match_operand:V16QI 0 "register_operand" "=v")
+       (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "Z")]
+                     UNSPEC_LVSR))]
+Index: gcc/config/rs6000/rs6000.md
+===================================================================
+--- gcc/config/rs6000/rs6000.md        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/rs6000.md        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -134,6 +134,7 @@
+    UNSPEC_UNPACK_128BIT
+    UNSPEC_PACK_128BIT
+    UNSPEC_LSQ
++   UNSPEC_FUSION_GPR
+   ])
+ ;;
+@@ -317,8 +318,25 @@
+ (define_mode_attr f32_sv [(SF "stxsspx %x1,%y0")  (SD "stxsiwzx %x1,%y0")])
+ ; Definitions for 32-bit fpr direct move
+-(define_mode_attr f32_dm [(SF "wn") (SD "wm")])
++; At present, the decimal modes are not allowed in the traditional altivec
++; registers, so restrict the constraints to just the traditional FPRs.
++(define_mode_attr f32_dm [(SF "wn") (SD "wh")])
++; Definitions for 32-bit VSX
++(define_mode_attr f32_vsx [(SF "ww") (SD "wn")])
++
++; Definitions for 32-bit use of altivec registers
++(define_mode_attr f32_av  [(SF "wu") (SD "wn")])
++
++; Definitions for 64-bit VSX
++(define_mode_attr f64_vsx [(DF "ws") (DD "wn")])
++
++; Definitions for 64-bit direct move
++(define_mode_attr f64_dm  [(DF "wk") (DD "wh")])
++
++; Definitions for 64-bit use of altivec registers
++(define_mode_attr f64_av  [(DF "wv") (DD "wn")])
++
+ ; These modes do not fit in integer registers in 32-bit mode.
+ ; but on e500v2, the gpr are 64 bit registers
+ (define_mode_iterator DIFD [DI (DF "!TARGET_E500_DOUBLE") DD])
+@@ -424,7 +442,7 @@
+ ;; either.
+ ;; Mode attribute for boolean operation register constraints for output
+-(define_mode_attr BOOL_REGS_OUTPUT    [(TI    "&r,r,r,wa,v")
++(define_mode_attr BOOL_REGS_OUTPUT    [(TI    "&r,r,r,wt,v")
+                                        (PTI   "&r,r,r")
+                                        (V16QI "wa,v,&?r,?r,?r")
+                                        (V8HI  "wa,v,&?r,?r,?r")
+@@ -435,7 +453,7 @@
+                                        (V1TI  "wa,v,&?r,?r,?r")])
+ ;; Mode attribute for boolean operation register constraints for operand1
+-(define_mode_attr BOOL_REGS_OP1               [(TI    "r,0,r,wa,v")
++(define_mode_attr BOOL_REGS_OP1               [(TI    "r,0,r,wt,v")
+                                        (PTI   "r,0,r")
+                                        (V16QI "wa,v,r,0,r")
+                                        (V8HI  "wa,v,r,0,r")
+@@ -446,7 +464,7 @@
+                                        (V1TI  "wa,v,r,0,r")])
+ ;; Mode attribute for boolean operation register constraints for operand2
+-(define_mode_attr BOOL_REGS_OP2               [(TI    "r,r,0,wa,v")
++(define_mode_attr BOOL_REGS_OP2               [(TI    "r,r,0,wt,v")
+                                        (PTI   "r,r,0")
+                                        (V16QI "wa,v,r,r,0")
+                                        (V8HI  "wa,v,r,r,0")
+@@ -459,7 +477,7 @@
+ ;; Mode attribute for boolean operation register constraints for operand1
+ ;; for one_cmpl.  To simplify things, we repeat the constraint where 0
+ ;; is used for operand1 or operand2
+-(define_mode_attr BOOL_REGS_UNARY     [(TI    "r,0,0,wa,v")
++(define_mode_attr BOOL_REGS_UNARY     [(TI    "r,0,0,wt,v")
+                                        (PTI   "r,0,0")
+                                        (V16QI "wa,v,r,0,0")
+                                        (V8HI  "wa,v,r,0,0")
+@@ -566,7 +584,7 @@
+   "")
+ (define_insn "*zero_extendsidi2_lfiwzx"
+-  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wm,!wz,!wu")
++  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wj,!wz,!wu")
+       (zero_extend:DI (match_operand:SI 1 "reg_or_mem_operand" "m,r,r,Z,Z")))]
+   "TARGET_POWERPC64 && TARGET_LFIWZX"
+   "@
+@@ -736,8 +754,8 @@
+   "")
+ (define_insn "*extendsidi2_lfiwax"
+-  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wm,!wl,!wu")
+-      (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r,r,Z,Z")))]
++  [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wj,!wl,!wu")
++      (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r,r,Z,Z")))]
+   "TARGET_POWERPC64 && TARGET_LFIWAX"
+   "@
+    lwa%U1%X1 %0,%1
+@@ -760,7 +778,7 @@
+ (define_insn "*extendsidi2_nocell"
+   [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
+-      (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))]
++      (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r")))]
+   "TARGET_POWERPC64 && rs6000_gen_cell_microcode && !TARGET_LFIWAX"
+   "@
+    lwa%U1%X1 %0,%1
+@@ -5614,7 +5632,7 @@
+ ; We don't define lfiwax/lfiwzx with the normal definition, because we
+ ; don't want to support putting SImode in FPR registers.
+ (define_insn "lfiwax"
+-  [(set (match_operand:DI 0 "gpc_reg_operand" "=d,wm,!wm")
++  [(set (match_operand:DI 0 "gpc_reg_operand" "=d,wj,!wj")
+       (unspec:DI [(match_operand:SI 1 "reg_or_indexed_operand" "Z,Z,r")]
+                  UNSPEC_LFIWAX))]
+   "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT && TARGET_LFIWAX"
+@@ -5694,7 +5712,7 @@
+    (set_attr "type" "fpload")])
+ (define_insn "lfiwzx"
+-  [(set (match_operand:DI 0 "gpc_reg_operand" "=d,wm,!wm")
++  [(set (match_operand:DI 0 "gpc_reg_operand" "=d,wj,!wj")
+       (unspec:DI [(match_operand:SI 1 "reg_or_indexed_operand" "Z,Z,r")]
+                  UNSPEC_LFIWZX))]
+   "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT && TARGET_LFIWZX"
+@@ -9210,8 +9228,8 @@
+ }")
+ (define_insn "mov<mode>_hardfloat"
+-  [(set (match_operand:FMOVE32 0 "nonimmediate_operand" "=!r,!r,m,f,wa,wa,<f32_lr>,<f32_sm>,wu,Z,?<f32_dm>,?r,*c*l,!r,*h,!r,!r")
+-      (match_operand:FMOVE32 1 "input_operand" "r,m,r,f,wa,j,<f32_lm>,<f32_sr>,Z,wu,r,<f32_dm>,r,h,0,G,Fn"))]
++  [(set (match_operand:FMOVE32 0 "nonimmediate_operand" "=!r,!r,m,f,<f32_vsx>,<f32_vsx>,<f32_lr>,<f32_sm>,<f32_av>,Z,?<f32_dm>,?r,*c*l,!r,*h,!r,!r")
++      (match_operand:FMOVE32 1 "input_operand" "r,m,r,f,<f32_vsx>,j,<f32_lm>,<f32_sr>,Z,<f32_av>,r,<f32_dm>,r, h, 0, G,Fn"))]
+   "(gpc_reg_operand (operands[0], <MODE>mode)
+    || gpc_reg_operand (operands[1], <MODE>mode))
+    && (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT)"
+@@ -9422,8 +9440,8 @@
+ ;; reloading.
+ (define_insn "*mov<mode>_hardfloat32"
+-  [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m,d,d,wv,Z,wa,wa,Y,r,!r,!r,!r,!r")
+-      (match_operand:FMOVE64 1 "input_operand" "d,m,d,Z,wv,wa,j,r,Y,r,G,H,F"))]
++  [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m,d,d,<f64_av>,Z,<f64_vsx>,<f64_vsx>,Y,r,!r,!r,!r,!r")
++      (match_operand:FMOVE64 1 "input_operand" "d,m,d,Z,<f64_av>,<f64_vsx>,j,r,Y,r,G,H,F"))]
+   "! TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT 
+    && (gpc_reg_operand (operands[0], <MODE>mode)
+        || gpc_reg_operand (operands[1], <MODE>mode))"
+@@ -9491,8 +9509,8 @@
+ ; ld/std require word-aligned displacements -> 'Y' constraint.
+ ; List Y->r and r->Y before r->r for reload.
+ (define_insn "*mov<mode>_hardfloat64"
+-  [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m,d,d,wv,Z,wa,wa,Y,r,!r,*c*l,!r,*h,!r,!r,!r,r,wg,r,wm")
+-      (match_operand:FMOVE64 1 "input_operand" "d,m,d,Z,wv,wa,j,r,Y,r,r,h,0,G,H,F,wg,r,wm,r"))]
++  [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m,d,d,<f64_av>,Z,<f64_vsx>,<f64_vsx>,Y,r,!r,*c*l,!r,*h,!r,!r,!r,r,wg,r,<f64_dm>")
++      (match_operand:FMOVE64 1 "input_operand" "d,m,d,Z,<f64_av>,<f64_vsx>,j,r,Y,r,r,h,0,G,H,F,wg,r,<f64_dm>,r"))]
+   "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
+    && (gpc_reg_operand (operands[0], <MODE>mode)
+        || gpc_reg_operand (operands[1], <MODE>mode))"
+@@ -10272,8 +10290,8 @@
+ { rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
+ (define_insn "*movdi_internal64"
+-  [(set (match_operand:DI 0 "nonimmediate_operand" "=Y,r,r,r,r,r,?m,?*d,?*d,r,*h,*h,r,?*wg,r,?*wm")
+-      (match_operand:DI 1 "input_operand" "r,Y,r,I,L,nF,d,m,d,*h,r,0,*wg,r,*wm,r"))]
++  [(set (match_operand:DI 0 "nonimmediate_operand" "=Y,r,r,r,r,r,?m,?*d,?*d,r,*h,*h,r,?*wg,r,?*wj,?*wi")
++      (match_operand:DI 1 "input_operand" "r,Y,r,I,L,nF,d,m,d,*h,r,0,*wg,r,*wj,r,O"))]
+   "TARGET_POWERPC64
+    && (gpc_reg_operand (operands[0], DImode)
+        || gpc_reg_operand (operands[1], DImode))"
+@@ -10293,7 +10311,8 @@
+    mftgpr %0,%1
+    mffgpr %0,%1
+    mfvsrd %0,%x1
+-   mtvsrd %x0,%1"
++   mtvsrd %x0,%1
++   xxlxor %x0,%x0,%x0"
+   [(set_attr_alternative "type"
+       [(if_then_else
+        (match_test "update_indexed_address_mem (operands[0], VOIDmode)")
+@@ -10334,8 +10353,9 @@
+        (const_string "mftgpr")
+        (const_string "mffgpr")
+        (const_string "mftgpr")
+-       (const_string "mffgpr")])
+-   (set_attr "length" "4,4,4,4,4,20,4,4,4,4,4,4,4,4,4,4")])
++       (const_string "mffgpr")
++       (const_string "vecsimple")])
++   (set_attr "length" "4,4,4,4,4,20,4,4,4,4,4,4,4,4,4,4,4")])
+ ;; immediate value valid for a single instruction hiding in a const_double
+ (define_insn ""
+@@ -15751,23 +15771,10 @@
+ ;; a GPR.  The addis instruction must be adjacent to the load, and use the same
+ ;; register that is being loaded.  The fused ops must be physically adjacent.
+-;; We use define_peephole for the actual addis/load, and the register used to
+-;; hold the addis value must be the same as the register being loaded.  We use
+-;; define_peephole2 to change the register used for addis to be the register
+-;; being loaded, since we can look at whether it is dead after the load insn.
++;; Find cases where the addis that feeds into a load instruction is either used
++;; once or is the same as the target register, and replace it with the fusion
++;; insn
+-(define_peephole
+-  [(set (match_operand:P 0 "base_reg_operand" "")
+-      (match_operand:P 1 "fusion_gpr_addis" ""))
+-   (set (match_operand:INT1 2 "base_reg_operand" "")
+-      (match_operand:INT1 3 "fusion_gpr_mem_load" ""))]
+-  "TARGET_P8_FUSION && fusion_gpr_load_p (operands, false)"
+-{
+-  return emit_fusion_gpr_load (operands);
+-}
+-  [(set_attr "type" "load")
+-   (set_attr "length" "8")])
+-
+ (define_peephole2
+   [(set (match_operand:P 0 "base_reg_operand" "")
+       (match_operand:P 1 "fusion_gpr_addis" ""))
+@@ -15774,9 +15781,8 @@
+    (set (match_operand:INT1 2 "base_reg_operand" "")
+       (match_operand:INT1 3 "fusion_gpr_mem_load" ""))]
+   "TARGET_P8_FUSION
+-   && (REGNO (operands[0]) != REGNO (operands[2])
+-       || GET_CODE (operands[3]) == SIGN_EXTEND)
+-   && fusion_gpr_load_p (operands, true)"
++   && fusion_gpr_load_p (operands[0], operands[1], operands[2],
++                       operands[3])"
+   [(const_int 0)]
+ {
+   expand_fusion_gpr_load (operands);
+@@ -15783,6 +15789,20 @@
+   DONE;
+ })
++;; Fusion insn, created by the define_peephole2 above (and eventually by
++;; reload)
++
++(define_insn "fusion_gpr_load_<mode>"
++  [(set (match_operand:INT1 0 "base_reg_operand" "=&b")
++      (unspec:INT1 [(match_operand:INT1 1 "fusion_gpr_mem_combo" "")]
++                   UNSPEC_FUSION_GPR))]
++  "TARGET_P8_FUSION"
++{
++  return emit_fusion_gpr_load (operands[0], operands[1]);
++}
++  [(set_attr "type" "load")
++   (set_attr "length" "8")])
++
\f
+ ;; Miscellaneous ISA 2.06 (power7) instructions
+ (define_insn "addg6s"
+@@ -15847,26 +15867,6 @@
+   ""
+   "")
+-;; 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>
+Index: gcc/config/rs6000/sysv4.h
+===================================================================
+--- gcc/config/rs6000/sysv4.h  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/rs6000/sysv4.h  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -292,7 +292,7 @@
+ /* An expression for the alignment of a structure field FIELD if the
+    alignment computed in the usual way is COMPUTED.  */
+ #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED)                                 \
+-      ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)     \
++      (rs6000_special_adjust_field_align_p ((FIELD), (COMPUTED))            \
+        ? 128 : COMPUTED)
+ #undef  BIGGEST_FIELD_ALIGNMENT
+@@ -949,3 +949,27 @@
+ #define TARGET_USES_SYSV4_OPT 1
+ #undef DBX_REGISTER_NUMBER
++
++/* Link -lasan early on the command line.  For -static-libasan, don't link
++   it for -shared link, the executable should be compiled with -static-libasan
++   in that case, and for executable link link with --{,no-}whole-archive around
++   it to force everything into the executable.  And similarly for -ltsan.  */
++#if defined(HAVE_LD_STATIC_DYNAMIC)
++#undef LIBASAN_EARLY_SPEC
++#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
++  "%{static-libasan:%{!shared:" \
++  LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
++  LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}"
++#undef LIBTSAN_EARLY_SPEC
++#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
++  LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
++  LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}"
++#endif
++
++/* Additional libraries needed by -static-libasan.  */
++#undef STATIC_LIBASAN_LIBS
++#define STATIC_LIBASAN_LIBS "-ldl -lpthread"
++
++/* Additional libraries needed by -static-libtsan.  */
++#undef STATIC_LIBTSAN_LIBS
++#define STATIC_LIBTSAN_LIBS "-ldl -lpthread"
+Index: gcc/config/arm/arm.c
+===================================================================
+--- gcc/config/arm/arm.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/arm/arm.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -82,7 +82,6 @@
+ static reg_class_t arm_preferred_reload_class (rtx, reg_class_t);
+ static rtx thumb_legitimize_address (rtx, rtx, enum machine_mode);
+ inline static int thumb1_index_register_rtx_p (rtx, int);
+-static bool arm_legitimate_address_p (enum machine_mode, rtx, bool);
+ static int thumb_far_jump_used_p (void);
+ static bool thumb_force_lr_save (void);
+ static unsigned arm_size_return_regs (void);
+@@ -24476,9 +24475,13 @@
+       fputs (":\n", file);
+       if (flag_pic)
+       {
+-        /* Output ".word .LTHUNKn-7-.LTHUNKPCn".  */
++        /* Output ".word .LTHUNKn-[3,7]-.LTHUNKPCn".  */
+         rtx tem = XEXP (DECL_RTL (function), 0);
+-        tem = gen_rtx_PLUS (GET_MODE (tem), tem, GEN_INT (-7));
++        /* For TARGET_THUMB1_ONLY the thunk is in Thumb mode, so the PC
++           pipeline offset is four rather than eight.  Adjust the offset
++           accordingly.  */
++        tem = plus_constant (GET_MODE (tem), tem,
++                             TARGET_THUMB1_ONLY ? -3 : -7);
+         tem = gen_rtx_MINUS (GET_MODE (tem),
+                              tem,
+                              gen_rtx_SYMBOL_REF (Pmode,
+@@ -27462,4 +27465,13 @@
+ }
++/* return TRUE if x is a reference to a value in a constant pool */
++extern bool
++arm_is_constant_pool_ref (rtx x)
++{
++  return (MEM_P (x)
++        && GET_CODE (XEXP (x, 0)) == SYMBOL_REF
++        && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
++}
++
+ #include "gt-arm.h"
+Index: gcc/config/arm/arm-protos.h
+===================================================================
+--- gcc/config/arm/arm-protos.h        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/arm/arm-protos.h        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -55,6 +55,7 @@
+ extern int legitimate_pic_operand_p (rtx);
+ extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
+ extern rtx legitimize_tls_address (rtx, rtx);
++extern bool arm_legitimate_address_p (enum machine_mode, rtx, bool);
+ extern int arm_legitimate_address_outer_p (enum machine_mode, rtx, RTX_CODE, int);
+ extern int thumb_legitimate_offset_p (enum machine_mode, HOST_WIDE_INT);
+ extern bool arm_legitimize_reload_address (rtx *, enum machine_mode, int, int,
+@@ -286,4 +287,6 @@
+ extern void arm_emit_eabi_attribute (const char *, int, int);
++extern bool arm_is_constant_pool_ref (rtx);
++
+ #endif /* ! GCC_ARM_PROTOS_H */
+Index: gcc/config/arm/constraints.md
+===================================================================
+--- gcc/config/arm/constraints.md      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/arm/constraints.md      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -36,7 +36,7 @@
+ ;; in Thumb-2 state: Pj, PJ, Ps, Pt, Pu, Pv, Pw, Px, Py
+ ;; The following memory constraints have been used:
+-;; in ARM/Thumb-2 state: Q, Ut, Uv, Uy, Un, Um, Us
++;; in ARM/Thumb-2 state: Q, Uh, Ut, Uv, Uy, Un, Um, Us
+ ;; in ARM state: Uq
+ ;; in Thumb state: Uu, Uw
+@@ -310,6 +310,12 @@
+   An address valid for loading/storing register exclusive"
+  (match_operand 0 "mem_noofs_operand"))
++(define_memory_constraint "Uh"
++ "@internal
++  An address suitable for byte and half-word loads which does not point inside a constant pool"
++ (and (match_code "mem")
++      (match_test "arm_legitimate_address_p (GET_MODE (op), XEXP (op, 0), false) && !arm_is_constant_pool_ref (op)")))
++
+ (define_memory_constraint "Ut"
+  "@internal
+   In ARM/Thumb-2 state an address valid for loading/storing opaque structure
+@@ -356,7 +362,8 @@
+  (and (match_code "mem")
+       (match_test "TARGET_ARM
+                  && arm_legitimate_address_outer_p (GET_MODE (op), XEXP (op, 0),
+-                                                    SIGN_EXTEND, 0)")))
++                                                    SIGN_EXTEND, 0)
++                 && !arm_is_constant_pool_ref (op)")))
+ (define_memory_constraint "Q"
+  "@internal
+Index: gcc/config/arm/arm.md
+===================================================================
+--- gcc/config/arm/arm.md      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/arm/arm.md      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -4047,7 +4047,7 @@
+ (define_insn "unaligned_loadhis"
+   [(set (match_operand:SI 0 "s_register_operand" "=l,r")
+       (sign_extend:SI
+-        (unspec:HI [(match_operand:HI 1 "memory_operand" "Uw,m")]
++        (unspec:HI [(match_operand:HI 1 "memory_operand" "Uw,Uh")]
+                    UNSPEC_UNALIGNED_LOAD)))]
+   "unaligned_access && TARGET_32BIT"
+   "ldr%(sh%)\t%0, %1\t@ unaligned"
+@@ -4655,7 +4655,7 @@
+ (define_insn "*arm_zero_extendhisi2_v6"
+   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
+-      (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
++      (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,Uh")))]
+   "TARGET_ARM && arm_arch6"
+   "@
+    uxth%?\\t%0, %1
+@@ -4748,7 +4748,7 @@
+ (define_insn "*arm_zero_extendqisi2_v6"
+   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
+-      (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
++      (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,Uh")))]
+   "TARGET_ARM && arm_arch6"
+   "@
+    uxtb%(%)\\t%0, %1
+@@ -4980,7 +4980,7 @@
+ (define_insn "*arm_extendhisi2"
+   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
+-      (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
++      (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,Uh")))]
+   "TARGET_ARM && arm_arch4 && !arm_arch6"
+   "@
+    #
+@@ -4987,23 +4987,19 @@
+    ldr%(sh%)\\t%0, %1"
+   [(set_attr "length" "8,4")
+    (set_attr "type" "alu_shift,load_byte")
+-   (set_attr "predicable" "yes")
+-   (set_attr "pool_range" "*,256")
+-   (set_attr "neg_pool_range" "*,244")]
++   (set_attr "predicable" "yes")]
+ )
+ ;; ??? Check Thumb-2 pool range
+ (define_insn "*arm_extendhisi2_v6"
+   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
+-      (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
++      (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,Uh")))]
+   "TARGET_32BIT && arm_arch6"
+   "@
+    sxth%?\\t%0, %1
+    ldr%(sh%)\\t%0, %1"
+   [(set_attr "type" "simple_alu_shift,load_byte")
+-   (set_attr "predicable" "yes")
+-   (set_attr "pool_range" "*,256")
+-   (set_attr "neg_pool_range" "*,244")]
++   (set_attr "predicable" "yes")]
+ )
+ (define_insn "*arm_extendhisi2addsi"
+@@ -5045,9 +5041,7 @@
+   "TARGET_ARM && arm_arch4"
+   "ldr%(sb%)\\t%0, %1"
+   [(set_attr "type" "load_byte")
+-   (set_attr "predicable" "yes")
+-   (set_attr "pool_range" "256")
+-   (set_attr "neg_pool_range" "244")]
++   (set_attr "predicable" "yes")]
+ )
+ (define_expand "extendqisi2"
+@@ -5087,9 +5081,7 @@
+    ldr%(sb%)\\t%0, %1"
+   [(set_attr "length" "8,4")
+    (set_attr "type" "alu_shift,load_byte")
+-   (set_attr "predicable" "yes")
+-   (set_attr "pool_range" "*,256")
+-   (set_attr "neg_pool_range" "*,244")]
++   (set_attr "predicable" "yes")]
+ )
+ (define_insn "*arm_extendqisi_v6"
+@@ -5101,9 +5093,7 @@
+    sxtb%?\\t%0, %1
+    ldr%(sb%)\\t%0, %1"
+   [(set_attr "type" "simple_alu_shift,load_byte")
+-   (set_attr "predicable" "yes")
+-   (set_attr "pool_range" "*,256")
+-   (set_attr "neg_pool_range" "*,244")]
++   (set_attr "predicable" "yes")]
+ )
+ (define_insn "*arm_extendqisi2addsi"
+@@ -7630,12 +7620,13 @@
+ (define_insn "*arm_cmpdi_unsigned"
+   [(set (reg:CC_CZ CC_REGNUM)
+-      (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "r")
+-                     (match_operand:DI 1 "arm_di_operand"     "rDi")))]
++      (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "r,r")
++                     (match_operand:DI 1 "arm_di_operand"     "rDi,rDi")))]
+   "TARGET_32BIT"
+   "cmp\\t%R0, %R1\;it eq\;cmpeq\\t%Q0, %Q1"
+   [(set_attr "conds" "set")
+-   (set_attr "length" "8")]
++   (set_attr "arch" "a,t2")
++   (set_attr "length" "8,10")]
+ )
+ (define_insn "*arm_cmpdi_zero"
+Index: gcc/config/arm/t-rtems-eabi
+===================================================================
+--- gcc/config/arm/t-rtems-eabi        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/arm/t-rtems-eabi        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,47 +1,167 @@
+ # Custom RTEMS EABI multilibs
+-MULTILIB_OPTIONS  = mthumb march=armv6-m/march=armv7-a/march=armv7-r/march=armv7-m mfpu=neon mfloat-abi=hard
+-MULTILIB_DIRNAMES = thumb armv6-m armv7-a armv7-r armv7-m neon hard
++MULTILIB_OPTIONS  = mbig-endian mthumb march=armv6-m/march=armv7-a/march=armv7-r/march=armv7-m mfpu=neon/mfpu=vfpv3-d16/mfpu=fpv4-sp-d16 mfloat-abi=hard
++MULTILIB_DIRNAMES = eb thumb armv6-m armv7-a armv7-r armv7-m neon vfpv3-d16 fpv4-sp-d16 hard
+ # Enumeration of multilibs
+ MULTILIB_EXCEPTIONS =
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv6-m
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-a
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=neon
++# MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r/mfloat-abi=hard
++# MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-r
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/march=armv7-m
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mthumb
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv6-m
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-a
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-r
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/march=armv7-m
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=neon/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=neon
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian/mfpu=fpv4-sp-d16
++MULTILIB_EXCEPTIONS += mbig-endian/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mbig-endian
+ MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv6-m/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv6-m
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-a/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-a
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=neon
++# MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-r/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-r
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=vfpv3-d16
++# MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb/march=armv7-m
+ MULTILIB_EXCEPTIONS += mthumb/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mthumb/mfpu=neon
++MULTILIB_EXCEPTIONS += mthumb/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mthumb/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mthumb/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mthumb/mfloat-abi=hard
+ # MULTILIB_EXCEPTIONS += mthumb
+ MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv6-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv6-m/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv6-m
+ MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-a/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv7-a/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-a
+ MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-r/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv7-r/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-r
+ MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=neon
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += march=armv7-m/mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += march=armv7-m/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += march=armv7-m
+ MULTILIB_EXCEPTIONS += mfpu=neon/mfloat-abi=hard
+ MULTILIB_EXCEPTIONS += mfpu=neon
++MULTILIB_EXCEPTIONS += mfpu=vfpv3-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mfpu=vfpv3-d16
++MULTILIB_EXCEPTIONS += mfpu=fpv4-sp-d16/mfloat-abi=hard
++MULTILIB_EXCEPTIONS += mfpu=fpv4-sp-d16
+ MULTILIB_EXCEPTIONS += mfloat-abi=hard
+Index: gcc/config/pa/pa.c
+===================================================================
+--- gcc/config/pa/pa.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/config/pa/pa.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3237,7 +3237,12 @@
+       && aligned_p
+       && function_label_operand (x, VOIDmode))
+     {
+-      fputs (size == 8? "\t.dword\tP%" : "\t.word\tP%", asm_out_file);
++      fputs (size == 8? "\t.dword\t" : "\t.word\t", asm_out_file);
++
++      /* We don't want an OPD when generating fast indirect calls.  */
++      if (!TARGET_FAST_INDIRECT_CALLS)
++      fputs ("P%", asm_out_file);
++
+       output_addr_const (asm_out_file, x);
+       fputc ('\n', asm_out_file);
+       return true;
+@@ -4160,9 +4165,8 @@
+ pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
+ {
+   rtx insn = get_last_insn ();
++  bool extra_nop;
+-  last_address = 0;
+-
+   /* pa_expand_epilogue does the dirty work now.  We just need
+      to output the assembler directives which denote the end
+      of a function.
+@@ -4185,14 +4189,16 @@
+   if (insn && GET_CODE (insn) == CALL_INSN)
+     {
+       fputs ("\tnop\n", file);
+-      last_address += 4;
++      extra_nop = true;
+     }
++  else
++    extra_nop = false;
+   fputs ("\t.EXIT\n\t.PROCEND\n", file);
+   if (TARGET_SOM && TARGET_GAS)
+     {
+-      /* We done with this subspace except possibly for some additional
++      /* We are done with this subspace except possibly for some additional
+        debug information.  Forget that we are in this subspace to ensure
+        that the next function is output in its own subspace.  */
+       in_section = NULL;
+@@ -4199,12 +4205,20 @@
+       cfun->machine->in_nsubspa = 2;
+     }
++  /* Thunks do their own insn accounting.  */
++  if (cfun->is_thunk)
++    return;
++
+   if (INSN_ADDRESSES_SET_P ())
+     {
++      last_address = extra_nop ? 4 : 0;
+       insn = get_last_nonnote_insn ();
+-      last_address += INSN_ADDRESSES (INSN_UID (insn));
+-      if (INSN_P (insn))
+-      last_address += insn_default_length (insn);
++      if (insn)
++      {
++        last_address += INSN_ADDRESSES (INSN_UID (insn));
++        if (INSN_P (insn))
++          last_address += insn_default_length (insn);
++      }
+       last_address = ((last_address + FUNCTION_BOUNDARY / BITS_PER_UNIT - 1)
+                     & ~(FUNCTION_BOUNDARY / BITS_PER_UNIT - 1));
+     }
+@@ -8270,8 +8284,7 @@
+   xoperands[1] = XEXP (DECL_RTL (thunk_fndecl), 0);
+   xoperands[2] = GEN_INT (delta);
+-  ASM_OUTPUT_LABEL (file, XSTR (xoperands[1], 0));
+-  fprintf (file, "\t.PROC\n\t.CALLINFO FRAME=0,NO_CALLS\n\t.ENTRY\n");
++  final_start_function (emit_barrier (), file, 1);
+   /* Output the thunk.  We know that the function is in the same
+      translation unit (i.e., the same space) as the thunk, and that
+@@ -8301,12 +8314,16 @@
+                  || ((DECL_SECTION_NAME (thunk_fndecl)
+                       == DECL_SECTION_NAME (function))
+                      && last_address < 262132)))
++            /* In this case, we need to be able to reach the start of
++               the stub table even though the function is likely closer
++               and can be jumped to directly.  */
+             || (targetm_common.have_named_sections
+                 && DECL_SECTION_NAME (thunk_fndecl) == NULL
+                 && DECL_SECTION_NAME (function) == NULL
+-                && last_address < 262132)
++                && total_code_bytes < MAX_PCREL17F_OFFSET)
++            /* Likewise.  */
+             || (!targetm_common.have_named_sections
+-                && last_address < 262132))))
++                && total_code_bytes < MAX_PCREL17F_OFFSET))))
+     {
+       if (!val_14)
+       output_asm_insn ("addil L'%2,%%r26", xoperands);
+@@ -8477,17 +8494,8 @@
+       }
+     }
+-  fprintf (file, "\t.EXIT\n\t.PROCEND\n");
++  final_end_function ();
+-  if (TARGET_SOM && TARGET_GAS)
+-    {
+-      /* We done with this subspace except possibly for some additional
+-       debug information.  Forget that we are in this subspace to ensure
+-       that the next function is output in its own subspace.  */
+-      in_section = NULL;
+-      cfun->machine->in_nsubspa = 2;
+-    }
+-
+   if (TARGET_SOM && flag_pic && TREE_PUBLIC (function))
+     {
+       switch_to_section (data_section);
+Index: gcc/tree-vect-slp.c
+===================================================================
+--- gcc/tree-vect-slp.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/tree-vect-slp.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1837,7 +1837,10 @@
+           && (stmt_vinfo = vinfo_for_stmt (use_stmt))
+           && !STMT_SLP_TYPE (stmt_vinfo)
+             && (STMT_VINFO_RELEVANT (stmt_vinfo)
+-                || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (stmt_vinfo)))
++                || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (stmt_vinfo))
++              || (STMT_VINFO_IN_PATTERN_P (stmt_vinfo)
++                  && STMT_VINFO_RELATED_STMT (stmt_vinfo)
++                  && !STMT_SLP_TYPE (vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_vinfo)))))
+           && !(gimple_code (use_stmt) == GIMPLE_PHI
+                  && STMT_VINFO_DEF_TYPE (stmt_vinfo)
+                   == vect_reduction_def))
+Index: gcc/regcprop.c
+===================================================================
+--- gcc/regcprop.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ gcc/regcprop.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1039,7 +1039,17 @@
+            but instead among CLOBBERs on the CALL_INSN, we could wrongly
+            assume the value in it is still live.  */
+         if (ksvd.ignore_set_reg)
+-          note_stores (PATTERN (insn), kill_clobbered_value, vd);
++          {
++            note_stores (PATTERN (insn), kill_clobbered_value, vd);
++            for (exp = CALL_INSN_FUNCTION_USAGE (insn);
++                 exp;
++                 exp = XEXP (exp, 1))
++              {
++                rtx x = XEXP (exp, 0);
++                if (GET_CODE (x) == CLOBBER)
++                  kill_value (SET_DEST (x), vd);
++              }
++          }
+       }
+       /* Notice stores.  */
+Index: libobjc/encoding.c
+===================================================================
+--- libobjc/encoding.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libobjc/encoding.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -192,6 +192,8 @@
+    ? MAX (MAX (COMPUTED, SPECIFIED), 64)                              \
+    : MAX (COMPUTED, SPECIFIED));})
++#define rs6000_special_adjust_field_align_p(FIELD, COMPUTED) \
++ (TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)
+ /* Skip a variable name, enclosed in quotes (").  */
+ static inline
+Index: libobjc/ChangeLog
+===================================================================
+--- libobjc/ChangeLog  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libobjc/ChangeLog  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,16 @@
++2014-07-27  Ulrich Weigand  <uweigand@de.ibm.com>
++
++      PR libobjc/61920
++      * encoding.c (rs6000_special_adjust_field_align_p): Use definition
++      that matches the 4.8 branch ABI.
++
++2014-07-27  Alan Modra  <amodra@gmail.com>
++          Matthias Klose  <doko@ubuntu.com>
++
++      PR libobjc/61920
++
++      * encoding.c: Define rs6000_special_adjust_field_align_p.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libgfortran/m4/in_pack.m4
+===================================================================
+--- libgfortran/m4/in_pack.m4  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/in_pack.m4  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -79,7 +79,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = ('rtype_name` *)xmalloc (ssize * sizeof ('rtype_name`));
++  destptr = xmallocarray (ssize, sizeof ('rtype_name`));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/m4/pack.m4
+===================================================================
+--- libgfortran/m4/pack.m4     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/pack.m4     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -168,8 +168,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof ('rtype_name`) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof ('rtype_name`));
+         if (total == 0)
+           return;
+Index: libgfortran/m4/spread.m4
+===================================================================
+--- libgfortran/m4/spread.m4   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/spread.m4   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -102,8 +102,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof('rtype_name`));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof('rtype_name`));
+       if (rs <= 0)
+         return;
+     }
+@@ -245,7 +245,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof ('rtype_name`));
++      ret->base_addr = xmallocarray (ncopies, sizeof ('rtype_name`));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/m4/transpose.m4
+===================================================================
+--- libgfortran/m4/transpose.m4        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/transpose.m4        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -61,7 +61,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof ('rtype_name`) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof ('rtype_name`));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/m4/iforeach.m4
+===================================================================
+--- libgfortran/m4/iforeach.m4 (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/iforeach.m4 (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -30,7 +30,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (rtype_name) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (rtype_name));
+     }
+   else
+     {
+@@ -133,7 +133,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (rtype_name) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (rtype_name));
+     }
+   else
+     {
+@@ -264,7 +264,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (rtype_name) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (rtype_name));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/m4/eoshift1.m4
+===================================================================
+--- libgfortran/m4/eoshift1.m4 (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/eoshift1.m4 (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -106,8 +106,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/m4/eoshift3.m4
+===================================================================
+--- libgfortran/m4/eoshift3.m4 (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/eoshift3.m4 (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -90,7 +90,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+@@ -108,8 +108,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/m4/shape.m4
+===================================================================
+--- libgfortran/m4/shape.m4    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/shape.m4    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -50,7 +50,7 @@
+     {
+       GFC_DIMENSION_SET(ret->dim[0], 0, rank - 1, 1);
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (sizeof ('rtype_name`) * rank);
++      ret->base_addr = xmallocarray (rank, sizeof ('rtype_name`));
+     }
+   stride = GFC_DESCRIPTOR_STRIDE(ret,0);
+Index: libgfortran/m4/cshift1.m4
+===================================================================
+--- libgfortran/m4/cshift1.m4  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/cshift1.m4  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -81,7 +81,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+Index: libgfortran/m4/matmull.m4
+===================================================================
+--- libgfortran/m4/matmull.m4  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/matmull.m4  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -89,7 +89,7 @@
+         }
+           
+       retarray->base_addr
+-      = xmalloc (sizeof ('rtype_name`) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof ('rtype_name`));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/m4/bessel.m4
+===================================================================
+--- libgfortran/m4/bessel.m4   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/bessel.m4   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -56,7 +56,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof ('rtype_name`) * size);
++      ret->base_addr = xmallocarray (size, sizeof ('rtype_name`));
+       ret->offset = 0;
+     }
+@@ -123,7 +123,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof ('rtype_name`) * size);
++      ret->base_addr = xmallocarray (size, sizeof ('rtype_name`));
+       ret->offset = 0;
+     }
+@@ -163,7 +163,7 @@
+   x2rev = GFC_REAL_'rtype_kind`_LITERAL(2.)/x;
+-  for (i = 2; i <= n1+n2; i++)
++  for (i = 2; i <= n2 - n1; i++)
+     {
+ #if defined('rtype_name`_INFINITY)
+       if (unlikely (last2 == -'rtype_name`_INFINITY))
+Index: libgfortran/m4/unpack.m4
+===================================================================
+--- libgfortran/m4/unpack.m4   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/unpack.m4   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -100,7 +100,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof ('rtype_name`));
++      ret->base_addr = xmallocarray (rs, sizeof ('rtype_name`));
+     }
+   else
+     {
+@@ -245,7 +245,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof ('rtype_name`));
++      ret->base_addr = xmallocarray (rs, sizeof ('rtype_name`));
+     }
+   else
+     {
+Index: libgfortran/m4/reshape.m4
+===================================================================
+--- libgfortran/m4/reshape.m4  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/reshape.m4  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -115,11 +115,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof ('rtype_name`);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof ('rtype_name`));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/m4/ifunction_logical.m4
+===================================================================
+--- libgfortran/m4/ifunction_logical.m4        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/ifunction_logical.m4        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -89,8 +89,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (rtype_name) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -99,7 +98,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (rtype_name));
+     }
+   else
+     {
+Index: libgfortran/m4/ifunction.m4
+===================================================================
+--- libgfortran/m4/ifunction.m4        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/ifunction.m4        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -85,10 +85,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (rtype_name) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (rtype_name));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -260,8 +259,7 @@
+       }
+-      alloc_size = sizeof (rtype_name) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -273,7 +271,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (rtype_name));
+     }
+   else
+@@ -417,8 +415,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (rtype_name) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -427,7 +424,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (rtype_name));
+     }
+   else
+     {
+Index: libgfortran/m4/matmul.m4
+===================================================================
+--- libgfortran/m4/matmul.m4   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/m4/matmul.m4   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -125,7 +125,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof ('rtype_name`) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof ('rtype_name`));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/configure
+===================================================================
+--- libgfortran/configure      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/configure      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2595,6 +2595,7 @@
+ as_fn_append ac_func_list " getegid"
+ as_fn_append ac_func_list " secure_getenv"
+ as_fn_append ac_func_list " __secure_getenv"
++as_fn_append ac_func_list " strtok_r"
+ as_fn_append ac_header_list " math.h"
+ # Check that the precious variables saved in the cache have kept the same
+ # value.
+@@ -12339,7 +12340,7 @@
+   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+   lt_status=$lt_dlunknown
+   cat > conftest.$ac_ext <<_LT_EOF
+-#line 12342 "configure"
++#line 12343 "configure"
+ #include "confdefs.h"
+ #if HAVE_DLFCN_H
+@@ -12445,7 +12446,7 @@
+   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+   lt_status=$lt_dlunknown
+   cat > conftest.$ac_ext <<_LT_EOF
+-#line 12448 "configure"
++#line 12449 "configure"
+ #include "confdefs.h"
+ #if HAVE_DLFCN_H
+@@ -16506,6 +16507,8 @@
++
++
+Index: libgfortran/runtime/in_pack_generic.c
+===================================================================
+--- libgfortran/runtime/in_pack_generic.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/runtime/in_pack_generic.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -180,7 +180,7 @@
+     return source->base_addr;
+    /* Allocate storage for the destination.  */
+-  destptr = xmalloc (ssize * size);
++  destptr = xmallocarray (ssize, size);
+   dest = (char *)destptr;
+   src = source->base_addr;
+   stride0 = stride[0] * size;
+Index: libgfortran/runtime/memory.c
+===================================================================
+--- libgfortran/runtime/memory.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/runtime/memory.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -25,8 +25,13 @@
+ #include "libgfortran.h"
+ #include <stdlib.h>
++#include <errno.h>
++#ifndef SIZE_MAX
++#define SIZE_MAX ((size_t)-1)
++#endif
++
+ void *
+ xmalloc (size_t n)
+ {
+@@ -44,12 +49,34 @@
+ }
++void *
++xmallocarray (size_t nmemb, size_t size)
++{
++  void *p;
++
++  if (!nmemb || !size)
++    size = nmemb = 1;
++  else if (nmemb > SIZE_MAX / size)
++    {
++      errno = ENOMEM;
++      os_error ("Integer overflow in xmallocarray");
++    }
++
++  p = malloc (nmemb * size);
++
++  if (!p)
++    os_error ("Memory allocation failed in xmallocarray");
++
++  return p;
++}
++
++
+ /* calloc wrapper that aborts on error.  */
+ void *
+ xcalloc (size_t nmemb, size_t size)
+ {
+-  if (nmemb * size == 0)
++  if (!nmemb || !size)
+     nmemb = size = 1;
+   void *p = calloc (nmemb, size);
+Index: libgfortran/runtime/convert_char.c
+===================================================================
+--- libgfortran/runtime/convert_char.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/runtime/convert_char.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -44,7 +44,7 @@
+   gfc_charlen_type i, l;
+   l = len > 0 ? len : 0;
+-  *dst = xmalloc ((l + 1) * sizeof (gfc_char4_t));
++  *dst = xmallocarray ((l + 1), sizeof (gfc_char4_t));
+   for (i = 0; i < l; i++)
+     (*dst)[i] = src[i];
+@@ -60,7 +60,7 @@
+   gfc_charlen_type i, l;
+   l = len > 0 ? len : 0;
+-  *dst = xmalloc ((l + 1) * sizeof (unsigned char));
++  *dst = xmalloc (l + 1);
+   for (i = 0; i < l; i++)
+     (*dst)[i] = src[i];
+Index: libgfortran/runtime/environ.c
+===================================================================
+--- libgfortran/runtime/environ.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/runtime/environ.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -833,7 +833,7 @@
+     }
+   else
+     {
+-      elist = xmalloc (unit_count * sizeof (exception_t));
++      elist = xmallocarray (unit_count, sizeof (exception_t));
+       do_count = 0;
+       p = val;
+       do_parse ();
+Index: libgfortran/runtime/main.c
+===================================================================
+--- libgfortran/runtime/main.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/runtime/main.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -153,6 +153,16 @@
+ }
++#ifndef HAVE_STRTOK_R
++static char*
++gfstrtok_r (char *str, const char *delim, 
++          char **saveptr __attribute__ ((unused)))
++{
++  return strtok (str, delim);
++}
++#define strtok_r gfstrtok_r
++#endif
++
+ char *addr2line_path;
+ /* Find addr2line and store the path.  */
+@@ -161,30 +171,32 @@
+ find_addr2line (void)
+ {
+ #ifdef HAVE_ACCESS
+-#define A2L_LEN 10
++#define A2L_LEN 11
+   char *path = secure_getenv ("PATH");
+   if (!path)
+     return;
++  char *tp = strdup (path);
++  if (!tp)
++    return;
+   size_t n = strlen (path);
+-  char ap[n + 1 + A2L_LEN];
+-  size_t ai = 0;
+-  for (size_t i = 0; i < n; i++)
++  char *ap = xmalloc (n + A2L_LEN);
++  char *saveptr;
++  for (char *str = tp;; str = NULL)
+     {
+-      if (path[i] != ':')
+-      ap[ai++] = path[i];
+-      else
++      char *token = strtok_r (str, ":", &saveptr);
++      if (!token)
++      break;
++      size_t toklen = strlen (token);
++      memcpy (ap, token, toklen);
++      memcpy (ap + toklen, "/addr2line", A2L_LEN);
++      if (access (ap, R_OK|X_OK) == 0)
+       {
+-        ap[ai++] = '/';
+-        memcpy (ap + ai, "addr2line", A2L_LEN);
+-        if (access (ap, R_OK|X_OK) == 0)
+-          {
+-            addr2line_path = strdup (ap);
+-            return;
+-          }
+-        else
+-          ai = 0;
++        addr2line_path = strdup (ap);
++        break;
+       }
+     }
++  free (tp);
++  free (ap);
+ #endif
+ }
+Index: libgfortran/intrinsics/string_intrinsics_inc.c
+===================================================================
+--- libgfortran/intrinsics/string_intrinsics_inc.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/string_intrinsics_inc.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -164,7 +164,7 @@
+   else
+     {
+       /* Allocate space for result string.  */
+-      *dest = xmalloc (*len * sizeof (CHARTYPE));
++      *dest = xmallocarray (*len, sizeof (CHARTYPE));
+       /* Copy string if necessary.  */
+       memcpy (*dest, src, *len * sizeof (CHARTYPE));
+@@ -442,7 +442,7 @@
+     *dest = &zero_length_string;
+   else
+     {
+-      CHARTYPE *tmp = xmalloc (*rlen * sizeof (CHARTYPE));
++      CHARTYPE *tmp = xmallocarray (*rlen, sizeof (CHARTYPE));
+       memcpy (tmp, res, reslen * sizeof (CHARTYPE));
+       MEMSET (&tmp[reslen], ' ', *rlen - reslen);
+       *dest = tmp;
+Index: libgfortran/intrinsics/pack_generic.c
+===================================================================
+--- libgfortran/intrinsics/pack_generic.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/pack_generic.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -152,8 +152,8 @@
+         GFC_DIMENSION_SET(ret->dim[0], 0, total-1, 1);
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (size * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, size);
+         if (total == 0)
+           return;      /* In this case, nothing remains to be done.  */
+@@ -519,7 +519,7 @@
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (size * total);
++      ret->base_addr = xmallocarray (total, size);
+       if (total == 0)
+       return;
+Index: libgfortran/intrinsics/transpose_generic.c
+===================================================================
+--- libgfortran/intrinsics/transpose_generic.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/transpose_generic.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,7 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (size * size0 ((array_t*)ret));
++      ret->base_addr = xmallocarray (size0 ((array_t*)ret), size);
+       ret->offset = 0;
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/intrinsics/cshift0.c
+===================================================================
+--- libgfortran/intrinsics/cshift0.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/cshift0.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -79,8 +79,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/intrinsics/ctime.c
+===================================================================
+--- libgfortran/intrinsics/ctime.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/ctime.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -31,31 +31,53 @@
+ #include <string.h>
+-/* strftime-like function that fills a C string with %c format which
+-   is identical to ctime in the default locale. As ctime and ctime_r
+-   are poorly specified and their usage not recommended, the
+-   implementation instead uses strftime.  */
++/* Maximum space a ctime-like string might need. A "normal" ctime
++   string is 26 bytes, and in our case 24 bytes as we don't include
++   the trailing newline and null. However, the longest possible year
++   number is -2,147,481,748 (1900 - 2,147,483,648, since tm_year is a
++   32-bit signed integer) so an extra 7 bytes are needed. */
++#define CTIME_BUFSZ 31
+-static size_t
+-strctime (char *s, size_t max, const time_t *timep)
++
++/* Thread-safe ctime-like function that fills a Fortran
++   string. ctime_r is a portability headache and marked as obsolescent
++   in POSIX 2008, which recommends strftime in its place. However,
++   strftime(..., "%c",...)  doesn't produce ctime-like output on
++   MinGW, so do it manually with snprintf.  */
++
++static int
++gf_ctime (char *s, size_t max, const time_t timev)
+ {
+   struct tm ltm;
+   int failed;
++  char buf[CTIME_BUFSZ + 1];
+   /* Some targets provide a localtime_r based on a draft of the POSIX
+      standard where the return type is int rather than the
+      standardized struct tm*.  */
+-  __builtin_choose_expr (__builtin_classify_type (localtime_r (timep, &ltm)) 
++  __builtin_choose_expr (__builtin_classify_type (localtime_r (&timev, &ltm)) 
+                        == 5,
+-                       failed = localtime_r (timep, &ltm) == NULL,
+-                       failed = localtime_r (timep, &ltm) != 0);
++                       failed = localtime_r (&timev, &ltm) == NULL,
++                       failed = localtime_r (&timev, &ltm) != 0);
+   if (failed)
+-    return 0;
+-  return strftime (s, max, "%c", &ltm);
++    goto blank;
++  int n = snprintf (buf, sizeof (buf), 
++                  "%3.3s %3.3s%3d %.2d:%.2d:%.2d %d",
++                  "SunMonTueWedThuFriSat" + ltm.tm_wday * 3,
++                  "JanFebMarAprMayJunJulAugSepOctNovDec" + ltm.tm_mon * 3,
++                  ltm.tm_mday, ltm.tm_hour, ltm.tm_min, ltm.tm_sec, 
++                  1900 + ltm.tm_year);
++  if (n < 0)
++    goto blank;
++  if ((size_t) n <= max)
++    {
++      cf_strcpy (s, max, buf);
++      return n;
++    }
++ blank:
++  memset (s, ' ', max);
++  return 0;
+ }
+-/* In the default locale, the date and time representation fits in 26
+-   bytes. However, other locales might need more space.  */
+-#define CSZ 100
+ extern void fdate (char **, gfc_charlen_type *);
+ export_proto(fdate);
+@@ -64,8 +86,8 @@
+ fdate (char ** date, gfc_charlen_type * date_len)
+ {
+   time_t now = time(NULL);
+-  *date = xmalloc (CSZ);
+-  *date_len = strctime (*date, CSZ, &now);
++  *date = xmalloc (CTIME_BUFSZ);
++  *date_len = gf_ctime (*date, CTIME_BUFSZ, now);
+ }
+@@ -76,10 +98,7 @@
+ fdate_sub (char * date, gfc_charlen_type date_len)
+ {
+   time_t now = time(NULL);
+-  char *s = xmalloc (date_len + 1);
+-  size_t n = strctime (s, date_len + 1, &now);
+-  fstrcpy (date, date_len, s, n);
+-  free (s);
++  gf_ctime (date, date_len, now);
+ }
+@@ -91,8 +110,8 @@
+ PREFIX(ctime) (char ** date, gfc_charlen_type * date_len, GFC_INTEGER_8 t)
+ {
+   time_t now = t;
+-  *date = xmalloc (CSZ);
+-  *date_len = strctime (*date, CSZ, &now);
++  *date = xmalloc (CTIME_BUFSZ);
++  *date_len = gf_ctime (*date, CTIME_BUFSZ, now);
+ }
+@@ -103,8 +122,5 @@
+ ctime_sub (GFC_INTEGER_8 * t, char * date, gfc_charlen_type date_len)
+ {
+   time_t now = *t;
+-  char *s = xmalloc (date_len + 1);
+-  size_t n = strctime (s, date_len + 1, &now);
+-  fstrcpy (date, date_len, s, n);
+-  free (s);
++  gf_ctime (date, date_len, now);
+ }
+Index: libgfortran/intrinsics/spread_generic.c
+===================================================================
+--- libgfortran/intrinsics/spread_generic.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/spread_generic.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -100,7 +100,7 @@
+         GFC_DIMENSION_SET(ret->dim[n], 0, ub, stride);
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * size);
++      ret->base_addr = xmallocarray (rs, size);
+       if (rs <= 0)
+       return;
+@@ -245,7 +245,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * size);
++      ret->base_addr = xmallocarray (ncopies, size);
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/intrinsics/unpack_generic.c
+===================================================================
+--- libgfortran/intrinsics/unpack_generic.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/unpack_generic.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -125,7 +125,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * size);
++      ret->base_addr = xmallocarray (rs, size);
+     }
+   else
+     {
+Index: libgfortran/intrinsics/eoshift0.c
+===================================================================
+--- libgfortran/intrinsics/eoshift0.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/eoshift0.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -86,8 +86,8 @@
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/intrinsics/eoshift2.c
+===================================================================
+--- libgfortran/intrinsics/eoshift2.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/eoshift2.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -78,8 +78,8 @@
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+         {
+Index: libgfortran/intrinsics/reshape_generic.c
+===================================================================
+--- libgfortran/intrinsics/reshape_generic.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/intrinsics/reshape_generic.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,11 +99,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-      alloc_size = 1;
++      alloc_size = 0; /* xmalloc will allocate 1 byte.  */
+       else
+-      alloc_size = rs * size;
++      alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, size);
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/configure.ac
+===================================================================
+--- libgfortran/configure.ac   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/configure.ac   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -267,7 +267,7 @@
+ strcasestr getrlimit gettimeofday stat fstat lstat getpwuid vsnprintf dup \
+ getcwd localtime_r gmtime_r getpwuid_r ttyname_r clock_gettime \
+ readlink getgid getpid getppid getuid geteuid umask getegid \
+-secure_getenv __secure_getenv)
++secure_getenv __secure_getenv strtok_r)
+ # Check strerror_r, cannot be above as versions with two and three arguments exist
+ LIBGFOR_CHECK_STRERROR_R
+Index: libgfortran/ChangeLog
+===================================================================
+--- libgfortran/ChangeLog      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/ChangeLog      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,94 @@
++2014-10-20  Janne Blomqvist  <jb@gcc.gnu.org>
++
++      PR libfortran/63589
++      * configure.ac: Check for strtok_r.
++      * runtime/main.c (gfstrtok_r): Fallback implementation of
++      strtok_r.
++      (find_addr2line): Use strtok_r to split PATH.
++      * config.h.in: Regenerated.
++      * configure: Regenerated.
++
++2014-08-20  Steven G. Kargl  <kargl@gcc.gnu.org>
++
++      PR libgfortran/62188
++      * m4/bessel.m4: Avoid indexing off the end of an array.
++      * generated/bessel_r10.c: Regenerated.
++      * generated/bessel_r16.c: Ditto.
++      * generated/bessel_r4.c: Ditto.
++      * generated/bessel_r8.c: Ditto.
++
++2014-07-31  Janne Blomqvist  <jb@gcc.gnu.org>
++
++      Backport from mainline
++      CVE-2014-5044
++        * libgfortran.h (xmallocarray): New prototype.
++        * runtime/memory.c (xmallocarray): New function.
++        (xcalloc): Check for nonzero separately instead of multiplying.
++        * generated/*.c: Regenerated.
++        * intrinsics/cshift0.c (cshift0): Call xmallocarray instead of
++        xmalloc.
++        * intrinsics/eoshift0.c (eoshift0): Likewise.
++        * intrinsics/eoshift2.c (eoshift2): Likewise.
++        * intrinsics/pack_generic.c (pack_internal): Likewise.
++        (pack_s_internal): Likewise.
++        * intrinsics/reshape_generic.c (reshape_internal): Likewise.
++        * intrinsics/spread_generic.c (spread_internal): Likewise.
++        (spread_internal_scalar): Likewise.
++        * intrinsics/string_intrinsics_inc.c (string_trim): Likewise.
++        (string_minmax): Likewise.
++        * intrinsics/transpose_generic.c (transpose_internal): Likewise.
++        * intrinsics/unpack_generic.c (unpack_internal): Likewise.
++        * io/list_read.c (nml_touch_nodes): Don't cast xmalloc return value.
++        * io/transfer.c (st_set_nml_var): Call xmallocarray instead of
++        xmalloc.
++        * io/unit.c (get_internal_unit): Likewise.
++        (filename_from_unit): Don't cast xmalloc return value.
++        * io/write.c (nml_write_obj): Likewise, formatting.
++        * m4/bessel.m4 (bessel_jn_r'rtype_kind`): Call xmallocarray
++        instead of xmalloc.
++        (besse_yn_r'rtype_kind`): Likewise.
++        * m4/cshift1.m4 (cshift1): Likewise.
++        * m4/eoshift1.m4 (eoshift1): Likewise.
++        * m4/eoshift3.m4 (eoshift3): Likewise.
++        * m4/iforeach.m4: Likewise.
++        * m4/ifunction.m4: Likewise.
++        * m4/ifunction_logical.m4 (name`'rtype_qual`_'atype_code):
++        Likewise.
++        * m4/in_pack.m4 (internal_pack_'rtype_ccode`): Likewise.
++        * m4/matmul.m4 (matmul_'rtype_code`): Likewise.
++        * m4/matmull.m4 (matmul_'rtype_code`): Likewise.
++        * m4/pack.m4 (pack_'rtype_code`): Likewise.
++        * m4/reshape.m4 (reshape_'rtype_ccode`): Likewise.
++        * m4/shape.m4 (shape_'rtype_kind`): Likewise.
++        * m4/spread.m4 (spread_'rtype_code`): Likewise.
++        (spread_scalar_'rtype_code`): Likewise.
++        * m4/transpose.m4 (transpose_'rtype_code`): Likewise.
++        * m4/unpack.m4 (unpack0_'rtype_code`): Likewise.
++        (unpack1_'rtype_code`): Likewise.
++        * runtime/convert_char.c (convert_char1_to_char4): Likewise.
++        (convert_char4_to_char1): Simplify.
++        * runtime/environ.c (init_unformatted): Call xmallocarray instead
++        of xmalloc.
++        * runtime/in_pack_generic.c (internal_pack): Likewise.
++
++2014-05-26  Janne Blomqvist  <jb@gcc.gnu.org>
++
++      Backport from mainline
++      PR libfortran/61310
++      * intrinsics/ctime.c (strctime): Rename to gf_ctime, use snprintf
++      instead of strftime.
++      (fdate): Use gf_ctime.
++      (fdate_sub): Likewise.
++      (ctime): Likewise.
++      (ctime_sub): Likewise.
++
++2014-05-25  Janne Blomqvist  <jb@gcc.gnu.org>
++
++      Backport from trunk.
++      PR libfortran/61187
++      * io/unix.c (raw_close): Check if s->fd is -1.
++      (fd_to_stream): Check return value of fstat(), handle error.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libgfortran/generated/spread_r10.c
+===================================================================
+--- libgfortran/generated/spread_r10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_r10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_REAL_10));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_REAL_10));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_REAL_10));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_REAL_10));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/maxloc1_4_r8.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/norm2_r4.c
+===================================================================
+--- libgfortran/generated/norm2_r4.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/norm2_r4.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,10 +101,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/parity_l2.c
+===================================================================
+--- libgfortran/generated/parity_l2.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/parity_l2.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/eoshift3_4.c
+===================================================================
+--- libgfortran/generated/eoshift3_4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/eoshift3_4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -89,7 +89,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+@@ -107,8 +107,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/transpose_c8.c
+===================================================================
+--- libgfortran/generated/transpose_c8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_c8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_8) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_COMPLEX_8));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/eoshift1_8.c
+===================================================================
+--- libgfortran/generated/eoshift1_8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/eoshift1_8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -105,8 +105,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/reshape_r16.c
+===================================================================
+--- libgfortran/generated/reshape_r16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_r16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_REAL_16);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/bessel_r4.c
+===================================================================
+--- libgfortran/generated/bessel_r4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/bessel_r4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -55,7 +55,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_4) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_4));
+       ret->offset = 0;
+     }
+@@ -122,7 +122,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_4) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_4));
+       ret->offset = 0;
+     }
+@@ -162,7 +162,7 @@
+   x2rev = GFC_REAL_4_LITERAL(2.)/x;
+-  for (i = 2; i <= n1+n2; i++)
++  for (i = 2; i <= n2 - n1; i++)
+     {
+ #if defined(GFC_REAL_4_INFINITY)
+       if (unlikely (last2 == -GFC_REAL_4_INFINITY))
+Index: libgfortran/generated/any_l2.c
+===================================================================
+--- libgfortran/generated/any_l2.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/any_l2.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_2));
+     }
+   else
+     {
+Index: libgfortran/generated/product_r4.c
+===================================================================
+--- libgfortran/generated/product_r4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_r4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+     {
+Index: libgfortran/generated/iany_i1.c
+===================================================================
+--- libgfortran/generated/iany_i1.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iany_i1.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/parity_l16.c
+===================================================================
+--- libgfortran/generated/parity_l16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/parity_l16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/in_pack_r4.c
+===================================================================
+--- libgfortran/generated/in_pack_r4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_r4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_REAL_4 *)xmalloc (ssize * sizeof (GFC_REAL_4));
++  destptr = xmallocarray (ssize, sizeof (GFC_REAL_4));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/product_i2.c
+===================================================================
+--- libgfortran/generated/product_i2.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_i2.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/iparity_i4.c
+===================================================================
+--- libgfortran/generated/iparity_i4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iparity_i4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_4_i1.c
+===================================================================
+--- libgfortran/generated/minloc0_4_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/reshape_c4.c
+===================================================================
+--- libgfortran/generated/reshape_c4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_c4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_COMPLEX_4);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_4));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/maxloc0_4_r16.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/iall_i8.c
+===================================================================
+--- libgfortran/generated/iall_i8.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iall_i8.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_8_r16.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_r16.c
+===================================================================
+--- libgfortran/generated/sum_r16.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_r16.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_i1.c
+===================================================================
+--- libgfortran/generated/sum_i1.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_i1.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/in_pack_i2.c
+===================================================================
+--- libgfortran/generated/in_pack_i2.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_i2.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_INTEGER_2 *)xmalloc (ssize * sizeof (GFC_INTEGER_2));
++  destptr = xmallocarray (ssize, sizeof (GFC_INTEGER_2));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/transpose_r10.c
+===================================================================
+--- libgfortran/generated/transpose_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_10) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_REAL_10));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc1_16_r16.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_r16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_r16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_16_i4.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_i4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_i4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/spread_i1.c
+===================================================================
+--- libgfortran/generated/spread_i1.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_i1.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_INTEGER_1));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_INTEGER_1));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_INTEGER_1));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_INTEGER_1));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/maxloc0_16_i8.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_i8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_i8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxval_r16.c
+===================================================================
+--- libgfortran/generated/maxval_r16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_r16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+     {
+Index: libgfortran/generated/product_c10.c
+===================================================================
+--- libgfortran/generated/product_c10.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_c10.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_10));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_10));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_10));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_8_i4.c
+===================================================================
+--- libgfortran/generated/minloc1_8_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_16_i16.c
+===================================================================
+--- libgfortran/generated/minloc0_16_i16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_i16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/matmul_r16.c
+===================================================================
+--- libgfortran/generated/matmul_r16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_r16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_REAL_16) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_REAL_16));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minloc0_4_r4.c
+===================================================================
+--- libgfortran/generated/minloc0_4_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/iany_i2.c
+===================================================================
+--- libgfortran/generated/iany_i2.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iany_i2.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_r4.c
+===================================================================
+--- libgfortran/generated/sum_r4.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_r4.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+     {
+Index: libgfortran/generated/unpack_c8.c
+===================================================================
+--- libgfortran/generated/unpack_c8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_c8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_8));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_8));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_8));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_8));
+     }
+   else
+     {
+Index: libgfortran/generated/in_pack_c16.c
+===================================================================
+--- libgfortran/generated/in_pack_c16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_c16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_COMPLEX_16 *)xmalloc (ssize * sizeof (GFC_COMPLEX_16));
++  destptr = xmallocarray (ssize, sizeof (GFC_COMPLEX_16));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/minloc0_4_i2.c
+===================================================================
+--- libgfortran/generated/minloc0_4_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/spread_c10.c
+===================================================================
+--- libgfortran/generated/spread_c10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_c10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_COMPLEX_10));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_COMPLEX_10));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_COMPLEX_10));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_COMPLEX_10));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/maxloc0_8_i1.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/spread_r4.c
+===================================================================
+--- libgfortran/generated/spread_r4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_r4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_REAL_4));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_REAL_4));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_REAL_4));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_REAL_4));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/minloc0_8_i8.c
+===================================================================
+--- libgfortran/generated/minloc0_8_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/matmul_c8.c
+===================================================================
+--- libgfortran/generated/matmul_c8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_c8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_COMPLEX_8) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_COMPLEX_8));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minloc1_16_r10.c
+===================================================================
+--- libgfortran/generated/minloc1_16_r10.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_r10.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_i2.c
+===================================================================
+--- libgfortran/generated/sum_i2.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_i2.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/iparity_i16.c
+===================================================================
+--- libgfortran/generated/iparity_i16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iparity_i16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_16_i1.c
+===================================================================
+--- libgfortran/generated/minloc0_16_i1.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_i1.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/reshape_c16.c
+===================================================================
+--- libgfortran/generated/reshape_c16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_c16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_COMPLEX_16);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_16));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/pack_c4.c
+===================================================================
+--- libgfortran/generated/pack_c4.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_c4.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_4) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_COMPLEX_4));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/parity_l4.c
+===================================================================
+--- libgfortran/generated/parity_l4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/parity_l4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/spread_i2.c
+===================================================================
+--- libgfortran/generated/spread_i2.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_i2.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_INTEGER_2));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_INTEGER_2));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_INTEGER_2));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_INTEGER_2));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/any_l4.c
+===================================================================
+--- libgfortran/generated/any_l4.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/any_l4.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_4_i8.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_8_r4.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc1_4_i16.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_4_r10.c
+===================================================================
+--- libgfortran/generated/minloc0_4_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc0_8_i16.c
+===================================================================
+--- libgfortran/generated/minloc0_8_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc1_8_r10.c
+===================================================================
+--- libgfortran/generated/minloc1_8_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_16_r4.c
+===================================================================
+--- libgfortran/generated/minloc0_16_r4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_r4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/product_i4.c
+===================================================================
+--- libgfortran/generated/product_i4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_i4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_c16.c
+===================================================================
+--- libgfortran/generated/sum_c16.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_c16.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_16));
+     }
+   else
+     {
+Index: libgfortran/generated/transpose_c10.c
+===================================================================
+--- libgfortran/generated/transpose_c10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_c10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_10) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_COMPLEX_10));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc1_16_r8.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_r8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_r8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/transpose_r4.c
+===================================================================
+--- libgfortran/generated/transpose_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_4) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_REAL_4));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/cshift1_4.c
+===================================================================
+--- libgfortran/generated/cshift1_4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/cshift1_4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -80,7 +80,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+Index: libgfortran/generated/maxloc0_8_i2.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/count_8_l.c
+===================================================================
+--- libgfortran/generated/count_8_l.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/count_8_l.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/in_pack_i4.c
+===================================================================
+--- libgfortran/generated/in_pack_i4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_i4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_INTEGER_4 *)xmalloc (ssize * sizeof (GFC_INTEGER_4));
++  destptr = xmallocarray (ssize, sizeof (GFC_INTEGER_4));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/minloc0_16_i2.c
+===================================================================
+--- libgfortran/generated/minloc0_16_i2.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_i2.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc1_8_r8.c
+===================================================================
+--- libgfortran/generated/minloc1_8_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/matmul_c16.c
+===================================================================
+--- libgfortran/generated/matmul_c16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_c16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_COMPLEX_16) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_COMPLEX_16));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minval_i1.c
+===================================================================
+--- libgfortran/generated/minval_i1.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_i1.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/shape_i16.c
+===================================================================
+--- libgfortran/generated/shape_i16.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/shape_i16.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -49,7 +49,7 @@
+     {
+       GFC_DIMENSION_SET(ret->dim[0], 0, rank - 1, 1);
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      ret->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   stride = GFC_DESCRIPTOR_STRIDE(ret,0);
+Index: libgfortran/generated/iany_i4.c
+===================================================================
+--- libgfortran/generated/iany_i4.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iany_i4.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_16_r16.c
+===================================================================
+--- libgfortran/generated/minloc0_16_r16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_r16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/product_i16.c
+===================================================================
+--- libgfortran/generated/product_i16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_i16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/unpack_i1.c
+===================================================================
+--- libgfortran/generated/unpack_i1.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_i1.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_1));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_1));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_4_i4.c
+===================================================================
+--- libgfortran/generated/minloc0_4_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/matmul_i1.c
+===================================================================
+--- libgfortran/generated/matmul_i1.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_i1.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_INTEGER_1) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_INTEGER_1));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minval_r4.c
+===================================================================
+--- libgfortran/generated/minval_r4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_r4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+     {
+Index: libgfortran/generated/spread_i16.c
+===================================================================
+--- libgfortran/generated/spread_i16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_i16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_INTEGER_16));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_INTEGER_16));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_INTEGER_16));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_INTEGER_16));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/sum_i4.c
+===================================================================
+--- libgfortran/generated/sum_i4.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_i4.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/unpack_r10.c
+===================================================================
+--- libgfortran/generated/unpack_r10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_r10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_10));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_10));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_10));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_10));
+     }
+   else
+     {
+Index: libgfortran/generated/bessel_r16.c
+===================================================================
+--- libgfortran/generated/bessel_r16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/bessel_r16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -59,7 +59,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_16) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_16));
+       ret->offset = 0;
+     }
+@@ -126,7 +126,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_16) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_16));
+       ret->offset = 0;
+     }
+@@ -166,7 +166,7 @@
+   x2rev = GFC_REAL_16_LITERAL(2.)/x;
+-  for (i = 2; i <= n1+n2; i++)
++  for (i = 2; i <= n2 - n1; i++)
+     {
+ #if defined(GFC_REAL_16_INFINITY)
+       if (unlikely (last2 == -GFC_REAL_16_INFINITY))
+Index: libgfortran/generated/norm2_r8.c
+===================================================================
+--- libgfortran/generated/norm2_r8.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/norm2_r8.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,10 +101,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/spread_i4.c
+===================================================================
+--- libgfortran/generated/spread_i4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_i4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_INTEGER_4));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_INTEGER_4));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_INTEGER_4));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_INTEGER_4));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/eoshift3_8.c
+===================================================================
+--- libgfortran/generated/eoshift3_8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/eoshift3_8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -89,7 +89,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+@@ -107,8 +107,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minloc1_4_i1.c
+===================================================================
+--- libgfortran/generated/minloc1_4_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minval_i2.c
+===================================================================
+--- libgfortran/generated/minval_i2.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_i2.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/bessel_r8.c
+===================================================================
+--- libgfortran/generated/bessel_r8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/bessel_r8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -55,7 +55,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_8) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_8));
+       ret->offset = 0;
+     }
+@@ -122,7 +122,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_8) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_8));
+       ret->offset = 0;
+     }
+@@ -162,7 +162,7 @@
+   x2rev = GFC_REAL_8_LITERAL(2.)/x;
+-  for (i = 2; i <= n1+n2; i++)
++  for (i = 2; i <= n2 - n1; i++)
+     {
+ #if defined(GFC_REAL_8_INFINITY)
+       if (unlikely (last2 == -GFC_REAL_8_INFINITY))
+Index: libgfortran/generated/unpack_r4.c
+===================================================================
+--- libgfortran/generated/unpack_r4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_r4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_4));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_4));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_4));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_4));
+     }
+   else
+     {
+Index: libgfortran/generated/product_r8.c
+===================================================================
+--- libgfortran/generated/product_r8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_r8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+     {
+Index: libgfortran/generated/matmul_r4.c
+===================================================================
+--- libgfortran/generated/matmul_r4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_r4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_REAL_4) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_REAL_4));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/unpack_i2.c
+===================================================================
+--- libgfortran/generated/unpack_i2.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_i2.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_2));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_2));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/in_pack_r8.c
+===================================================================
+--- libgfortran/generated/in_pack_r8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_r8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_REAL_8 *)xmalloc (ssize * sizeof (GFC_REAL_8));
++  destptr = xmallocarray (ssize, sizeof (GFC_REAL_8));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/maxloc1_4_r16.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_8_r16.c
+===================================================================
+--- libgfortran/generated/minloc0_8_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/reshape_c8.c
+===================================================================
+--- libgfortran/generated/reshape_c8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_c8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_COMPLEX_8);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_8));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/iparity_i8.c
+===================================================================
+--- libgfortran/generated/iparity_i8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iparity_i8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/count_1_l.c
+===================================================================
+--- libgfortran/generated/count_1_l.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/count_1_l.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_8_i4.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/matmul_i2.c
+===================================================================
+--- libgfortran/generated/matmul_i2.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_i2.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_INTEGER_2) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_INTEGER_2));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minloc1_4_r4.c
+===================================================================
+--- libgfortran/generated/minloc1_4_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/transpose_i16.c
+===================================================================
+--- libgfortran/generated/transpose_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_INTEGER_16));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc0_16_i4.c
+===================================================================
+--- libgfortran/generated/minloc0_16_i4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_i4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/transpose_i4.c
+===================================================================
+--- libgfortran/generated/transpose_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_INTEGER_4));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc1_16_i8.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_i8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_i8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_4_i2.c
+===================================================================
+--- libgfortran/generated/minloc1_4_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/matmul_l16.c
+===================================================================
+--- libgfortran/generated/matmul_l16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_l16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -88,7 +88,7 @@
+         }
+           
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_LOGICAL_16) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_LOGICAL_16));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/maxloc1_8_i1.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_8_i8.c
+===================================================================
+--- libgfortran/generated/minloc1_8_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_4_r8.c
+===================================================================
+--- libgfortran/generated/minloc0_4_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/product_r16.c
+===================================================================
+--- libgfortran/generated/product_r16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_r16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_r8.c
+===================================================================
+--- libgfortran/generated/sum_r8.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_r8.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+     {
+Index: libgfortran/generated/norm2_r10.c
+===================================================================
+--- libgfortran/generated/norm2_r10.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/norm2_r10.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,10 +101,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/unpack_c10.c
+===================================================================
+--- libgfortran/generated/unpack_c10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_c10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_10));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_10));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_10));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_10));
+     }
+   else
+     {
+Index: libgfortran/generated/spread_r8.c
+===================================================================
+--- libgfortran/generated/spread_r8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_r8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_REAL_8));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_REAL_8));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_REAL_8));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_REAL_8));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/minloc1_16_i16.c
+===================================================================
+--- libgfortran/generated/minloc1_16_i16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_i16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_8_r4.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_16_i1.c
+===================================================================
+--- libgfortran/generated/minloc1_16_i1.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_i1.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/spread_r16.c
+===================================================================
+--- libgfortran/generated/spread_r16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_r16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_REAL_16));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_REAL_16));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_REAL_16));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_REAL_16));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/pack_c8.c
+===================================================================
+--- libgfortran/generated/pack_c8.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_c8.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_8) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_COMPLEX_8));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/minval_r10.c
+===================================================================
+--- libgfortran/generated/minval_r10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_r10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+     {
+Index: libgfortran/generated/parity_l8.c
+===================================================================
+--- libgfortran/generated/parity_l8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/parity_l8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/minval_i4.c
+===================================================================
+--- libgfortran/generated/minval_i4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_i4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_8_i2.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/any_l8.c
+===================================================================
+--- libgfortran/generated/any_l8.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/any_l8.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_16_r10.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_r10.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_r10.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc0_4_i16.c
+===================================================================
+--- libgfortran/generated/minloc0_4_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc0_8_r8.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc1_4_r10.c
+===================================================================
+--- libgfortran/generated/minloc1_4_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_8_i16.c
+===================================================================
+--- libgfortran/generated/minloc1_8_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_8_r10.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/unpack_i4.c
+===================================================================
+--- libgfortran/generated/unpack_i4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_i4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_4));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_4));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_16_r4.c
+===================================================================
+--- libgfortran/generated/minloc1_16_r4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_r4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/product_i8.c
+===================================================================
+--- libgfortran/generated/product_i8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_i8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_16_r8.c
+===================================================================
+--- libgfortran/generated/minloc0_16_r8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_r8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/count_2_l.c
+===================================================================
+--- libgfortran/generated/count_2_l.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/count_2_l.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/transpose_r8.c
+===================================================================
+--- libgfortran/generated/transpose_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_8) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_REAL_8));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/cshift1_8.c
+===================================================================
+--- libgfortran/generated/cshift1_8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/cshift1_8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -80,7 +80,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+Index: libgfortran/generated/matmul_i4.c
+===================================================================
+--- libgfortran/generated/matmul_i4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_i4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_INTEGER_4) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_INTEGER_4));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/pack_r10.c
+===================================================================
+--- libgfortran/generated/pack_r10.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_r10.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_REAL_10) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_REAL_10));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/minloc1_16_i2.c
+===================================================================
+--- libgfortran/generated/minloc1_16_i2.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_i2.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/in_pack_i8.c
+===================================================================
+--- libgfortran/generated/in_pack_i8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_i8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_INTEGER_8 *)xmalloc (ssize * sizeof (GFC_INTEGER_8));
++  destptr = xmallocarray (ssize, sizeof (GFC_INTEGER_8));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/transpose_r16.c
+===================================================================
+--- libgfortran/generated/transpose_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_16) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_REAL_16));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc1_4_i4.c
+===================================================================
+--- libgfortran/generated/minloc1_4_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxval_i1.c
+===================================================================
+--- libgfortran/generated/maxval_i1.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_i1.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/product_c16.c
+===================================================================
+--- libgfortran/generated/product_c16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_c16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_16));
+     }
+   else
+     {
+Index: libgfortran/generated/reshape_r4.c
+===================================================================
+--- libgfortran/generated/reshape_r4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_r4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_REAL_4);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/iany_i8.c
+===================================================================
+--- libgfortran/generated/iany_i8.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iany_i8.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/cshift1_16.c
+===================================================================
+--- libgfortran/generated/cshift1_16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/cshift1_16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -80,7 +80,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+Index: libgfortran/generated/maxloc0_4_i1.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc0_4_i8.c
+===================================================================
+--- libgfortran/generated/minloc0_4_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/spread_c16.c
+===================================================================
+--- libgfortran/generated/spread_c16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_c16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_COMPLEX_16));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_COMPLEX_16));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_COMPLEX_16));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_COMPLEX_16));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/maxval_r4.c
+===================================================================
+--- libgfortran/generated/maxval_r4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_r4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minval_r8.c
+===================================================================
+--- libgfortran/generated/minval_r8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_r8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_16_r16.c
+===================================================================
+--- libgfortran/generated/minloc1_16_r16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_r16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/unpack_i16.c
+===================================================================
+--- libgfortran/generated/unpack_i16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_i16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_16));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_16));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_i8.c
+===================================================================
+--- libgfortran/generated/sum_i8.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_i8.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/pack_i1.c
+===================================================================
+--- libgfortran/generated/pack_i1.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_i1.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_INTEGER_1) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_INTEGER_1));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/any_l16.c
+===================================================================
+--- libgfortran/generated/any_l16.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/any_l16.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_16));
+     }
+   else
+     {
+Index: libgfortran/generated/spread_i8.c
+===================================================================
+--- libgfortran/generated/spread_i8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_i8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_INTEGER_8));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_INTEGER_8));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_INTEGER_8));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_INTEGER_8));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/maxval_i2.c
+===================================================================
+--- libgfortran/generated/maxval_i2.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_i2.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_8_i4.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/unpack_r8.c
+===================================================================
+--- libgfortran/generated/unpack_r8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_r8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_8));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_8));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_8));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_4_r4.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/all_l1.c
+===================================================================
+--- libgfortran/generated/all_l1.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/all_l1.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_1));
+     }
+   else
+     {
+Index: libgfortran/generated/matmul_r8.c
+===================================================================
+--- libgfortran/generated/matmul_r8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_r8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_REAL_8) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_REAL_8));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minloc0_4_r16.c
+===================================================================
+--- libgfortran/generated/minloc0_4_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_4_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc0_4_i2.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc1_8_r16.c
+===================================================================
+--- libgfortran/generated/minloc1_8_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/pack_c10.c
+===================================================================
+--- libgfortran/generated/pack_c10.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_c10.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_10) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_COMPLEX_10));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/pack_r4.c
+===================================================================
+--- libgfortran/generated/pack_r4.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_r4.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_REAL_4) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_REAL_4));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/transpose_c16.c
+===================================================================
+--- libgfortran/generated/transpose_c16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_c16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_16) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_COMPLEX_16));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc0_8_i8.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc1_4_r8.c
+===================================================================
+--- libgfortran/generated/minloc1_4_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_16_i4.c
+===================================================================
+--- libgfortran/generated/minloc1_16_i4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_i4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_16_i8.c
+===================================================================
+--- libgfortran/generated/minloc0_16_i8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_i8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/pack_i2.c
+===================================================================
+--- libgfortran/generated/pack_i2.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_i2.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_INTEGER_2) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_INTEGER_2));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/transpose_i8.c
+===================================================================
+--- libgfortran/generated/transpose_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_INTEGER_8));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/eoshift1_16.c
+===================================================================
+--- libgfortran/generated/eoshift1_16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/eoshift1_16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -105,8 +105,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/all_l2.c
+===================================================================
+--- libgfortran/generated/all_l2.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/all_l2.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_2));
+     }
+   else
+     {
+Index: libgfortran/generated/product_c4.c
+===================================================================
+--- libgfortran/generated/product_c4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_c4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_4));
+     }
+   else
+     {
+Index: libgfortran/generated/iall_i1.c
+===================================================================
+--- libgfortran/generated/iall_i1.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iall_i1.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/reshape_i4.c
+===================================================================
+--- libgfortran/generated/reshape_i4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_i4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_INTEGER_4);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/in_pack_r10.c
+===================================================================
+--- libgfortran/generated/in_pack_r10.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_r10.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_REAL_10 *)xmalloc (ssize * sizeof (GFC_REAL_10));
++  destptr = xmallocarray (ssize, sizeof (GFC_REAL_10));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/in_pack_c4.c
+===================================================================
+--- libgfortran/generated/in_pack_c4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_c4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_COMPLEX_4 *)xmalloc (ssize * sizeof (GFC_COMPLEX_4));
++  destptr = xmallocarray (ssize, sizeof (GFC_COMPLEX_4));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/all_l16.c
+===================================================================
+--- libgfortran/generated/all_l16.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/all_l16.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_16_i1.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_i1.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_i1.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc1_8_r8.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minval_i16.c
+===================================================================
+--- libgfortran/generated/minval_i16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_i16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/reshape_r10.c
+===================================================================
+--- libgfortran/generated/reshape_r10.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_r10.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_REAL_10);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/unpack_r16.c
+===================================================================
+--- libgfortran/generated/unpack_r16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_r16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_16));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_16));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_REAL_16));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_REAL_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxval_i4.c
+===================================================================
+--- libgfortran/generated/maxval_i4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_i4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minval_i8.c
+===================================================================
+--- libgfortran/generated/minval_i8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_i8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_16_i16.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_i16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_i16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/shape_i4.c
+===================================================================
+--- libgfortran/generated/shape_i4.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/shape_i4.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -49,7 +49,7 @@
+     {
+       GFC_DIMENSION_SET(ret->dim[0], 0, rank - 1, 1);
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      ret->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   stride = GFC_DESCRIPTOR_STRIDE(ret,0);
+Index: libgfortran/generated/minloc1_4_i16.c
+===================================================================
+--- libgfortran/generated/minloc1_4_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_4_r10.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc0_8_i16.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/iall_i2.c
+===================================================================
+--- libgfortran/generated/iall_i2.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iall_i2.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_8_r10.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_16_r4.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_r4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_r4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc0_8_i1.c
+===================================================================
+--- libgfortran/generated/minloc0_8_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/minloc1_16_r8.c
+===================================================================
+--- libgfortran/generated/minloc1_16_r8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_r8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/unpack_i8.c
+===================================================================
+--- libgfortran/generated/unpack_i8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_i8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_8));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_INTEGER_8));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_4_i4.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/count_4_l.c
+===================================================================
+--- libgfortran/generated/count_4_l.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/count_4_l.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_r10.c
+===================================================================
+--- libgfortran/generated/sum_r10.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_r10.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_c4.c
+===================================================================
+--- libgfortran/generated/sum_c4.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_c4.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_16_r10.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_r10.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_r10.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/pack_i16.c
+===================================================================
+--- libgfortran/generated/pack_i16.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_i16.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_INTEGER_16));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/matmul_i8.c
+===================================================================
+--- libgfortran/generated/matmul_i8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_i8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_INTEGER_8) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_INTEGER_8));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/maxloc0_16_i2.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_i2.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_i2.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/spread_c4.c
+===================================================================
+--- libgfortran/generated/spread_c4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_c4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_COMPLEX_4));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_COMPLEX_4));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_COMPLEX_4));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_COMPLEX_4));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/maxval_r10.c
+===================================================================
+--- libgfortran/generated/maxval_r10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_r10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+     {
+Index: libgfortran/generated/pack_i4.c
+===================================================================
+--- libgfortran/generated/pack_i4.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_i4.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_INTEGER_4));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/maxloc1_4_i1.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/matmul_r10.c
+===================================================================
+--- libgfortran/generated/matmul_r10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_r10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_REAL_10) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_REAL_10));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minloc1_4_i8.c
+===================================================================
+--- libgfortran/generated/minloc1_4_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_8_r4.c
+===================================================================
+--- libgfortran/generated/minloc0_8_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/matmul_l4.c
+===================================================================
+--- libgfortran/generated/matmul_l4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_l4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -88,7 +88,7 @@
+         }
+           
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_LOGICAL_4) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_LOGICAL_4));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/reshape_r8.c
+===================================================================
+--- libgfortran/generated/reshape_r8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_r8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_REAL_8);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/in_pack_c10.c
+===================================================================
+--- libgfortran/generated/in_pack_c10.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_c10.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_COMPLEX_10 *)xmalloc (ssize * sizeof (GFC_COMPLEX_10));
++  destptr = xmallocarray (ssize, sizeof (GFC_COMPLEX_10));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/all_l4.c
+===================================================================
+--- libgfortran/generated/all_l4.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/all_l4.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_8_i2.c
+===================================================================
+--- libgfortran/generated/minloc0_8_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/norm2_r16.c
+===================================================================
+--- libgfortran/generated/norm2_r16.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/norm2_r16.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -105,10 +105,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/reshape_c10.c
+===================================================================
+--- libgfortran/generated/reshape_c10.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_c10.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_COMPLEX_10);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_10));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/unpack_c16.c
+===================================================================
+--- libgfortran/generated/unpack_c16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_c16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_16));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_16));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_16));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_4_r4.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxval_r8.c
+===================================================================
+--- libgfortran/generated/maxval_r8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_r8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_8));
+     }
+   else
+     {
+Index: libgfortran/generated/transpose_c4.c
+===================================================================
+--- libgfortran/generated/transpose_c4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/transpose_c4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,8 @@
+       GFC_DIMENSION_SET(ret->dim[1], 0, GFC_DESCRIPTOR_EXTENT(source,0) - 1,
+                       GFC_DESCRIPTOR_EXTENT(source, 1));
+-      ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_4) * size0 ((array_t *) ret));
++      ret->base_addr = xmallocarray (size0 ((array_t *) ret), 
++                                     sizeof (GFC_COMPLEX_4));
+       ret->offset = 0;
+     } else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/eoshift1_4.c
+===================================================================
+--- libgfortran/generated/eoshift1_4.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/eoshift1_4.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -105,8 +105,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/minval_r16.c
+===================================================================
+--- libgfortran/generated/minval_r16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minval_r16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_16));
+     }
+   else
+     {
+Index: libgfortran/generated/iany_i16.c
+===================================================================
+--- libgfortran/generated/iany_i16.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iany_i16.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_4_i2.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_8_i8.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_4_r8.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc0_16_r16.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_r16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_r16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/sum_c10.c
+===================================================================
+--- libgfortran/generated/sum_c10.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_c10.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_10));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_10));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_10));
+     }
+   else
+     {
+Index: libgfortran/generated/iall_i4.c
+===================================================================
+--- libgfortran/generated/iall_i4.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iall_i4.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_4_r16.c
+===================================================================
+--- libgfortran/generated/minloc1_4_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_4_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_8_r16.c
+===================================================================
+--- libgfortran/generated/maxloc0_8_r16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_8_r16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/pack_r8.c
+===================================================================
+--- libgfortran/generated/pack_r8.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_r8.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_REAL_8) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_REAL_8));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/matmul_c10.c
+===================================================================
+--- libgfortran/generated/matmul_c10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_c10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_COMPLEX_10) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_COMPLEX_10));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/maxloc0_16_i4.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_i4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_i4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/pack_r16.c
+===================================================================
+--- libgfortran/generated/pack_r16.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_r16.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_REAL_16) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_REAL_16));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/minloc1_16_i8.c
+===================================================================
+--- libgfortran/generated/minloc1_16_i8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_16_i8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_16_r10.c
+===================================================================
+--- libgfortran/generated/minloc0_16_r10.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_16_r10.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/unpack_c4.c
+===================================================================
+--- libgfortran/generated/unpack_c4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/unpack_c4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -99,7 +99,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_4));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_4));
+     }
+   else
+     {
+@@ -244,7 +244,7 @@
+         rs *= extent[n];
+       }
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (rs * sizeof (GFC_COMPLEX_4));
++      ret->base_addr = xmallocarray (rs, sizeof (GFC_COMPLEX_4));
+     }
+   else
+     {
+Index: libgfortran/generated/iparity_i1.c
+===================================================================
+--- libgfortran/generated/iparity_i1.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iparity_i1.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/product_c8.c
+===================================================================
+--- libgfortran/generated/product_c8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_c8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_8));
+     }
+   else
+     {
+Index: libgfortran/generated/in_pack_i16.c
+===================================================================
+--- libgfortran/generated/in_pack_i16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_i16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_INTEGER_16 *)xmalloc (ssize * sizeof (GFC_INTEGER_16));
++  destptr = xmallocarray (ssize, sizeof (GFC_INTEGER_16));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/minloc0_8_i4.c
+===================================================================
+--- libgfortran/generated/minloc0_8_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/matmul_c4.c
+===================================================================
+--- libgfortran/generated/matmul_c4.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_c4.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_COMPLEX_4) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_COMPLEX_4));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/reshape_i8.c
+===================================================================
+--- libgfortran/generated/reshape_i8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_i8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_INTEGER_8);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/in_pack_c8.c
+===================================================================
+--- libgfortran/generated/in_pack_c8.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_c8.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_COMPLEX_8 *)xmalloc (ssize * sizeof (GFC_COMPLEX_8));
++  destptr = xmallocarray (ssize, sizeof (GFC_COMPLEX_8));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/bessel_r10.c
+===================================================================
+--- libgfortran/generated/bessel_r10.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/bessel_r10.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -55,7 +55,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_10) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_10));
+       ret->offset = 0;
+     }
+@@ -122,7 +122,7 @@
+     {
+       size_t size = n2 < n1 ? 0 : n2-n1+1; 
+       GFC_DIMENSION_SET(ret->dim[0], 0, size-1, 1);
+-      ret->base_addr = xmalloc (sizeof (GFC_REAL_10) * size);
++      ret->base_addr = xmallocarray (size, sizeof (GFC_REAL_10));
+       ret->offset = 0;
+     }
+@@ -162,7 +162,7 @@
+   x2rev = GFC_REAL_10_LITERAL(2.)/x;
+-  for (i = 2; i <= n1+n2; i++)
++  for (i = 2; i <= n2 - n1; i++)
+     {
+ #if defined(GFC_REAL_10_INFINITY)
+       if (unlikely (last2 == -GFC_REAL_10_INFINITY))
+Index: libgfortran/generated/iall_i16.c
+===================================================================
+--- libgfortran/generated/iall_i16.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iall_i16.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_16_i1.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_i1.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_i1.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/reshape_i16.c
+===================================================================
+--- libgfortran/generated/reshape_i16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/reshape_i16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -111,11 +111,11 @@
+       ret->offset = 0;
+       if (unlikely (rs < 1))
+-        alloc_size = 1;
++        alloc_size = 0;
+       else
+-        alloc_size = rs * sizeof (GFC_INTEGER_16);
++        alloc_size = rs;
+-      ret->base_addr = xmalloc (alloc_size);
++      ret->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
+     }
+Index: libgfortran/generated/count_16_l.c
+===================================================================
+--- libgfortran/generated/count_16_l.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/count_16_l.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_8_i1.c
+===================================================================
+--- libgfortran/generated/minloc1_8_i1.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_i1.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_4_i4.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_i4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_i4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxval_i8.c
+===================================================================
+--- libgfortran/generated/maxval_i8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_i8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/eoshift3_16.c
+===================================================================
+--- libgfortran/generated/eoshift3_16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/eoshift3_16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -89,7 +89,7 @@
+     {
+       int i;
+-      ret->base_addr = xmalloc (size * arraysize);
++      ret->base_addr = xmallocarray (arraysize, size);
+       ret->offset = 0;
+       ret->dtype = array->dtype;
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+@@ -107,8 +107,8 @@
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+         }
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (size * arraysize);
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (arraysize, size);
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/shape_i8.c
+===================================================================
+--- libgfortran/generated/shape_i8.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/shape_i8.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -49,7 +49,7 @@
+     {
+       GFC_DIMENSION_SET(ret->dim[0], 0, rank - 1, 1);
+       ret->offset = 0;
+-      ret->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      ret->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   stride = GFC_DESCRIPTOR_STRIDE(ret,0);
+Index: libgfortran/generated/maxloc0_4_i16.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/maxloc1_4_r10.c
+===================================================================
+--- libgfortran/generated/maxloc1_4_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_4_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_4) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_8_i16.c
+===================================================================
+--- libgfortran/generated/maxloc1_8_i16.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_8_i16.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_8_r10.c
+===================================================================
+--- libgfortran/generated/minloc0_8_r10.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_r10.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/iparity_i2.c
+===================================================================
+--- libgfortran/generated/iparity_i2.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/iparity_i2.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_2) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_2));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_16_r4.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_r4.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_r4.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_16_r8.c
+===================================================================
+--- libgfortran/generated/maxloc0_16_r8.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_16_r8.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_16) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_16));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/sum_i16.c
+===================================================================
+--- libgfortran/generated/sum_i16.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_i16.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc0_4_i8.c
+===================================================================
+--- libgfortran/generated/maxloc0_4_i8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc0_4_i8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_4) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_4));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/pack_c16.c
+===================================================================
+--- libgfortran/generated/pack_c16.c   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_c16.c   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_COMPLEX_16) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_COMPLEX_16));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/maxloc1_16_i16.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_i16.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_i16.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_8_r4.c
+===================================================================
+--- libgfortran/generated/minloc1_8_r4.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_r4.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/sum_c8.c
+===================================================================
+--- libgfortran/generated/sum_c8.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/sum_c8.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_COMPLEX_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_8));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_COMPLEX_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_COMPLEX_8));
+     }
+   else
+     {
+Index: libgfortran/generated/maxloc1_16_i2.c
+===================================================================
+--- libgfortran/generated/maxloc1_16_i2.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxloc1_16_i2.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/parity_l1.c
+===================================================================
+--- libgfortran/generated/parity_l1.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/parity_l1.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+Index: libgfortran/generated/maxval_i16.c
+===================================================================
+--- libgfortran/generated/maxval_i16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/maxval_i16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -286,8 +285,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -299,7 +297,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+@@ -472,8 +470,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_16) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -482,7 +479,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_16));
+     }
+   else
+     {
+Index: libgfortran/generated/spread_c8.c
+===================================================================
+--- libgfortran/generated/spread_c8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/spread_c8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,8 @@
+       }
+       ret->offset = 0;
+-      /* xmalloc allocates a single byte for zero size.  */
+-      ret->base_addr = xmalloc (rs * sizeof(GFC_COMPLEX_8));
++      /* xmallocarray allocates a single byte for zero size.  */
++      ret->base_addr = xmallocarray (rs, sizeof(GFC_COMPLEX_8));
+       if (rs <= 0)
+         return;
+     }
+@@ -244,7 +244,7 @@
+   if (ret->base_addr == NULL)
+     {
+-      ret->base_addr = xmalloc (ncopies * sizeof (GFC_COMPLEX_8));
++      ret->base_addr = xmallocarray (ncopies, sizeof (GFC_COMPLEX_8));
+       ret->offset = 0;
+       GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
+     }
+Index: libgfortran/generated/matmul_i16.c
+===================================================================
+--- libgfortran/generated/matmul_i16.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_i16.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -124,7 +124,7 @@
+         }
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_INTEGER_16) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_INTEGER_16));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/pack_i8.c
+===================================================================
+--- libgfortran/generated/pack_i8.c    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/pack_i8.c    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -167,8 +167,8 @@
+         ret->offset = 0;
+-        /* xmalloc allocates a single byte for zero size.  */
+-        ret->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * total);
++        /* xmallocarray allocates a single byte for zero size.  */
++        ret->base_addr = xmallocarray (total, sizeof (GFC_INTEGER_8));
+         if (total == 0)
+           return;
+Index: libgfortran/generated/any_l1.c
+===================================================================
+--- libgfortran/generated/any_l1.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/any_l1.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_1));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc1_8_i2.c
+===================================================================
+--- libgfortran/generated/minloc1_8_i2.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc1_8_i2.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -98,10 +98,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -294,8 +293,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -307,7 +305,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+@@ -485,8 +483,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -495,7 +492,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+Index: libgfortran/generated/minloc0_8_r8.c
+===================================================================
+--- libgfortran/generated/minloc0_8_r8.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/minloc0_8_r8.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -58,7 +58,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -199,7 +199,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank - 1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else
+     {
+@@ -367,7 +367,7 @@
+       GFC_DIMENSION_SET(retarray->dim[0], 0, rank-1, 1);
+       retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
+       retarray->offset = 0;
+-      retarray->base_addr = xmalloc (sizeof (GFC_INTEGER_8) * rank);
++      retarray->base_addr = xmallocarray (rank, sizeof (GFC_INTEGER_8));
+     }
+   else if (unlikely (compile_options.bounds_check))
+     {
+Index: libgfortran/generated/matmul_l8.c
+===================================================================
+--- libgfortran/generated/matmul_l8.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/matmul_l8.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -88,7 +88,7 @@
+         }
+           
+       retarray->base_addr
+-      = xmalloc (sizeof (GFC_LOGICAL_8) * size0 ((array_t *) retarray));
++      = xmallocarray (size0 ((array_t *) retarray), sizeof (GFC_LOGICAL_8));
+       retarray->offset = 0;
+     }
+     else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/generated/product_r10.c
+===================================================================
+--- libgfortran/generated/product_r10.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_r10.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_REAL_10) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_REAL_10));
+     }
+   else
+     {
+Index: libgfortran/generated/product_i1.c
+===================================================================
+--- libgfortran/generated/product_i1.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/product_i1.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -97,10 +97,9 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+       if (alloc_size == 0)
+       {
+         /* Make sure we have a zero-sized array.  */
+@@ -272,8 +271,7 @@
+       }
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+@@ -285,7 +283,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+@@ -430,8 +428,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_INTEGER_1) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -440,7 +437,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_INTEGER_1));
+     }
+   else
+     {
+Index: libgfortran/generated/all_l8.c
+===================================================================
+--- libgfortran/generated/all_l8.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/all_l8.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -101,8 +101,7 @@
+       retarray->offset = 0;
+       retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank;
+-      alloc_size = sizeof (GFC_LOGICAL_8) * GFC_DESCRIPTOR_STRIDE(retarray,rank-1)
+-                 * extent[rank-1];
++      alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];
+       if (alloc_size == 0)
+       {
+@@ -111,7 +110,7 @@
+         return;
+       }
+       else
+-      retarray->base_addr = xmalloc (alloc_size);
++      retarray->base_addr = xmallocarray (alloc_size, sizeof (GFC_LOGICAL_8));
+     }
+   else
+     {
+Index: libgfortran/generated/in_pack_r16.c
+===================================================================
+--- libgfortran/generated/in_pack_r16.c        (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_r16.c        (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_REAL_16 *)xmalloc (ssize * sizeof (GFC_REAL_16));
++  destptr = xmallocarray (ssize, sizeof (GFC_REAL_16));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/generated/in_pack_i1.c
+===================================================================
+--- libgfortran/generated/in_pack_i1.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/generated/in_pack_i1.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -76,7 +76,7 @@
+     return source->base_addr;
+   /* Allocate storage for the destination.  */
+-  destptr = (GFC_INTEGER_1 *)xmalloc (ssize * sizeof (GFC_INTEGER_1));
++  destptr = xmallocarray (ssize, sizeof (GFC_INTEGER_1));
+   dest = destptr;
+   src = source->base_addr;
+   stride0 = stride[0];
+Index: libgfortran/libgfortran.h
+===================================================================
+--- libgfortran/libgfortran.h  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/libgfortran.h  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -751,6 +751,9 @@
+ extern void *xmalloc (size_t) __attribute__ ((malloc));
+ internal_proto(xmalloc);
++extern void *xmallocarray (size_t, size_t) __attribute__ ((malloc));
++internal_proto(xmallocarray);
++
+ extern void *xcalloc (size_t, size_t) __attribute__ ((malloc));
+ internal_proto(xcalloc);
+Index: libgfortran/config.h.in
+===================================================================
+--- libgfortran/config.h.in    (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/config.h.in    (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -711,6 +711,9 @@
+ /* Define to 1 if you have the `strtof' function. */
+ #undef HAVE_STRTOF
++/* Define to 1 if you have the `strtok_r' function. */
++#undef HAVE_STRTOK_R
++
+ /* Define to 1 if you have the `strtold' function. */
+ #undef HAVE_STRTOLD
+Index: libgfortran/io/list_read.c
+===================================================================
+--- libgfortran/io/list_read.c (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/io/list_read.c (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -2354,7 +2354,7 @@
+ {
+   index_type len = strlen (nl->var_name) + 1;
+   int dim;
+-  char * ext_name = (char*)xmalloc (len + 1);
++  char * ext_name = xmalloc (len + 1);
+   memcpy (ext_name, nl->var_name, len-1);
+   memcpy (ext_name + len - 1, "%", 2);
+   for (nl = nl->next; nl; nl = nl->next)
+Index: libgfortran/io/unit.c
+===================================================================
+--- libgfortran/io/unit.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/io/unit.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -455,7 +455,7 @@
+     {
+       iunit->rank = GFC_DESCRIPTOR_RANK (dtp->internal_unit_desc);
+       iunit->ls = (array_loop_spec *)
+-      xmalloc (iunit->rank * sizeof (array_loop_spec));
++      xmallocarray (iunit->rank, sizeof (array_loop_spec));
+       dtp->internal_unit_len *=
+       init_loop_spec (dtp->internal_unit_desc, iunit->ls, &start_record);
+Index: libgfortran/io/unix.c
+===================================================================
+--- libgfortran/io/unix.c      (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/io/unix.c      (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -407,7 +407,9 @@
+ {
+   int retval;
+   
+-  if (s->fd != STDOUT_FILENO
++  if (s->fd == -1)
++    retval = -1;
++  else if (s->fd != STDOUT_FILENO
+       && s->fd != STDERR_FILENO
+       && s->fd != STDIN_FILENO)
+     retval = close (s->fd);
+@@ -983,7 +985,15 @@
+   /* Get the current length of the file. */
+-  fstat (fd, &statbuf);
++  if (fstat (fd, &statbuf) == -1)
++    {
++      s->st_dev = s->st_ino = -1;
++      s->file_length = 0;
++      if (errno == EBADF)
++      s->fd = -1;
++      raw_init (s);
++      return (stream *) s;
++    }
+   s->st_dev = statbuf.st_dev;
+   s->st_ino = statbuf.st_ino;
+Index: libgfortran/io/transfer.c
+===================================================================
+--- libgfortran/io/transfer.c  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/io/transfer.c  (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -3776,9 +3776,9 @@
+   if (nml->var_rank > 0)
+     {
+       nml->dim = (descriptor_dimension*)
+-                 xmalloc (nml->var_rank * sizeof (descriptor_dimension));
++      xmallocarray (nml->var_rank, sizeof (descriptor_dimension));
+       nml->ls = (array_loop_spec*)
+-                xmalloc (nml->var_rank * sizeof (array_loop_spec));
++      xmallocarray (nml->var_rank, sizeof (array_loop_spec));
+     }
+   else
+     {
+Index: libgfortran/io/write.c
+===================================================================
+--- libgfortran/io/write.c     (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libgfortran/io/write.c     (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1863,7 +1863,7 @@
+             base_var_name_len = base ? strlen (base->var_name) : 0;
+             ext_name_len = base_name_len + base_var_name_len 
+               + strlen (obj->var_name) + obj->var_rank * NML_DIGITS + 1;
+-            ext_name = (char*)xmalloc (ext_name_len);
++            ext_name = xmalloc (ext_name_len);
+             memcpy (ext_name, base_name, base_name_len);
+             clen = strlen (obj->var_name + base_var_name_len);
+@@ -1892,7 +1892,7 @@
+             /* Now obj_name.  */
+             obj_name_len = strlen (obj->var_name) + 1;
+-            obj_name = xmalloc (obj_name_len+1);
++            obj_name = xmalloc (obj_name_len + 1);
+             memcpy (obj_name, obj->var_name, obj_name_len-1);
+             memcpy (obj_name + obj_name_len-1, "%", 2);
+Index: libada/Makefile.in
+===================================================================
+--- libada/Makefile.in (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libada/Makefile.in (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -60,7 +60,7 @@
+ PICFLAG = @PICFLAG@
+ GNATLIBFLAGS= -W -Wall -gnatpg -nostdinc
+ GNATLIBCFLAGS= -O2
+-GNATLIBCFLAGS_FOR_C = -W -Wall $(GNATLIBCFLAGS) \
++GNATLIBCFLAGS_FOR_C = -W -Wall $(GNATLIBCFLAGS) $(CFLAGS_FOR_TARGET) \
+       -fexceptions -DIN_RTS @have_getipinfo@
+ host_subdir = @host_subdir@
+Index: libada/ChangeLog
+===================================================================
+--- libada/ChangeLog   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libada/ChangeLog   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,7 @@
++2014-08-12  Joel Sherrill <joel.sherrill@oarcorp.com>
++
++      * Makefile.in: Add CFLAGS_FOR_TARGET to GNATLIBCFLAGS_FOR_C.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libffi/src/powerpc/linux64_closure.S
+===================================================================
+--- libffi/src/powerpc/linux64_closure.S       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libffi/src/powerpc/linux64_closure.S       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -381,7 +381,8 @@
+       .align 3
+ .LEFDE1:
+-# if defined __ELF__ && defined __linux__
++#endif
++
++#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
+       .section        .note.GNU-stack,"",@progbits
+-# endif
+ #endif
+Index: libffi/src/powerpc/linux64.S
+===================================================================
+--- libffi/src/powerpc/linux64.S       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libffi/src/powerpc/linux64.S       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -254,7 +254,8 @@
+       .align 3
+ .LEFDE1:
+-# if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
++#endif
++
++#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
+       .section        .note.GNU-stack,"",@progbits
+-# endif
+ #endif
+Index: libffi/ChangeLog
+===================================================================
+--- libffi/ChangeLog   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libffi/ChangeLog   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,9 @@
++2014-09-11  Jakub Jelinek  <jakub@redhat.com>
++
++      * src/powerpc/linux64.S: Emit .note.GNU-stack even when
++      POWERPC64 is not defined.
++      * src/powerpc/linux64_closure.S: Likewise.  Also test _CALL_ELF == 2.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libcpp/ChangeLog
+===================================================================
+--- libcpp/ChangeLog   (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libcpp/ChangeLog   (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -1,3 +1,14 @@
++2014-10-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      Backport from mainline r215873
++      2014-10-03  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      * lex.c (search_line_fast): Add new version to be used for Power8
++      and later targets when Altivec is enabled.  Restrict the existing
++      Altivec version to big-endian systems so that lvsr is not used on
++      little endian, where it is deprecated.  Remove LE-specific code
++      from the now-BE-only version.
++
+ 2014-05-22  Release Manager
+       * GCC 4.8.3 released.
+Index: libcpp/lex.c
+===================================================================
+--- libcpp/lex.c       (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ libcpp/lex.c       (.../branches/gcc-4_8-branch)   (revision 217117)
+@@ -515,9 +515,111 @@
+   search_line_fast = impl;
+ }
+-#elif (GCC_VERSION >= 4005) && defined(__ALTIVEC__)
++#elif defined(_ARCH_PWR8) && defined(__ALTIVEC__)
+-/* A vection of the fast scanner using AltiVec vectorized byte compares.  */
++/* A vection of the fast scanner using AltiVec vectorized byte compares
++   and VSX unaligned loads (when VSX is available).  This is otherwise
++   the same as the pre-GCC 5 version.  */
++
++static const uchar *
++search_line_fast (const uchar *s, const uchar *end ATTRIBUTE_UNUSED)
++{
++  typedef __attribute__((altivec(vector))) unsigned char vc;
++
++  const vc repl_nl = {
++    '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', 
++    '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n'
++  };
++  const vc repl_cr = {
++    '\r', '\r', '\r', '\r', '\r', '\r', '\r', '\r', 
++    '\r', '\r', '\r', '\r', '\r', '\r', '\r', '\r'
++  };
++  const vc repl_bs = {
++    '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', 
++    '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\'
++  };
++  const vc repl_qm = {
++    '?', '?', '?', '?', '?', '?', '?', '?', 
++    '?', '?', '?', '?', '?', '?', '?', '?', 
++  };
++  const vc zero = { 0 };
++
++  vc data, t;
++
++  /* Main loop processing 16 bytes at a time.  */
++  do
++    {
++      vc m_nl, m_cr, m_bs, m_qm;
++
++      data = *((const vc *)s);
++      s += 16;
++
++      m_nl = (vc) __builtin_vec_cmpeq(data, repl_nl);
++      m_cr = (vc) __builtin_vec_cmpeq(data, repl_cr);
++      m_bs = (vc) __builtin_vec_cmpeq(data, repl_bs);
++      m_qm = (vc) __builtin_vec_cmpeq(data, repl_qm);
++      t = (m_nl | m_cr) | (m_bs | m_qm);
++
++      /* T now contains 0xff in bytes for which we matched one of the relevant
++       characters.  We want to exit the loop if any byte in T is non-zero.
++       Below is the expansion of vec_any_ne(t, zero).  */
++    }
++  while (!__builtin_vec_vcmpeq_p(/*__CR6_LT_REV*/3, t, zero));
++
++  /* Restore s to to point to the 16 bytes we just processed.  */
++  s -= 16;
++
++  {
++#define N  (sizeof(vc) / sizeof(long))
++
++    union {
++      vc v;
++      /* Statically assert that N is 2 or 4.  */
++      unsigned long l[(N == 2 || N == 4) ? N : -1];
++    } u;
++    unsigned long l, i = 0;
++
++    u.v = t;
++
++    /* Find the first word of T that is non-zero.  */
++    switch (N)
++      {
++      case 4:
++      l = u.l[i++];
++      if (l != 0)
++        break;
++      s += sizeof(unsigned long);
++      l = u.l[i++];
++      if (l != 0)
++        break;
++      s += sizeof(unsigned long);
++      case 2:
++      l = u.l[i++];
++      if (l != 0)
++        break;
++      s += sizeof(unsigned long);
++      l = u.l[i];
++      }
++
++    /* L now contains 0xff in bytes for which we matched one of the
++       relevant characters.  We can find the byte index by finding
++       its bit index and dividing by 8.  */
++#ifdef __BIG_ENDIAN__
++    l = __builtin_clzl(l) >> 3;
++#else
++    l = __builtin_ctzl(l) >> 3;
++#endif
++    return s + l;
++
++#undef N
++  }
++}
++
++#elif (GCC_VERSION >= 4005) && defined(__ALTIVEC__) && defined (__BIG_ENDIAN__)
++
++/* A vection of the fast scanner using AltiVec vectorized byte compares.
++   This cannot be used for little endian because vec_lvsl/lvsr are
++   deprecated for little endian and the code won't work properly.  */
+ /* ??? Unfortunately, attribute(target("altivec")) is not yet supported,
+    so we can't compile this function without -maltivec on the command line
+    (or implied by some other switch).  */
+@@ -559,13 +661,8 @@
+      beginning with all ones and shifting in zeros according to the
+      mis-alignment.  The LVSR instruction pulls the exact shift we
+      want from the address.  */
+-#ifdef __BIG_ENDIAN__
+   mask = __builtin_vec_lvsr(0, s);
+   mask = __builtin_vec_perm(zero, ones, mask);
+-#else
+-  mask = __builtin_vec_lvsl(0, s);
+-  mask = __builtin_vec_perm(ones, zero, mask);
+-#endif
+   data &= mask;
+   /* While altivec loads mask addresses, we still need to align S so
+@@ -629,11 +726,7 @@
+     /* L now contains 0xff in bytes for which we matched one of the
+        relevant characters.  We can find the byte index by finding
+        its bit index and dividing by 8.  */
+-#ifdef __BIG_ENDIAN__
+     l = __builtin_clzl(l) >> 3;
+-#else
+-    l = __builtin_ctzl(l) >> 3;
+-#endif
+     return s + l;
+ #undef N
+Index: .
+===================================================================
+--- .  (.../tags/gcc_4_8_3_release)    (revision 217117)
++++ .  (.../branches/gcc-4_8-branch)   (revision 217117)
+
+Property changes on: .
+___________________________________________________________________
+Modified: svn:mergeinfo
+   Merged /trunk:r211733,215049