]> git.pld-linux.org Git - packages/crossmingw32-gcc.git/commitdiff
Updated to 4.6.3
authorJan Rękorajski <baggins@pld-linux.org>
Wed, 8 Aug 2012 12:32:08 +0000 (14:32 +0200)
committerJan Rękorajski <baggins@pld-linux.org>
Wed, 8 Aug 2012 12:32:08 +0000 (14:32 +0200)
Updated branch diff

crossmingw32-gcc.spec
gcc-branch.diff

index 2b26de106246f4eee040e1ff84c06619969eabe1..ac41ca016c7faf9f72ee228405d7e3e336611481 100644 (file)
@@ -12,13 +12,13 @@ Summary(pl.UTF-8):  Skrośne narzędzia programistyczne GNU dla MinGW32 - gcc
 Summary(pt_BR.UTF-8):  Utilitários para desenvolvimento de binários da GNU - MinGW32 gcc
 Summary(tr.UTF-8):     GNU geliştirme araçları - MinGW32 gcc
 Name:          crossmingw32-gcc
-Version:       4.6.2
+Version:       4.6.3
 Release:       1
 Epoch:         1
 License:       GPL v3+
 Group:         Development/Languages
 Source0:       ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{version}/gcc-%{version}.tar.bz2
-# Source0-md5: 028115c4fbfb6cfd75d6369f4a90d87e
+# Source0-md5: 773092fe5194353b02bb0110052a972e
 %define                apiver  3.17
 Source1:       http://downloads.sourceforge.net/mingw/w32api-%{apiver}-2-mingw32-dev.tar.lzma
 # Source1-md5: c3a86ffa6b8c21de868df54e4e38f05e
index e9b647d0a61652b2270be290f5fd09b6a6fc7bfa..86d37eed0e354da01d248c504962754cca65d959 100644 (file)
+Index: gcc/doc/invoke.texi
+===================================================================
+--- gcc/doc/invoke.texi        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/doc/invoke.texi        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -853,8 +853,8 @@
+ -m5-compact  -m5-compact-nofpu @gol
+ -mb  -ml  -mdalign  -mrelax @gol
+ -mbigtable -mfmovd -mhitachi -mrenesas -mno-renesas -mnomacsave @gol
+--mieee  -mbitops  -misize  -minline-ic_invalidate -mpadstruct  -mspace @gol
+--mprefergot  -musermode -multcost=@var{number} -mdiv=@var{strategy} @gol
++-mieee -mno-ieee -mbitops  -misize  -minline-ic_invalidate -mpadstruct @gol
++-mspace -mprefergot  -musermode -multcost=@var{number} -mdiv=@var{strategy} @gol
+ -mdivsi3_libfunc=@var{name} -mfixed-range=@var{register-range} @gol
+ -madjust-unroll -mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol
+ -maccumulate-outgoing-args -minvalid-symbols}
+@@ -16938,13 +16938,15 @@
+ @option{-mhitachi} is given.
+ @item -mieee
++@item -mno-ieee
+ @opindex mieee
+-Increase IEEE-compliance of floating-point code.
+-At the moment, this is equivalent to @option{-fno-finite-math-only}.
+-When generating 16 bit SH opcodes, getting IEEE-conforming results for
+-comparisons of NANs / infinities incurs extra overhead in every
+-floating point comparison, therefore the default is set to
+-@option{-ffinite-math-only}.
++@opindex mnoieee
++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
++enabled @option{-mno-ieee} is implicitly set, which results in faster
++floating-point greater-equal and less-equal comparisons.  The implcit settings
++can be overridden by specifying either @option{-mieee} or @option{-mno-ieee}.
+ @item -minline-ic_invalidate
+ @opindex minline-ic_invalidate
+Index: gcc/doc/install.texi
+===================================================================
+--- gcc/doc/install.texi       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/doc/install.texi       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1208,7 +1208,7 @@
+ @item --with-llsc
+ On MIPS targets, make @option{-mllsc} the default when no
+-@option{-mno-lsc} option is passed.  This is the default for
++@option{-mno-llsc} option is passed.  This is the default for
+ Linux-based targets, as the kernel will emulate them if the ISA does
+ not provide them.
+Index: gcc/targhooks.c
+===================================================================
+--- gcc/targhooks.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/targhooks.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -529,6 +529,7 @@
+       case scalar_to_vec:
+       case cond_branch_not_taken:
+       case vec_perm:
++      case vec_promote_demote:
+         return 1;
+       case unaligned_load:
+Index: gcc/tree-pretty-print.c
+===================================================================
+--- gcc/tree-pretty-print.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/tree-pretty-print.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -805,6 +805,8 @@
+              infer them and MEM_ATTR caching will share MEM_REFs
+              with differently-typed op0s.  */
+           && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
++          /* Released SSA_NAMES have no TREE_TYPE.  */
++          && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
+           /* Same pointer types, but ignoring POINTER_TYPE vs.
+              REFERENCE_TYPE.  */
+           && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
+@@ -1171,6 +1173,8 @@
+                    can't infer them and MEM_ATTR caching will share
+                    MEM_REFs with differently-typed op0s.  */
+                 && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
++                /* Released SSA_NAMES have no TREE_TYPE.  */
++                && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
+                 /* Same pointer types, but ignoring POINTER_TYPE vs.
+                    REFERENCE_TYPE.  */
+                 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
+Index: gcc/cgraph.c
+===================================================================
+--- gcc/cgraph.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cgraph.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1700,19 +1700,27 @@
+   free_nodes = node;
+ }
+-/* Remove the node from cgraph.  */
++/* Remove the node from cgraph and all inline clones inlined into it.
++   Skip however removal of FORBIDDEN_NODE and return true if it needs to be
++   removed.  This allows to call the function from outer loop walking clone
++   tree.  */
+-void
+-cgraph_remove_node_and_inline_clones (struct cgraph_node *node)
++bool
++cgraph_remove_node_and_inline_clones (struct cgraph_node *node, struct cgraph_node *forbidden_node)
+ {
+   struct cgraph_edge *e, *next;
++  bool found = false;
++
++  if (node == forbidden_node)
++    return true;
+   for (e = node->callees; e; e = next)
+     {
+       next = e->next_callee;
+       if (!e->inline_failed)
+-        cgraph_remove_node_and_inline_clones (e->callee);
++        found |= cgraph_remove_node_and_inline_clones (e->callee, forbidden_node);
+     }
+   cgraph_remove_node (node);
++  return found;
+ }
+ /* Notify finalize_compilation_unit that given node is reachable.  */
+Index: gcc/cgraph.h
+===================================================================
+--- gcc/cgraph.h       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cgraph.h       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -547,7 +547,7 @@
+ void cgraph_insert_node_to_hashtable (struct cgraph_node *node);
+ void cgraph_remove_edge (struct cgraph_edge *);
+ void cgraph_remove_node (struct cgraph_node *);
+-void cgraph_remove_node_and_inline_clones (struct cgraph_node *);
++bool cgraph_remove_node_and_inline_clones (struct cgraph_node *, struct cgraph_node *);
+ void cgraph_release_function_body (struct cgraph_node *);
+ void cgraph_node_remove_callees (struct cgraph_node *node);
+ struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
 Index: gcc/DATESTAMP
 ===================================================================
---- gcc/DATESTAMP      (.../tags/gcc_4_6_2_release)    (wersja 180565)
-+++ gcc/DATESTAMP      (.../branches/gcc-4_6-branch)   (wersja 180565)
+--- gcc/DATESTAMP      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/DATESTAMP      (.../branches/gcc-4_6-branch)   (revision 190226)
 @@ -1 +1 @@
--20111026
-+20111027
+-20120301
++20120808
+Index: gcc/target.h
+===================================================================
+--- gcc/target.h       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/target.h       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -128,7 +128,8 @@
+   scalar_to_vec,
+   cond_branch_not_taken,
+   cond_branch_taken,
+-  vec_perm
++  vec_perm,
++  vec_promote_demote
+ };
+ /* Sets of optimization levels at which an option may be enabled by
+Index: gcc/configure
+===================================================================
+--- gcc/configure      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/configure      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -4842,7 +4842,7 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cc_gcc_supports_ada" >&5
+ $as_echo "$acx_cv_cc_gcc_supports_ada" >&6; }
+-if test x$GNATBIND != xno && test x$GNATMAKE != xno && test x$acx_cv_cc_gcc_supports_ada != xno; then
++if test "x$GNATBIND" != xno && test "x$GNATMAKE" != xno && test x$acx_cv_cc_gcc_supports_ada != xno; then
+   have_gnat=yes
+ else
+   have_gnat=no
+Index: gcc/toplev.c
+===================================================================
+--- gcc/toplev.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/toplev.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1326,6 +1326,13 @@
+          "and -ftree-loop-linear)");
+ #endif
++  if (flag_strict_volatile_bitfields > 0 && !abi_version_at_least (2))
++    {
++      warning (0, "-fstrict-volatile-bitfields disabled; "
++             "it is incompatible with ABI versions < 2");
++      flag_strict_volatile_bitfields = 0;
++    }
++
+   /* Unrolling all loops implies that standard loop unrolling must also
+      be done.  */
+   if (flag_unroll_all_loops)
 Index: gcc/DEV-PHASE
 ===================================================================
---- gcc/DEV-PHASE      (.../tags/gcc_4_6_2_release)    (wersja 180565)
-+++ gcc/DEV-PHASE      (.../branches/gcc-4_6-branch)   (wersja 180565)
+--- gcc/DEV-PHASE      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/DEV-PHASE      (.../branches/gcc-4_6-branch)   (revision 190226)
 @@ -0,0 +1 @@
 +prerelease
+Index: gcc/cgraphunit.c
+===================================================================
+--- gcc/cgraphunit.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cgraphunit.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2157,8 +2157,19 @@
+             first_clone->ipa_transforms_to_apply);
+   first_clone->ipa_transforms_to_apply = NULL;
++  /* When doing recursive inlining, the clone may become unnecessary.
++     This is possible i.e. in the case when the recursive function is proved to be
++     non-throwing and the recursion happens only in the EH landing pad.
++     We can not remove the clone until we are done with saving the body.
++     Remove it now.  */
++  if (!first_clone->callers)
++    {
++      cgraph_remove_node_and_inline_clones (first_clone, NULL);
++      first_clone = NULL;
++    }
+ #ifdef ENABLE_CHECKING
+-  verify_cgraph_node (first_clone);
++  else
++    verify_cgraph_node (first_clone);
+ #endif
+   return first_clone;
+ }
 Index: gcc/ChangeLog
 ===================================================================
---- gcc/ChangeLog      (.../tags/gcc_4_6_2_release)    (wersja 180565)
-+++ gcc/ChangeLog      (.../branches/gcc-4_6-branch)   (wersja 180565)
-@@ -1,3 +1,8 @@
-+2011-10-26  Jakub Jelinek  <jakub@redhat.com>
+--- gcc/ChangeLog      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/ChangeLog      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,530 @@
++2012-07-22  Oleg Endo  <olegendo@gcc.gnu.org>
++
++      PR target/33135
++      * config/sh/sh.opt (mieee): Use Var instead of Mask.  Correct
++      description.
++      * config/sh/sh.c (sh_option_override): Do not change 
++      flag_finite_math_only.  Set TARGET_IEEE to complement of
++      flag_finite_math_only.
++      * doc/invoke.texi (SH options): Add mno-ieee.  Correct
++      description of mieee and mno-ieee behavior.
++
++2012-07-16  Steven Bosscher  <steven@gcc.gnu.org>
++
++      Backported from trunk:
++      2012-07-13  Richard Sandiford  <rdsandiford@googlemail.com>
++                  Steven Bosscher  <steven@gcc.gnu.org>
++                  Bernd Schmidt  <bernds@codesourcery.com>
++
++      PR rtl-optimization/53908
++      * df-problems.c (can_move_insns_across): When doing
++      memory-reference book-keeping, handle call insns.
++
++2012-07-06  Nick Clifton  <nickc@redhat.com>
++
++      * config/mn10300/mn10300.c (mn10300_encode_section_info): Call
++      default_encode_section_info.
++
++2012-07-04  Richard Guenther  <rguenther@suse.de>
++
++      PR middle-end/53433
++      * tree-ssa-ccp.c (get_base_constructor): Do not return an
++      error_mark_node DECL_INITIAL.
++
++2012-07-02  Martin Jambor  <mjambor@suse.cz>
++
++      PR middle-end/38474
++      * ipa-prop.c (compute_known_type_jump_func): Check for a BINFO before
++      checking for a dynamic type change.
++
++2012-06-28  Richard Guenther  <rguenther@suse.de>
++
++      PR middle-end/53790
++      * expr.c (expand_expr_real_1): Verify if the type is complete
++      before inspecting its size.
++
++2012-06-22  Richard Guenther  <rguenther@suse.de>
++
++      * gcov-iov.c: Include bconfig.h and system.h.
++
++2012-06-22  Richard Guenther  <rguenther@suse.de>
++
++      PR gcov-profile/53744
++      * gcov-iov.c (main): Treat "" and "prerelease" the same.
++
++2012-06-19  Joey Ye  <joey.ye@arm.com>
++
++      Backported from mainline
++      2011-10-14  David Alan Gilbert  <david.gilbert@linaro.org>
++
++      * config/arm/arm.h (TARGET_HAVE_DMB_MCR): MCR Not available in Thumb1.
++
++2012-06-18  Joey Ye  <joey.ye@arm.com>
++
++      Backported from mainline
++      2011-10-14  David Alan Gilbert  <david.gilbert@linaro.org>
++
++      PR target/48126
++      * config/arm/arm.c (arm_output_sync_loop): Move label before barrier.
++
++2012-06-17  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline:
++      2012-06-17  Uros Bizjak  <ubizjak@gmail.com>
++
++      * config/i386/sse.md (vcvtph2ps): Fix vec_select selector.
++
++2012-06-16  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      Backport from mainline:
++      2012-06-03  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      * config/pa/pa.h (MAX_PCREL17F_OFFSET): Define.
++      * config/pa/pa.c (pa_attr_length_millicode_call): Use
++      MAX_PCREL17F_OFFSET instead of fixed offset.
++      (pa_attr_length_call): Likewise.
++      (pa_attr_length_indirect_call): Likewise.
++
++2012-06-12  Christian Bruel  <christian.bruel@st.com>
++
++      PR target/53621
++      * config/sh/sh.c (sh_option_override): Don't force
++       flag_omit_frame_pointer and maccumulate_outgoing_args.
++      * config/sh/sh.opt (maccumulate-outgoing-args): Init as Var.
++
++2012-06-05  Peter Bergner  <bergner@vnet.ibm.com>
++
++      Backport from mainline
++      2011-08-29  Jakub Jelinek  <jakub@redhat.com>
++
++      * gthr-posix.h (__gthread_active_p): Do not use preprocessor
++      conditionals and comments inside macro arguments.
++
++2012-06-04  Edmar Wienskoski  <edmar@freescale.com>
++
++      PR target/53559
++      * config/rs6000/altivec.md (altivec_stvlx): Change machine mode of
++      operands.
++      (altivec_stvlxl): Ditto.
++      (altivec_stvrx): Ditto.
++      (altivec_stvrxl): Ditto.
++
++2012-06-04  Georg-Johann Lay  <avr@gjlay.de>
++
++      Backport from 2012-06-04 mainline r188172
++
++      PR target/46261
++      * config/avr/avr-stdint.h: New file.
++      * config.gcc (avr-*-*,tm_file): Use avr/avr-stdint.h instead of
++      newlib-stdint.h
++
++2012-06-03  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      PR target/52999
++      * config/pa/pa.c (TARGET_SECTION_TYPE_FLAGS): Define.
++      (pa_section_type_flags): New.
++      * config/pa/pa.h (LEGITIMATE_CONSTANT_P): Revert previous change.
++
++2012-05-31  Richard Guenther  <rguenther@suse.de>
++
++      PR middle-end/53541
++      * tree-pretty-print.c (dump_generic_node): Guard against
++      NULL_TREE TREE_TYPE when dumping MEM_REF offset type.
++
++2012-05-24  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      Backport from mainline
++      2012-05-18  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
++
++      PR target/53385
++      * config/rs6000/rs6000.c (print_operand): Revise code that unsafely
++      relied on signed overflow behavior.
++
++2012-05-22  Richard Guenther  <rguenther@suse.de>
++
++      Backport from mainline
++      2011-11-10  Richard Guenther  <rguenther@suse.de>
++
++      PR middle-end/51071
++      * gimple.c (gimple_has_side_effects): Remove checking code
++      that doesn't belong here.
++
++2012-05-22  Richard Guenther  <rguenther@suse.de>
++
++      Backport from mainline
++      2012-02-28  Richard Guenther  <rguenther@suse.de>
++
++      PR target/52407
++      * config/i386/i386.c (ix86_expand_vector_set): Fix element
++      ordering for the VEC_CONCAT for two element vectors for
++      V2SFmode, V2SImode and V2DImode.
++
++2012-05-22  Richard Guenther  <rguenther@suse.de>
++
++      Backport from mainline
++      2012-04-12  Richard Guenther  <rguenther@suse.de>
++
++      PR c/52862
++      * convert.c (convert_to_pointer): Remove special-casing of zero.
++
++2012-05-21  Joseph Myers  <joseph@codesourcery.com>
++
++      PR c/53418
++      * c-typeck.c (build_conditional_expr): Remove C_MAYBE_CONST_EXPR
++      from folded operands before wrapping another around the
++      conditional expression.
++
++2012-05-21  H.J. Lu  <hongjiu.lu@intel.com>
++
++      Backport from mainline
++      2012-05-21  H.J. Lu  <hongjiu.lu@intel.com>
++
++      PR target/53416
++      * config/i386/i386.md (UNSPEC_RDRAND): Renamed to ...
++      (UNSPECV_RDRAND): This.
++      (rdrand<mode>_1): Updated.
++
++2012-05-20  H.J. Lu  <hongjiu.lu@intel.com>
++
++      Backport from mainline
++      2012-05-20  H.J. Lu  <hongjiu.lu@intel.com>
++
++      * config/i386/driver-i386.c (host_detect_local_cpu): Support
++      RDRND, F16C and FSGSBASE.
++
++2012-05-16  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * configure: Regenerate.
++
++2012-05-14  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/46098
++      * config/i386/i386.c (ix86_expand_special_args_builtin): Always
++      generate target register for "load" class builtins.
++
++      Revert:
++      2010-10-22  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/46098
++      * config/i386/sse.md (*avx_movu<ssemodesuffix><avxmodesuffix>):
++      Rename from avx_movu<ssemodesuffix><avxmodesuffix>.
++      (avx_movu<ssemodesuffix><avxmodesuffix>): New expander.
++      (*<sse>_movu<ssemodesuffix>): Rename from <sse>_movu<ssemodesuffix>.
++      (<sse>_movu<ssemodesuffix>): New expander.
++      (*avx_movdqu<avxmodesuffix>): Rename from avx_movdqu<avxmodesuffix>.
++      (avx_movdqu<avxmodesuffix>): New expander.
++      (*sse2_movdqu): Rename from sse2_movdqu.
++      (sse2_movdqu): New expander.
++
++2012-05-13  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2012-05-12  Uros Bizjak  <ubizjak@gmail.com>
++
++      * config/alpha/alpha.c (alpha_emit_conditional_branch): Handle
++      ORDERED and UNORDERED conditions.
++
++2012-05-06  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      PR target/52999
++      * config/pa/pa.h (LEGITIMATE_CONSTANT_P): Don't put function labels
++      in constant pool.
++
++2012-05-04  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2012-05-04  Uros Bizjak  <ubizjak@gmail.com>
++
++      PR target/53228
++      * config/i386/i386.h (X86_ARCH_CMOV): Rename from X86_ARCH_CMOVE.
++      (TARGET_CMOV): Rename from TARGET_CMOVE.
++      (TARGET_CMOVE): New define.
++      * config/i386/i386.c (ix86_option_override_internal): Use TARGET_CMOV.
++      Do not set TARGET_CMOVE here.
++
++2012-05-03  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Backport from the mainline
++      2012-05-03  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      PR target/53199
++      * config/rs6000/rs6000.md (bswapdi splitters): If
++      -mavoid-indexed-addresses (or -mcpu=power6 which sets it by
++      default) is used, generate an alternate sequence that does not
++      depend on using indexed addressing.
++
++2012-04-30  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2012-04-27  Paolo Bonzini  <bonzini@gnu.org>
++
++      PR target/53138
++      * config/i386/i386.md (x86_mov<mode>cc_0_m1_neg): Add clobber.
++
++2012-04-24  Jakub Jelinek  <jakub@redhat.com>
++
++      PR middle-end/53084
++      * varasm.c (compute_reloc_for_constant): Handle ADDR_EXPR of MEM_REF.
++      (output_addressed_constants): Likewise.
++
++2012-04-20  Thomas Schwinge  <thomas@codesourcery.com>
++
++      struct siginfo vs. siginfo_t
++
++      Backport from trunk (but apply to gcc/):
++
++      2012-04-20  Thomas Schwinge  <thomas@codesourcery.com>
++
++      * config/alpha/linux-unwind.h (alpha_fallback_frame_state): Use
++      siginfo_t instead of struct siginfo.
++      * config/bfin/linux-unwind.h (bfin_fallback_frame_state): Likewise.
++      * config/i386/linux-unwind.h (x86_fallback_frame_state): Likewise.
++      * config/ia64/linux-unwind.h (ia64_fallback_frame_state)
++      (ia64_handle_unwabi): Likewise.
++      * config/mips/linux-unwind.h (mips_fallback_frame_state): Likewise.
++      * config/pa/linux-unwind.h (pa32_fallback_frame_state): Likewise.
++      * config/sh/linux-unwind.h (shmedia_fallback_frame_state)
++      (sh_fallback_frame_state): Likewise.
++      * config/xtensa/linux-unwind.h (xtensa_fallback_frame_state): Likewise.
++
++2012-04-13  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Backport from mainline
++      2012-04-12  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      PR target/52775
++      * config/rs6000/rs6000.h (TARGET_FCFID): Add TARGET_PPC_GPOPT to
++      the list of options to enable the FCFID instruction.
++
++2012-04-12  Richard Earnshaw  <rearnsha@arm.com>
++
++      PR target/49448
++      * config.gcc (arm*-*-linux*): Use an unambiguous pattern for
++      detecting big-endian triplets.
++
++2012-04-10  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      PR middle-end/52894
++      * varasm.c (process_pending_assemble_externals): Set
++      pending_assemble_externals_processed true.
++      (assemble_external): Call assemble_external_real if the pending
++      assemble externals have been processed.
++
++2012-04-09  Eric Botcazou  <ebotcazou@adacore.com>
++
++      PR target/52717
++      * config/sparc/sparc.c (sparc_file_end): Set TREE_PUBLIC explicitly on
++      the DECL generated for the special GOT helper.
++
++2012-04-06  Matt Turner  <mattst88@gmail.com>
++
++      * doc/install.texi: Correct typo "-mno-lsc" -> "-mno-llsc".
++
++2012-03-29  Uros Bizjak  <ubizjak@gmail.com>
++
++      * config/i386/sse.md (avx_h<plusminus_insn>v4df3): Fix results
++      crossing 128bit lane boundary.
++
++2012-03-29  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backported from mainline
++      2012-03-27  Uros Bizjak  <ubizjak@gmail.com>
 +
-+      * BASE-VER: Set to 4.6.3.
++      PR target/52698
++      * config/i386/i386-protos.h (ix86_legitimize_reload_address):
++      New prototype.
++      * config/i386/i386.h (LEGITIMIZE_RELOAD_ADDRESS): New define.
++      * config/i386/i386.c: Include reload.h.
++      (ix86_legitimize_reload_address): New function.
++
++2012-03-28  Joey Ye  <joey.ye@arm.com>
++
++      Backported from mainline
++      2011-12-20  Bernd Schmidt  <bernds@codesourcery.com>
++
++      PR middle-end/51200
++      * expr.c (store_field): Avoid a direct store if the mode is larger
++      than the size of the bit field.
++      * stor-layout.c (layout_decl): If flag_strict_volatile_bitfields,
++      treat non-volatile bit fields like volatile ones.
++      * toplev.c (process_options): Disallow combination of
++      -fstrict-volatile-bitfields and ABI versions less than 2.
++      * config/arm/arm.c (arm_option_override): Don't enable
++      flag_strict_volatile_bitfields if the ABI version is less than 2.
++      * config/h8300/h8300.c (h8300_option_override): Likewise.
++      * config/rx/rx.c (rx_option_override): Likewise.
++      * config/m32c/m32c.c (m32c_option_override): Likewise.
++      * config/sh/sh.c (sh_option_override): Likewise.
++
++      2011-12-22  Joey Ye  <joey.ye@arm.com>
++
++      * toplev.c (process_options): Fix typo.
++
++2012-03-28  Martin Jambor  <mjambor@suse.cz>
++
++      Backported from mainline
++      2012-03-27  Martin Jambor  <mjambor@suse.cz>
++
++      PR middle-end/52693
++      * tree-sra.c (sra_modify_assign): Do not call
++      load_assign_lhs_subreplacements when working with an unscalarizable
++      region.
++
++2012-03-28  Georg-Johann Lay  <avr@gjlay.de>
++
++      PR target/52741
++
++      Revert r181936 from 2011-12-02 for:
++      * config/avr/libgcc.S (__prologue_saves__, __epilogue_restores__)
++      * config/avr/avr.md (movhi_sp_r_irq_off, movhi_sp_r_irq_on)
++      * config/avr/avr.c (output_movhi, avr_file_start)
++
++2012-03-28  Jakub Jelinek  <jakub@redhat.com>
++
++      PR target/52736
++      * config/i386/sse.md (sse2_loadlpd splitter): Use offset 0
++      instead of 8 in adjust_address.
++
++2012-03-24  Jan Hubicka  <jh@suse.cz>
++
++      Backport from mainline
++      PR regression/52696
++      * predict.c (predict_paths_for_bb): Fix typo.
++
++2012-03-24  Jan Hubicka  <jh@suse.cz>
++
++      Backport from mainline
++      PR middle-end/51737
++      * cgraph.c (cgraph_remove_node_and_inline_clones): Add FORBIDDEN_NODE
++      parameter.
++      * cgraph.h (cgraph_remove_node_and_inline_clones): Update prototype.
++      * ipa-inline-transform.c (save_inline_function_body): Remove copied
++      clone if needed.
++      * tree-inline.c (delete_unreachable_blocks_update_callgraph): Update.
++
++2012-03-24  Steven Bosscher  <steven@gcc.gnu.org>
++
++      PR middle-end/52640
++      * varasm.c: Include pointer-set.h.
++      (pending_assemble_externals_set): New pointer set.
++      (process_pending_assemble_externals): Destroy the pointer set.
++      (assemble_external): See if decl is in pending_assemble_externals_set,
++      and add it to pending_assemble_externals if necessary.
++      (init_varasm_once): Allocate pending_assemble_externals_set.
++
++2012-03-16  Jan Hubicka  <jh@suse.cz>
++
++      Backport from mainline
++      PR middle-end/48600
++      * predict.c (predict_paths_for_bb): Prevent looping.
++      (predict_paths_leading_to_edge, predict_paths_leading_to): Update.
++
++2012-03-16  Michael Hope  <michael.hope@linaro.org>
++
++      Backport from mainline
++      2011-05-05  Michael Hope  <michael.hope@linaro.org>
++
++      PR pch/45979
++      * config/host-linux.c (TRY_EMPTY_VM_SPACE): Define for
++      __ARM_EABI__ hosts.
++
++2012-03-15  Chung-Lin Tang  <cltang@codesourcery.com>
++
++      Backport from mainline
++      2012-03-10  Chung-Lin Tang  <cltang@codesourcery.com>
++
++      PR rtl-optimization/52528
++      * combine.c (can_combine_p): Add setting of subst_low_luid
++      before call to expand_field_assignment().
++
++2012-03-12  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      Backport from mainline
++      2011-09-03  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      PR Bug middle-end/50232
++      * config/pa/pa.md (return): Define "return" insn pattern.
++      (epilogue): Use it when no epilogue is needed.
++      * config/pa/pa.c (pa_can_use_return_insn): New function.
++      * config/pa/pa-protos.h (pa_can_use_return_insn): Declare.
++
++      Backport for mainline
++      2012-01-28  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      PR target/51871
++      * config/pa/pa.c (pa_return_addr_rtx): Add support for PA2.0 export
++      stubs.
++
++2012-03-06  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Backport from mainline
++      PR target/50310
++      * config/rs6000/vector.md (vector_uneq<mode>): Add support for
++      UNEQ, LTGT, ORDERED, and UNORDERED IEEE vector comparisons.
++      (vector_ltgt<mode>): Likewise.
++      (vector_ordered<mode>): Likewise.
++      (vector_unordered<mode>): Likewise.
++      * config/rs6000/rs6000.c (rs6000_emit_vector_compare_inner): Likewise.
++
++2012-03-04  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      Backport from mainline
++      2012-03-01  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++      PR target/52408
++      * config/pa/pa.md (zvdep_imm32): Change type of variable x from int to
++      unsigned HOST_WIDE_INT.
++      (zvdep_imm64): Likewise.
++      (vdepi_ior): Change type of variable x from int to HOST_WIDE_INT.
++      (vdepi_and): Likewise.
++      Likewise for unamed 64-bit patterns.
++      * config/pa/predicates.md (lhs_lshift_cint_operand): Update comment.
++
++2012-03-03  Eric Botcazou  <ebotcazou@adacore.com>
++
++      PR target/52425
++      Backport from mainline
++      2011-05-22  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * config/sparc/sparc.c (sparc_delegitimize_address): Handle
++      UNSPEC_MOVE_PIC pattern.
++
++2012-03-02  Peter Bergner  <bergner@vnet.ibm.com>
++
++      Backport from mainline
++      2012-03-02  Peter Bergner  <bergner@vnet.ibm.com>
++
++      * config/rs6000/vsx.md (vsx_set_<mode>): Reorder operands.
++
++2012-03-02  Bill Schmidt <wschmidt@linux.vnet.ibm.com>
++          Ira Rosen <irar@il.ibm.com>
++
++      PR tree-optimization/50031
++      PR tree-optimization/50969
++      * targhooks.c (default_builtin_vectorization_cost): Handle
++      vec_promote_demote.
++      * target.h (enum vect_cost_for_stmt): Add vec_promote_demote.
++      * tree-vect-loop.c (vect_get_single_scalar_iteraion_cost): Handle
++      all types of reduction and pattern statements.
++      (vect_estimate_min_profitable_iters): Likewise.
++      * tree-vect-stmts.c (vect_model_promotion_demotion_cost): New function.
++      (vect_model_store_cost): Use vec_perm rather than vector_stmt for
++      statement cost.
++      (vect_model_load_cost): Likewise.
++      (vect_get_load_cost): Likewise; add dump logic for explicit realigns.
++      (vectorizable_type_demotion): Call vect_model_promotion_demotion_cost.
++      (vectorizable_type_promotion): Likewise.
++      * config/spu/spu.c (spu_builtin_vectorization_cost): Handle
++      vec_promote_demote.
++      * config/i386/i386.c (ix86_builtin_vectorization_cost): Likewise.
++      * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): Update
++      vec_perm for VSX and handle vec_promote_demote.
++
++2012-03-01  Jakub Jelinek  <jakub@redhat.com>
++
++      * BASE-VER: Set to 4.6.4.
 +      * DEV-PHASE: Set to prerelease.
 +
- 2011-10-26  Release Manager
+ 2012-03-01  Release Manager
  
-       * GCC 4.6.2 released.
-Index: gcc/BASE-VER
+       * GCC 4.6.3 released.
+Index: gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c
 ===================================================================
---- gcc/BASE-VER       (.../tags/gcc_4_6_2_release)    (wersja 180565)
-+++ gcc/BASE-VER       (.../branches/gcc-4_6-branch)   (wersja 180565)
-@@ -1 +1 @@
--4.6.2
-+4.6.3
+--- gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c        (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,30 @@
++/* { dg-require-effective-target arm_eabi } */
++/* { dg-do compile } */
++/* { dg-options "-O2" } */
++/* { dg-final { scan-assembler-times "ldr\[\\t \]+\[^\n\]*,\[\\t \]*\\\[\[^\n\]*\\\]" 2 } } */
++/* { dg-final { scan-assembler-times "str\[\\t \]+\[^\n\]*,\[\\t \]*\\\[\[^\n\]*\\\]" 2 } } */
++/* { dg-final { scan-assembler-not "strb" } } */
++
++struct thing {
++  unsigned a: 8;
++  unsigned b: 8;
++  unsigned c: 8;
++  unsigned d: 8;
++};
++
++struct thing2 {
++  volatile unsigned a: 8;
++  volatile unsigned b: 8;
++  volatile unsigned c: 8;
++  volatile unsigned d: 8;
++};
++
++void test1(volatile struct thing *t)
++{
++  t->a = 5;
++}
++
++void test2(struct thing2 *t)
++{
++  t->a = 5;
++}
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-7.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-7.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-7.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "stvrx" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++void sc3(vsc v, long a, void *p)    { __builtin_altivec_stvrx (v,a,p); }
++void srx01(vsf v, long a, vsf *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx02(vsf v, long a, sf *p)    { __builtin_vec_stvrx (v,a,p); }
++void srx03(vbi v, long a, vbi *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx04(vsi v, long a, vsi *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx05(vsi v, long a, si *p)    { __builtin_vec_stvrx (v,a,p); }
++void srx06(vui v, long a, vui *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx07(vui v, long a, ui *p)    { __builtin_vec_stvrx (v,a,p); }
++void srx08(vbs v, long a, vbs *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx09(vp v, long a, vp *p)     { __builtin_vec_stvrx (v,a,p); }
++void srx10(vss v, long a, vss *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx11(vss v, long a, ss *p)    { __builtin_vec_stvrx (v,a,p); }
++void srx12(vus v, long a, vus *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx13(vus v, long a, us *p)    { __builtin_vec_stvrx (v,a,p); }
++void srx14(vbc v, long a, vbc *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx15(vsc v, long a, vsc *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx16(vsc v, long a, sc *p)    { __builtin_vec_stvrx (v,a,p); }
++void srx17(vuc v, long a, vuc *p)   { __builtin_vec_stvrx (v,a,p); }
++void srx18(vuc v, long a, uc *p)    { __builtin_vec_stvrx (v,a,p); }
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-8.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-8.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-8.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "stvrxl" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++void sc4(vsc v, long a, void *p)    { __builtin_altivec_stvrxl (v,a,p); }
++void srxl01(vsf v, long a, vsf *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl02(vsf v, long a, sf *p)   { __builtin_vec_stvrxl (v,a,p); }
++void srxl03(vbi v, long a, vbi *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl04(vsi v, long a, vsi *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl05(vsi v, long a, si *p)   { __builtin_vec_stvrxl (v,a,p); }
++void srxl06(vui v, long a, vui *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl07(vui v, long a, ui *p)   { __builtin_vec_stvrxl (v,a,p); }
++void srxl08(vbs v, long a, vbs *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl09(vp v, long a, vp *p)    { __builtin_vec_stvrxl (v,a,p); }
++void srxl10(vss v, long a, vss *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl11(vss v, long a, ss *p)   { __builtin_vec_stvrxl (v,a,p); }
++void srxl12(vus v, long a, vus *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl13(vus v, long a, us *p)   { __builtin_vec_stvrxl (v,a,p); }
++void srxl14(vbc v, long a, vbc *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl15(vsc v, long a, vsc *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl16(vsc v, long a, sc *p)   { __builtin_vec_stvrxl (v,a,p); }
++void srxl17(vuc v, long a, vuc *p)  { __builtin_vec_stvrxl (v,a,p); }
++void srxl18(vuc v, long a, uc *p)   { __builtin_vec_stvrxl (v,a,p); }
+Index: gcc/testsuite/gcc.target/powerpc/pr52775.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/pr52775.c (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/pr52775.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,16 @@
++/* { dg-do compile { target { powerpc*-*-* && ilp32 } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-options "-O1 -mcpu=power4" } */
++/* { dg-final { scan-assembler-times "fcfid" 2 } } */
++
++double
++int_to_double (int *p)
++{
++  return (double)*p;
++}
++
++double
++long_long_to_double (long long *p)
++{
++  return (double)*p;
++}
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-1.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-1.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-1.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "lvlx" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++vsc  lc1(long a, void *p)           { return __builtin_altivec_lvlx (a,p); }
++vsf  llx01(long a, vsf *p)          { return __builtin_vec_lvlx (a,p); }
++vsf  llx02(long a, sf *p)           { return __builtin_vec_lvlx (a,p); }
++vbi  llx03(long a, vbi *p)          { return __builtin_vec_lvlx (a,p); }
++vsi  llx04(long a, vsi *p)          { return __builtin_vec_lvlx (a,p); }
++vsi  llx05(long a, si *p)           { return __builtin_vec_lvlx (a,p); }
++vui  llx06(long a, vui *p)          { return __builtin_vec_lvlx (a,p); }
++vui  llx07(long a, ui *p)           { return __builtin_vec_lvlx (a,p); }
++vbs  llx08(long a, vbs *p)          { return __builtin_vec_lvlx (a,p); }
++vp   llx09(long a, vp *p)           { return __builtin_vec_lvlx (a,p); }
++vss  llx10(long a, vss *p)          { return __builtin_vec_lvlx (a,p); }
++vss  llx11(long a, ss *p)           { return __builtin_vec_lvlx (a,p); }
++vus  llx12(long a, vus *p)          { return __builtin_vec_lvlx (a,p); }
++vus  llx13(long a, us *p)           { return __builtin_vec_lvlx (a,p); }
++vbc  llx14(long a, vbc *p)          { return __builtin_vec_lvlx (a,p); }
++vsc  llx15(long a, vsc *p)          { return __builtin_vec_lvlx (a,p); }
++vsc  llx16(long a, sc *p)           { return __builtin_vec_lvlx (a,p); }
++vuc  llx17(long a, vuc *p)          { return __builtin_vec_lvlx (a,p); }
++vuc  llx18(long a, uc *p)           { return __builtin_vec_lvlx (a,p); }
+Index: gcc/testsuite/gcc.target/powerpc/pr52457.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/pr52457.c (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/pr52457.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,34 @@
++/* { dg-do run { target { powerpc*-*-linux* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
++/* { dg-require-effective-target vsx_hw } */
++/* { dg-options "-O1 -mcpu=power7" } */
++
++extern void abort (void);
++
++typedef long long T;
++typedef T vl_t __attribute__((vector_size(2 * sizeof (T))));
++
++vl_t
++buggy_func (T x)
++{
++  vl_t w;
++  T *p = (T *)&w;
++  p[0] = p[1] = x;
++  return w;
++}
++
++int
++main(void)
++{
++  vl_t rval;
++  T *pl;
++
++  pl = (T *) &rval;
++  rval = buggy_func (2);
++
++  if (pl[0] != 2 || pl[1] != 2)
++    abort ();
++
++  return 0;
++}
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-2.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-2.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-2.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "lvlxl" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++vsc  lc2(long a, void *p)           { return __builtin_altivec_lvlxl (a,p); }
++vsf  llxl01(long a, vsf *p)         { return __builtin_vec_lvlxl (a,p); }
++vsf  llxl02(long a, sf *p)          { return __builtin_vec_lvlxl (a,p); }
++vbi  llxl03(long a, vbi *p)         { return __builtin_vec_lvlxl (a,p); }
++vsi  llxl04(long a, vsi *p)         { return __builtin_vec_lvlxl (a,p); }
++vsi  llxl05(long a, si *p)          { return __builtin_vec_lvlxl (a,p); }
++vui  llxl06(long a, vui *p)         { return __builtin_vec_lvlxl (a,p); }
++vui  llxl07(long a, ui *p)          { return __builtin_vec_lvlxl (a,p); }
++vbs  llxl08(long a, vbs *p)         { return __builtin_vec_lvlxl (a,p); }
++vp   llxl09(long a, vp *p)          { return __builtin_vec_lvlxl (a,p); }
++vss  llxl10(long a, vss *p)         { return __builtin_vec_lvlxl (a,p); }
++vss  llxl11(long a, ss *p)          { return __builtin_vec_lvlxl (a,p); }
++vus  llxl12(long a, vus *p)         { return __builtin_vec_lvlxl (a,p); }
++vus  llxl13(long a, us *p)          { return __builtin_vec_lvlxl (a,p); }
++vbc  llxl14(long a, vbc *p)         { return __builtin_vec_lvlxl (a,p); }
++vsc  llxl15(long a, vsc *p)         { return __builtin_vec_lvlxl (a,p); }
++vsc  llxl16(long a, sc *p)          { return __builtin_vec_lvlxl (a,p); }
++vuc  llxl17(long a, vuc *p)         { return __builtin_vec_lvlxl (a,p); }
++vuc  llxl18(long a, uc *p)          { return __builtin_vec_lvlxl (a,p); }
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-3.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-3.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-3.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "lvrx" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++vsc  lc3(long a, void *p)           { return __builtin_altivec_lvrx (a,p); }
++vsf  lrx01(long a, vsf *p)          { return __builtin_vec_lvrx (a,p); }
++vsf  lrx02(long a, sf *p)           { return __builtin_vec_lvrx (a,p); }
++vbi  lrx03(long a, vbi *p)          { return __builtin_vec_lvrx (a,p); }
++vsi  lrx04(long a, vsi *p)          { return __builtin_vec_lvrx (a,p); }
++vsi  lrx05(long a, si *p)           { return __builtin_vec_lvrx (a,p); }
++vui  lrx06(long a, vui *p)          { return __builtin_vec_lvrx (a,p); }
++vui  lrx07(long a, ui *p)           { return __builtin_vec_lvrx (a,p); }
++vbs  lrx08(long a, vbs *p)          { return __builtin_vec_lvrx (a,p); }
++vp   lrx09(long a, vp *p)           { return __builtin_vec_lvrx (a,p); }
++vss  lrx10(long a, vss *p)          { return __builtin_vec_lvrx (a,p); }
++vss  lrx11(long a, ss *p)           { return __builtin_vec_lvrx (a,p); }
++vus  lrx12(long a, vus *p)          { return __builtin_vec_lvrx (a,p); }
++vus  lrx13(long a, us *p)           { return __builtin_vec_lvrx (a,p); }
++vbc  lrx14(long a, vbc *p)          { return __builtin_vec_lvrx (a,p); }
++vsc  lrx15(long a, vsc *p)          { return __builtin_vec_lvrx (a,p); }
++vsc  lrx16(long a, sc *p)           { return __builtin_vec_lvrx (a,p); }
++vuc  lrx17(long a, vuc *p)          { return __builtin_vec_lvrx (a,p); }
++vuc  lrx18(long a, uc *p)           { return __builtin_vec_lvrx (a,p); }
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-4.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-4.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-4.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "lvrxl" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++vsc  lc4(long a, void *p)           { return __builtin_altivec_lvrxl (a,p); }
++vsf  lrxl01(long a, vsf *p)         { return __builtin_vec_lvrxl (a,p); }
++vsf  lrxl02(long a, sf *p)          { return __builtin_vec_lvrxl (a,p); }
++vbi  lrxl03(long a, vbi *p)         { return __builtin_vec_lvrxl (a,p); }
++vsi  lrxl04(long a, vsi *p)         { return __builtin_vec_lvrxl (a,p); }
++vsi  lrxl05(long a, si *p)          { return __builtin_vec_lvrxl (a,p); }
++vui  lrxl06(long a, vui *p)         { return __builtin_vec_lvrxl (a,p); }
++vui  lrxl07(long a, ui *p)          { return __builtin_vec_lvrxl (a,p); }
++vbs  lrxl08(long a, vbs *p)         { return __builtin_vec_lvrxl (a,p); }
++vp   lrxl09(long a, vp *p)          { return __builtin_vec_lvrxl (a,p); }
++vss  lrxl10(long a, vss *p)         { return __builtin_vec_lvrxl (a,p); }
++vss  lrxl11(long a, ss *p)          { return __builtin_vec_lvrxl (a,p); }
++vus  lrxl12(long a, vus *p)         { return __builtin_vec_lvrxl (a,p); }
++vus  lrxl13(long a, us *p)          { return __builtin_vec_lvrxl (a,p); }
++vbc  lrxl14(long a, vbc *p)         { return __builtin_vec_lvrxl (a,p); }
++vsc  lrxl15(long a, vsc *p)         { return __builtin_vec_lvrxl (a,p); }
++vsc  lrxl16(long a, sc *p)          { return __builtin_vec_lvrxl (a,p); }
++vuc  lrxl17(long a, vuc *p)         { return __builtin_vec_lvrxl (a,p); }
++vuc  lrxl18(long a, uc *p)          { return __builtin_vec_lvrxl (a,p); }
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-5.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-5.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-5.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "stvlx" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++void sc1(vsc v, long a, void *p)    { __builtin_altivec_stvlx (v,a,p); }
++void slx01(vsf v, long a, vsf *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx02(vsf v, long a, sf *p)    { __builtin_vec_stvlx (v,a,p); }
++void slx03(vbi v, long a, vbi *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx04(vsi v, long a, vsi *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx05(vsi v, long a, si *p)    { __builtin_vec_stvlx (v,a,p); }
++void slx06(vui v, long a, vui *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx07(vui v, long a, ui *p)    { __builtin_vec_stvlx (v,a,p); }
++void slx08(vbs v, long a, vbs *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx09(vp v, long a, vp *p)     { __builtin_vec_stvlx (v,a,p); }
++void slx10(vss v, long a, vss *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx11(vss v, long a, ss *p)    { __builtin_vec_stvlx (v,a,p); }
++void slx12(vus v, long a, vus *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx13(vus v, long a, us *p)    { __builtin_vec_stvlx (v,a,p); }
++void slx14(vbc v, long a, vbc *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx15(vsc v, long a, vsc *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx16(vsc v, long a, sc *p)    { __builtin_vec_stvlx (v,a,p); }
++void slx17(vuc v, long a, vuc *p)   { __builtin_vec_stvlx (v,a,p); }
++void slx18(vuc v, long a, uc *p)    { __builtin_vec_stvlx (v,a,p); }
+Index: gcc/testsuite/gcc.target/powerpc/pr53199.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/pr53199.c (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/pr53199.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,50 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-options "-O2 -mcpu=power6 -mavoid-indexed-addresses" } */
++/* { dg-final { scan-assembler-times "lwbrx" 6 } } */
++/* { dg-final { scan-assembler-times "stwbrx" 6 } } */
++
++/* PR 51399: bswap gets an error if -mavoid-indexed-addresses was used in
++   creating the two lwbrx instructions.  */
++
++long long
++load64_reverse_1 (long long *p)
++{
++  return __builtin_bswap64 (*p);
++}
++
++long long
++load64_reverse_2 (long long *p)
++{
++  return __builtin_bswap64 (p[1]);
++}
++
++long long
++load64_reverse_3 (long long *p, int i)
++{
++  return __builtin_bswap64 (p[i]);
++}
++
++void
++store64_reverse_1 (long long *p, long long x)
++{
++  *p = __builtin_bswap64 (x);
++}
++
++void
++store64_reverse_2 (long long *p, long long x)
++{
++  p[1] = __builtin_bswap64 (x);
++}
++
++void
++store64_reverse_3 (long long *p, long long x, int i)
++{
++  p[i] = __builtin_bswap64 (x);
++}
++
++long long
++reg_reverse (long long x)
++{
++  return __builtin_bswap64 (x);
++}
+Index: gcc/testsuite/gcc.target/powerpc/cell_builtin-6.c
+===================================================================
+--- gcc/testsuite/gcc.target/powerpc/cell_builtin-6.c  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/powerpc/cell_builtin-6.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,48 @@
++/* { dg-do compile { target { powerpc*-*-* } } } */
++/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
++/* { dg-require-effective-target powerpc_altivec_ok } */
++/* { dg-options "-O2 -maltivec -mcpu=cell" } */
++/* { dg-final { scan-assembler-times "stvlxl" 19 } } */
++
++#include <altivec.h>
++
++typedef __vector signed char vsc;
++typedef __vector signed short vss;
++typedef __vector signed int vsi;
++typedef __vector unsigned char vuc;
++typedef __vector unsigned short vus;
++typedef __vector unsigned int vui;
++typedef __vector bool char vbc;
++typedef __vector bool short vbs;
++typedef __vector bool int vbi;
++typedef __vector float vsf;
++typedef __vector pixel vp;
++typedef signed char sc;
++typedef signed short ss;
++typedef signed int si;
++typedef signed long sl;
++typedef unsigned char uc;
++typedef unsigned short us;
++typedef unsigned int ui;
++typedef unsigned long ul;
++typedef float sf;
++
++void sc2(vsc v, long a, void *p)    { __builtin_altivec_stvlxl (v,a,p); }
++void slxl01(vsf v, long a, vsf *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl02(vsf v, long a, sf *p)   { __builtin_vec_stvlxl (v,a,p); }
++void slxl03(vbi v, long a, vbi *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl04(vsi v, long a, vsi *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl05(vsi v, long a, si *p)   { __builtin_vec_stvlxl (v,a,p); }
++void slxl06(vui v, long a, vui *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl07(vui v, long a, ui *p)   { __builtin_vec_stvlxl (v,a,p); }
++void slxl08(vbs v, long a, vbs *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl09(vp v, long a, vp *p)    { __builtin_vec_stvlxl (v,a,p); }
++void slxl10(vss v, long a, vss *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl11(vss v, long a, ss *p)   { __builtin_vec_stvlxl (v,a,p); }
++void slxl12(vus v, long a, vus *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl13(vus v, long a, us *p)   { __builtin_vec_stvlxl (v,a,p); }
++void slxl14(vbc v, long a, vbc *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl15(vsc v, long a, vsc *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl16(vsc v, long a, sc *p)   { __builtin_vec_stvlxl (v,a,p); }
++void slxl17(vuc v, long a, vuc *p)  { __builtin_vec_stvlxl (v,a,p); }
++void slxl18(vuc v, long a, uc *p)   { __builtin_vec_stvlxl (v,a,p); }
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -14,6 +14,6 @@
+     c[i] = a[i] * b[i+3];
+ }
+-/* { dg-final { scan-assembler-not "\\*avx_movups256/1" } } */
+-/* { dg-final { scan-assembler "\\*avx_movups/1" } } */
++/* { dg-final { scan-assembler-not "avx_movups256/1" } } */
++/* { dg-final { scan-assembler "avx_movups/1" } } */
+ /* { dg-final { scan-assembler "vinsertf128" } } */
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -14,6 +14,6 @@
+     c[i] = a[i] * b[i+3];
+ }
+-/* { dg-final { scan-assembler-not "\\*avx_movupd256/1" } } */
+-/* { dg-final { scan-assembler "\\*avx_movupd/1" } } */
++/* { dg-final { scan-assembler-not "avx_movupd256/1" } } */
++/* { dg-final { scan-assembler "avx_movupd/1" } } */
+ /* { dg-final { scan-assembler "vinsertf128" } } */
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -17,6 +17,6 @@
+     d[i] = c[i] * 20.0;
+ }
+-/* { dg-final { scan-assembler-not "\\*avx_movups256/2" } } */
++/* { dg-final { scan-assembler-not "avx_movups256/2" } } */
+ /* { dg-final { scan-assembler "movups.*\\*avx_movv4sf_internal/3" } } */
+ /* { dg-final { scan-assembler "vextractf128" } } */
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -17,6 +17,6 @@
+     d[i] = c[i] * 20.0;
+ }
+-/* { dg-final { scan-assembler-not "\\*avx_movupd256/2" } } */
++/* { dg-final { scan-assembler-not "avx_movupd256/2" } } */
+ /* { dg-final { scan-assembler "movupd.*\\*avx_movv2df_internal/3" } } */
+ /* { dg-final { scan-assembler "vextractf128" } } */
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -24,6 +24,6 @@
+     }
+ }
+-/* { dg-final { scan-assembler-not "\\*avx_movdqu256/1" } } */
+-/* { dg-final { scan-assembler "\\*avx_movdqu/1" } } */
++/* { dg-final { scan-assembler-not "avx_movdqu256/1" } } */
++/* { dg-final { scan-assembler "avx_movdqu/1" } } */
+ /* { dg-final { scan-assembler "vinsertf128" } } */
+Index: gcc/testsuite/gcc.target/i386/pr53416.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr53416.c    (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr53416.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,17 @@
++/* PR target/53416 */
++/* { dg-options "-O2 -mrdrnd" } */
++
++int test (void)
++{
++  unsigned int number = 0;
++  int result0, result1, result2, result3;
++
++  result0 = __builtin_ia32_rdrand32_step (&number);
++  result1 = __builtin_ia32_rdrand32_step (&number);
++  result2 = __builtin_ia32_rdrand32_step (&number);
++  result3 = __builtin_ia32_rdrand32_step (&number);
++
++  return result0 + result1 +result2 + result3;
++}
++
++/* { dg-final { scan-assembler-times "rdrand" 4 } } */
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-load-4.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -14,6 +14,6 @@
+     b[i] = a[i+3] * 2;
+ }
+-/* { dg-final { scan-assembler "\\*avx_movups256/1" } } */
+-/* { dg-final { scan-assembler-not "\\*avx_movups/1" } } */
++/* { dg-final { scan-assembler "avx_movups256/1" } } */
++/* { dg-final { scan-assembler-not "avx_movups/1" } } */
+ /* { dg-final { scan-assembler-not "vinsertf128" } } */
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -24,6 +24,6 @@
+     }
+ }
+-/* { dg-final { scan-assembler-not "\\*avx_movdqu256/2" } } */
++/* { dg-final { scan-assembler-not "avx_movdqu256/2" } } */
+ /* { dg-final { scan-assembler "movdqu.*\\*avx_movv16qi_internal/3" } } */
+ /* { dg-final { scan-assembler "vextractf128" } } */
+Index: gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.target/i386/avx256-unaligned-store-4.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -14,7 +14,7 @@
+     b[i+3] = a[i] * c[i];
+ }
+-/* { dg-final { scan-assembler "\\*avx_movups256/2" } } */
+-/* { dg-final { scan-assembler-not "\\*avx_movups/2" } } */
++/* { dg-final { scan-assembler "avx_movups256/2" } } */
++/* { dg-final { scan-assembler-not "avx_movups/2" } } */
+ /* { dg-final { scan-assembler-not "\\*avx_movv4sf_internal/3" } } */
+ /* { dg-final { scan-assembler-not "vextractf128" } } */
+Index: gcc/testsuite/gcc.target/i386/pr52736.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr52736.c    (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr52736.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,29 @@
++/* PR target/52736 */
++/* { dg-do run } */
++/* { dg-options "-O1 -msse2" } */
++/* { dg-require-effective-target sse2_runtime } */
++
++#include <x86intrin.h>
++
++typedef double D __attribute__((may_alias));
++__attribute__((aligned(16))) static const double r[4] = { 1., 5., 1., 3. };
++
++__attribute__((noinline, noclone))
++void
++foo (int x)
++{
++  asm volatile ("" : "+g" (x) : : "memory");
++  if (x != 3)
++    __builtin_abort ();
++}
++
++int
++main ()
++{
++  __m128d t = _mm_set1_pd (5.);
++  ((D *)(&t))[0] = 1.;
++  foo (_mm_movemask_pd (_mm_cmpeq_pd (t, _mm_load_pd (&r[0]))));
++  ((D *)(&t))[1] = 3.;
++  foo (_mm_movemask_pd (_mm_cmpeq_pd (t, _mm_load_pd (&r[2]))));
++  return 0;
++}
+Index: gcc/testsuite/gfortran.dg/init_flag_10.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/init_flag_10.f90 (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/init_flag_10.f90 (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,43 @@
++! { dg-do run }
++! { dg-options "-finit-real=NAN" }
++! { dg-add-options ieee }
++! { dg-skip-if "NaN not supported" { spu-*-* } { "*" } { "" } }
++!
++! PR fortran/50619
++!
++! Contributed by Fred Krogh
++!
++! The NaN initialization used to set the associate name to NaN!
++!
++
++module testa2
++type, public ::  test_ty
++  real :: rmult = 1.0e0
++end type test_ty
++
++contains
++  subroutine test(e, var1)
++    type(test_ty) :: e
++    real :: var1, var2 ! Should get NaN initialized
++
++    ! Should be the default value
++    if (e%rmult /= 1.0) call abort ()
++
++    ! Check that NaN initialization is really turned on
++    if (var1 == var1) call abort () 
++    if (var2 == var2) call abort () 
++
++    ! The following was failing:
++    associate (rmult=>e%rmult)
++      if (e%rmult /= 1.0) call abort ()
++    end associate
++  end subroutine test
++end module testa2
++
++program testa1
++  use testa2
++  type(test_ty) :: e
++  real :: var1 ! Should get NaN initialized
++  call test(e, var1)
++  stop
++end program testa1
+Index: gcc/testsuite/gfortran.dg/intrinsic_8.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/intrinsic_8.f90  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/intrinsic_8.f90  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,23 @@
++! { dg-do compile }
++!
++! PR fortran/52452
++!
++! Contributed by Roger Ferrer Ibanez
++!
++PROGRAM test_etime
++    IMPLICIT NONE
++    INTRINSIC :: etime
++    REAL(4) :: tarray(1:2)
++    REAL(4) :: result
++
++    CALL etime(tarray, result)
++END PROGRAM test_etime
++
++subroutine test_etime2
++    IMPLICIT NONE
++    INTRINSIC :: etime
++    REAL(4) :: tarray(1:2)
++    REAL(4) :: result
++
++    result = etime(tarray)
++END subroutine test_etime2
+Index: gcc/testsuite/gfortran.dg/optional_absent_2.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/optional_absent_2.f90    (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/optional_absent_2.f90    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,53 @@
++! { dg-do run }
++!
++! PR fortran/51758
++!
++! Contributed by Mikael Morin
++!
++! Check whether passing NULL() to an elemental procedure works,
++! where NULL() denotes an absent optional argument.
++!
++program p
++
++  integer :: a(2)
++  integer :: b
++
++  a = 0
++  a = foo((/ 1, 1 /), null())
++!  print *, a
++  if (any(a /= 2)) call abort
++
++  a = 0
++  a = bar((/ 1, 1 /), null())
++!  print *, a
++  if (any(a /= 2)) call abort
++
++  b = 0
++  b = bar(1, null())
++!  print *, b
++  if (b /= 2) call abort
++
++contains
++
++  function foo(a, b)
++    integer           :: a(:)
++    integer, optional :: b(:)
++    integer           :: foo(size(a))
++
++    if (present(b)) call abort
++
++    foo = 2
++  end function foo
++
++  elemental function bar(a, b)
++    integer, intent(in)           :: a
++    integer, intent(in), optional :: b
++    integer                       :: bar
++
++    bar = 2
++
++    if (present(b)) bar = 1
++
++  end function bar
++
++end program p
+Index: gcc/testsuite/gfortran.dg/save_4.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/save_4.f90       (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/save_4.f90       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,13 @@
++! { dg-do compile }
++! { dg-options "-std=f2003" }
++!
++! PR fortran/53597
++!
++MODULE somemodule
++  IMPLICIT NONE
++  TYPE sometype
++    INTEGER :: i
++    DOUBLE PRECISION, POINTER, DIMENSION(:,:) :: coef => NULL()
++  END TYPE sometype
++  TYPE(sometype) :: somevariable ! { dg-error "Fortran 2008: Implied SAVE for module variable 'somevariable' at .1., needed due to the default initialization" }
++END MODULE somemodule
+Index: gcc/testsuite/gfortran.dg/proc_ptr_34.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/proc_ptr_34.f90  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/proc_ptr_34.f90  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,79 @@
++! { dg-do compile }
++!
++! PR fortran/52469
++!
++! This was failing as the DECL of the proc pointer "func"
++! was used for the interface of the proc-pointer component "my_f_ptr"
++! rather than the decl of the proc-pointer target
++!
++! Contributed by palott@gmail.com
++!
++
++module ExampleFuncs
++  implicit none
++
++  ! NOTE: "func" is a procedure pointer!
++  pointer :: func
++  interface
++     function func (z)
++        real :: func
++        real, intent (in) :: z
++     end function func
++  end interface
++
++  type Contains_f_ptr
++     procedure (func), pointer, nopass :: my_f_ptr
++  end type Contains_f_ptr
++contains
++
++function f1 (x)
++  real :: f1
++  real, intent (in) :: x
++
++  f1 = 2.0 * x
++
++  return
++end function f1
++
++function f2 (x)
++   real :: f2
++   real, intent (in) :: x
++
++   f2 = 3.0 * x**2
++
++   return
++end function f2
++
++function fancy (func, x)
++   real :: fancy
++   real, intent (in) :: x
++
++   interface AFunc
++      function func (y)
++         real :: func
++         real, intent (in) ::y
++      end function func
++   end interface AFunc
++
++   fancy = func (x) + 3.3 * x
++end function fancy
++
++end module  ExampleFuncs
++
++
++program test_proc_ptr
++  use ExampleFuncs
++  implicit none
++
++  type (Contains_f_ptr), dimension (2) :: NewType
++ 
++  !NewType(1) % my_f_ptr => f1
++  NewType(2) % my_f_ptr => f2
++
++  !write (*, *) NewType(1) % my_f_ptr (3.0), NewType(2) % my_f_ptr (3.0)
++  write (6, *)  NewType(2) % my_f_ptr (3.0) ! < Shall print '27.0'
++
++  stop
++end program test_proc_ptr
++
++! { dg-final { cleanup-modules "examplefuncs" } }
+Index: gcc/testsuite/gfortran.dg/pointer_intent_6.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/pointer_intent_6.f90     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/pointer_intent_6.f90     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,19 @@
++! { dg-do compile }
++!
++! PR fortran/52864
++!
++! Assigning to an intent(in) pointer (which is valid).
++!
++      program test
++         type PoisFFT_Solver3D
++           complex, dimension(:,:,:), &
++                           pointer :: work => null()
++         end type PoisFFT_Solver3D
++      contains
++        subroutine PoisFFT_Solver3D_FullPeriodic(D, p)
++          type(PoisFFT_Solver3D), intent(in) :: D
++          real, intent(in), pointer :: p(:)
++          D%work(i,j,k) = 0.0
++          p = 0.0
++        end subroutine
++      end
+Index: gcc/testsuite/gfortran.dg/realloc_on_assign_15.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/realloc_on_assign_15.f90 (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gfortran.dg/realloc_on_assign_15.f90 (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,40 @@
++! { dg-do run }
++!
++! PR fortran/53389
++!
++! The program was leaking memory before due to
++! realloc on assignment and nested functions.
++!
++module foo
++  implicit none
++  contains
++
++  function filler(array, val)
++    real, dimension(:), intent(in):: array
++    real, dimension(size(array)):: filler
++    real, intent(in):: val
++
++    filler=val
++
++  end function filler
++end module
++
++program test
++  use foo
++  implicit none
++
++  real, dimension(:), allocatable:: x, y
++  integer, parameter:: N=1000 !*1000
++  integer:: i
++
++!  allocate( x(N) )
++  allocate( y(N) )
++  y=0.0
++
++  do i=1, N
++!    print *,i
++    x=filler(filler(y, real(2*i)), real(i))
++    y=y+x
++  end do
++
++end program test
+Index: gcc/testsuite/gcc.c-torture/execute/pr53084.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/pr53084.c      (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/pr53084.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,18 @@
++/* PR middle-end/53084 */
++
++extern void abort (void);
++
++__attribute__((noinline, noclone)) void
++bar (const char *p)
++{
++  if (p[0] != 'o' || p[1] != 'o' || p[2])
++    abort ();
++}
++
++int
++main ()
++{
++  static const char *const foo[] = {"foo" + 1};
++  bar (foo[0]);
++  return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/20120427-1.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/20120427-1.c   (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/20120427-1.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,36 @@
++typedef struct sreal
++{
++  unsigned sig;               /* Significant.  */
++  int exp;            /* Exponent.  */
++} sreal;
++
++sreal_compare (sreal *a, sreal *b)
++{
++  if (a->exp > b->exp)
++    return 1;
++  if (a->exp < b->exp)
++    return -1;
++  if (a->sig > b->sig)
++    return 1;
++  return -(a->sig < b->sig);
++}
++
++sreal a[] = {
++   { 0, 0 },
++   { 1, 0 },
++   { 0, 1 },
++   { 1, 1 }
++};
++
++int main()
++{
++  int i, j;
++  for (i = 0; i <= 3; i++) {
++    for (j = 0; j < 3; j++) {
++      if (i < j && sreal_compare(&a[i], &a[j]) != -1) abort();
++      if (i == j && sreal_compare(&a[i], &a[j]) != 0) abort();
++      if (i > j && sreal_compare(&a[i], &a[j]) != 1) abort();
++    }
++  }
++  return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/compile/pr53418-1.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/compile/pr53418-1.c    (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/compile/pr53418-1.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,5 @@
++void
++f (void)
++{
++  int i = (0 ? 1 : 0U / 0);
++}
+Index: gcc/testsuite/gcc.c-torture/compile/limits-externdecl.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/compile/limits-externdecl.c    (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/compile/limits-externdecl.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,56 @@
++/* Inspired by the test case for PR middle-end/52640.  */
++
++typedef struct
++{
++    char *value;
++} REFERENCE;
++
++/* Add a few "extern int Xxxxxx ();" declarations.  */
++#undef DEF
++#undef LIM1
++#undef LIM2
++#undef LIM3
++#undef LIM4
++#undef LIM5
++#undef LIM6
++#define DEF(x)        extern int x ()
++#define LIM1(x) DEF(x##0); DEF(x##1); DEF(x##2); DEF(x##3); DEF(x##4); \
++              DEF(x##5); DEF(x##6); DEF(x##7); DEF(x##8); DEF(x##9);
++#define LIM2(x) LIM1(x##0) LIM1(x##1) LIM1(x##2) LIM1(x##3) LIM1(x##4) \
++              LIM1(x##5) LIM1(x##6) LIM1(x##7) LIM1(x##8) LIM1(x##9)
++#define LIM3(x) LIM2(x##0) LIM2(x##1) LIM2(x##2) LIM2(x##3) LIM2(x##4) \
++              LIM2(x##5) LIM2(x##6) LIM2(x##7) LIM2(x##8) LIM2(x##9)
++#define LIM4(x) LIM3(x##0) LIM3(x##1) LIM3(x##2) LIM3(x##3) LIM3(x##4) \
++              LIM3(x##5) LIM3(x##6) LIM3(x##7) LIM3(x##8) LIM3(x##9)
++#define LIM5(x) LIM4(x##0) LIM4(x##1) LIM4(x##2) LIM4(x##3) LIM4(x##4) \
++              LIM4(x##5) LIM4(x##6) LIM4(x##7) LIM4(x##8) LIM4(x##9)
++#define LIM6(x) LIM5(x##0) LIM5(x##1) LIM5(x##2) LIM5(x##3) LIM5(x##4) \
++              LIM5(x##5) LIM5(x##6) LIM5(x##7) LIM5(x##8) LIM5(x##9)
++LIM5 (X);
++
++/* Add references to them, or GCC will simply ignore the extern decls.  */
++#undef DEF
++#undef LIM1
++#undef LIM2
++#undef LIM3
++#undef LIM4
++#undef LIM5
++#undef LIM6
++#define DEF(x)        (char *) x
++#define LIM1(x) DEF(x##0), DEF(x##1), DEF(x##2), DEF(x##3), DEF(x##4), \
++              DEF(x##5), DEF(x##6), DEF(x##7), DEF(x##8), DEF(x##9),
++#define LIM2(x) LIM1(x##0) LIM1(x##1) LIM1(x##2) LIM1(x##3) LIM1(x##4) \
++              LIM1(x##5) LIM1(x##6) LIM1(x##7) LIM1(x##8) LIM1(x##9)
++#define LIM3(x) LIM2(x##0) LIM2(x##1) LIM2(x##2) LIM2(x##3) LIM2(x##4) \
++              LIM2(x##5) LIM2(x##6) LIM2(x##7) LIM2(x##8) LIM2(x##9)
++#define LIM4(x) LIM3(x##0) LIM3(x##1) LIM3(x##2) LIM3(x##3) LIM3(x##4) \
++              LIM3(x##5) LIM3(x##6) LIM3(x##7) LIM3(x##8) LIM3(x##9)
++#define LIM5(x) LIM4(x##0) LIM4(x##1) LIM4(x##2) LIM4(x##3) LIM4(x##4) \
++              LIM4(x##5) LIM4(x##6) LIM4(x##7) LIM4(x##8) LIM4(x##9)
++#define LIM6(x) LIM5(x##0) LIM5(x##1) LIM5(x##2) LIM5(x##3) LIM5(x##4) \
++              LIM5(x##5) LIM5(x##6) LIM5(x##7) LIM5(x##8) LIM5(x##9)
++REFERENCE references[] = {
++  LIM5 (X)
++  0
++};
++
+Index: gcc/testsuite/gcc.c-torture/compile/pr53418-2.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/compile/pr53418-2.c    (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.c-torture/compile/pr53418-2.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,5 @@
++void
++f (void)
++{
++  int i = (1 ? 0U / 0 : 1);
++}
+Index: gcc/testsuite/gcc.dg/pr52862.c
+===================================================================
+--- gcc/testsuite/gcc.dg/pr52862.c     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/pr52862.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,9 @@
++/* { dg-do compile } */
++/* { dg-options "-O" } */
++
++void ASMAtomicWritePtrVoid(const void *pv);
++void rtThreadDestroy(void)
++{
++  void * const pvTypeChecked = ((void *)0);
++  ASMAtomicWritePtrVoid((void *)(pvTypeChecked));
++}
+Index: gcc/testsuite/gcc.dg/stack-usage-1.c
+===================================================================
+--- gcc/testsuite/gcc.dg/stack-usage-1.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.dg/stack-usage-1.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -41,6 +41,8 @@
+ #  define SIZE 160 /* 256 -  96 bytes for register save area */
+ #elif defined (__SPU__)
+ #  define SIZE 224
++#elif defined (__sh__)
++#  define SIZE 252
+ #else
+ #  define SIZE 256
+ #endif
+Index: gcc/testsuite/gcc.dg/torture/pr53908.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr53908.c     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr53908.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,288 @@
++/* { dg-do run } */
++/* SEGV at comment below.  */
++typedef unsigned int size_t;
++typedef enum har {
++  he_fatal = (-199),
++  he_not_initialized,
++  he_bad_input,
++  he_memory_too_small,
++  he_bad_action,
++  he_duplicate,
++  he_bad_nonce,
++  he_stale_nonce,
++  he_bad_credentials,
++  he_bad_user,
++  he_no_such_user,
++  he_bad_passwd,
++  he_unknown_auth_scheme,
++  he_not_found,
++  he_failed_digest_file_check,
++  he_failed_digest_file_save,
++  he_process_not_privileged,
++  he_other,
++  he_end_of_range,
++  ha_no_error = 0,
++  ha_no_value = 1
++} har;
++typedef enum realm_type
++{
++  axis_realm = 0,
++  ws_realm
++} realm_type;
++
++__attribute__((__noclone__, __noinline__))
++har has_www_auth(char *, size_t, realm_type, har);
++
++__attribute__((__noclone__, __noinline__))
++har has_auth_user(const char *, const char *, realm_type, char *, size_t);
++
++__attribute__((__noclone__, __noinline__))
++char *ha_get_string_value(void);
++
++typedef struct
++{
++  unsigned int track_id;
++  char* user;
++  char* realm;
++  char* authent;
++  int internal_realm;
++} request;
++enum user_response {
++  file_not_found_user_response = -3,
++  access_denied_user_response = -2,
++  no_user_response = -1,
++  ok_user_response = 0
++};
++struct realm_group {
++  char *name;
++  int id;
++  struct realm_group *next;
++};
++struct realm {
++  char *name;
++  char *space;
++  struct realm_group *groups;
++  struct realm *next;
++};
++struct user_info {
++  char *name;
++  int no_groups;
++  int groups[128];
++  struct user_info *next;
++};
++static struct user_info *find_user(const char *user_name);
++static int is_member_of_groups(const struct user_info *user_item,
++                                const struct realm_group *groups);
++int authent_author(request *req);
++struct realm *realms = ((void *)0);
++struct user_info *users = ((void *)0);
++static struct user_info*
++find_user(const char *user_name)
++{
++  struct user_info *user_item;
++  user_item = users;
++  while (user_item != ((void *)0)) {
++    /* SEGV due to NULL access here on user_name.  See also comment below.  */
++    if ((__builtin_strcmp(user_item->name, user_name) == 0))
++      break;
++    user_item = user_item->next;
++  }
++  return user_item;
++}
++static int
++is_member_of_groups(const struct user_info *user_item,
++                    const struct realm_group *groups)
++{
++  const struct realm_group *group_item;
++  int i;
++  group_item = groups;
++  while (group_item != ((void *)0)) {
++    for (i = 0; i < user_item->no_groups; i++)
++      if (user_item->groups[i] == group_item->id)
++      return 0;
++    group_item = group_item->next;
++  }
++  return -1;
++}
++char *foo (void) __attribute__((__noclone__, __noinline__));
++char* g_strdup (const char *str) __attribute__((__malloc__, __noclone__, __noinline__));
++int g_strcmp0 (const char *str1, const char *str2);
++static int
++is_basic(char **user)
++{
++  char *passwd_ptr;
++  char *authent = foo();
++  passwd_ptr = __builtin_strchr(authent, ':');
++  if (passwd_ptr != ((void *)0)) {
++    *user = g_strdup(authent);
++    return 0;
++  }
++  return -1;
++}
++static int
++is_digest(char **user)
++{
++  int ret_val = -1;
++  char *authent;
++  authent = ha_get_string_value();
++  if (authent) {
++    *user = g_strdup(authent);
++    ret_val = 0;
++  }
++  return ret_val;
++}
++__attribute__((__noclone__, __noinline__))
++void g_free (void * mem);
++static enum user_response
++get_user_info_from_header(const realm_type type,
++                          char **user_name,
++                          struct user_info **user_item)
++{
++  int ret_val = no_user_response;
++  if ((type == ws_realm)) {
++    if (is_basic(user_name) == 0)
++      ret_val = access_denied_user_response;
++    if (is_digest(user_name) == 0)
++      ret_val = ok_user_response;
++  } else {
++    if (is_basic(user_name) < 0 &&
++      /* Load of *user_name here, but not after the is_digest call.  */
++      is_digest(user_name) < 0)
++      ;
++    else if ((*user_item = find_user(*user_name)) != ((void *)0))
++      ret_val = ok_user_response;
++    else
++      ret_val = access_denied_user_response;
++    if (ret_val != ok_user_response)
++      g_free(*user_name);
++  }
++  return ret_val;
++}
++static enum user_response
++authenticate_user(request *req,
++                  char **user_name,
++                  struct user_info **user_item)
++{
++  char *authent = ((void *)0);
++  har resp = ha_no_value;
++  enum user_response user_resp;
++  int ret_val = no_user_response;
++  if (req->authent && __builtin_strlen(req->authent)) {
++    authent = req->authent;
++    user_resp = get_user_info_from_header(req->internal_realm,
++                                          user_name,
++                                          user_item);
++    if (user_resp == ok_user_response) {
++      resp = has_auth_user(authent, 0, req->internal_realm, "", 1);
++      if (resp == ha_no_error)
++      ret_val = ok_user_response;
++      else if (resp != he_stale_nonce)
++      ret_val = access_denied_user_response;
++    } else if (user_resp == access_denied_user_response)
++      ret_val = access_denied_user_response;
++  }
++  if (resp != he_memory_too_small && resp != ha_no_error)
++    resp = has_www_auth("", 1, req->internal_realm, resp);
++  return ret_val;
++}
++
++int __attribute__ ((__noinline__, __noclone__))
++authent_author(request *req)
++{
++  struct realm *realm;
++  char *user_name = ((void *)0);
++  struct user_info *user_item = ((void *)0);
++  int res = 0;
++  asm ("");
++  realm = realms;
++  if (__builtin_strcmp("Wsd", realm->name) == 0) {
++    req->internal_realm = ws_realm;
++    is_digest(&user_name);
++  }
++  if (authenticate_user(req, &user_name, &user_item) < 0) {
++    if (user_name != ((void *)0))
++      req->user = user_name;
++    res = -2;
++    goto authent_author_return;
++  }
++  if (is_member_of_groups(user_item, realm->groups) < 0)
++    res = -1;
++authent_author_return:
++  return res;
++}
++
++int good0, good1, good2;
++
++__attribute__ ((__noinline__, __noclone__))
++char *foo(void)
++{
++  asm ("");
++  good0++;
++  return "";
++}
++
++__attribute__ ((__noinline__, __noclone__))
++char *ha_get_string_value(void)
++{
++  asm ("");
++  good1++;
++  return "f";
++}
++
++__attribute__ ((__noinline__, __noclone__))
++har has_auth_user(const char *a, const char *b, realm_type c, char *d, size_t e)
++{
++  asm ("");
++  if (*a != 'z' || a[1] != 0 || b != 0 || c != axis_realm || *d != 0
++      || e != 1)
++    __builtin_abort ();
++  return ha_no_error;
++}
++
++__attribute__ ((__noinline__, __noclone__))
++har has_www_auth(char *a, size_t b, realm_type c, har d)
++{
++  (void)(*a+b+c+d);
++  asm ("");
++  __builtin_abort ();
++}
++
++
++char *strdupped_user = "me";
++__attribute__((__malloc__, __noclone__, __noinline__))
++char* g_strdup (const char *str)
++{
++  asm ("");
++  if (*str != 'f')
++    __builtin_abort ();
++  good2++;
++  return strdupped_user;
++}
++
++__attribute__((__noclone__, __noinline__))
++void g_free (void * mem)
++{
++  (void)mem;
++  asm ("");
++  __builtin_abort ();
++}
++
++struct user_info me = { .name = "me", .no_groups = 1, .groups = {42}, .next = 0};
++struct user_info you = { .name = "you", .next = &me};
++struct realm_group xgroups = { .name = "*", .id = 42, .next = 0};
++
++int main(void)
++{
++  char *orig_user = "?";
++  struct realm r = { .name = "x", .space = "space?", .groups = &xgroups, .next = 0};
++  request req = { .user = orig_user, .realm = "!", .authent = "z",
++                .internal_realm = axis_realm};
++  realms = &r;
++  users = &you;
++  if (authent_author (&req) != 0 || good0 != 1 || good1 != 1 || good2 != 1
++      || req.user != orig_user
++      || req.internal_realm != axis_realm)
++    __builtin_abort ();
++  __builtin_exit (0);
++}
++
+Index: gcc/testsuite/gcc.dg/torture/pr52693.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr52693.c     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr52693.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,33 @@
++/* { dg-do run } */
++
++struct pair
++{
++  int x;
++  int y;
++};
++
++struct array
++{
++  struct pair elems[ 2 ];
++  unsigned index;
++};
++
++extern void abort ();
++
++void __attribute__ ((noinline,noclone))
++test_results (int x1, int y1, int x2, int y2)
++{
++  if (x1 != x2 || y1 != y2)
++    abort ();
++}
++
++int
++main (void)
++{
++  struct array arr = {{{1,2}, {3,4}}, 1};
++  struct pair last = arr.elems[arr.index];
++
++  test_results ( last.x, last.y, arr.elems[1].x, arr.elems[1].y);
++
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/torture/pr53790.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr53790.c     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr53790.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,17 @@
++/* { dg-do compile } */
++
++typedef struct s {
++    int value;
++} s_t;
++
++static inline int 
++read(s_t const *var)
++{
++  return var->value;
++}
++
++int main()
++{
++  extern union u extern_var;
++  return read((s_t *)&extern_var);
++}
+Index: gcc/testsuite/gcc.dg/torture/pr52407.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr52407.c     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr52407.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,33 @@
++/* { dg-do run } */
++
++extern void abort (void);
++
++typedef long long T;
++typedef T vl_t __attribute__((vector_size(2 * sizeof (T))));
++
++vl_t  ul[4], vl[4] = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
++
++static void
++mul_vl_l(vl_t *u, vl_t *v, T x, int m)
++{
++  vl_t         w;
++  T *p = (T *)&w;
++  p[0] = p[1] = x;
++  while (m--)
++    *u++ = *v++ * w;
++}
++
++int
++main(int argc, char *argv[])
++{
++  int i;
++  T *pl;
++
++  pl = (T *) &ul;
++  mul_vl_l(ul, vl, 2, 4);
++  for (i = 0; i < 8; i++)
++    if (pl[i] != 2 * (i + 1))
++      abort ();
++
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/torture/pr51071-2.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr51071-2.c   (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr51071-2.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,38 @@
++/* { dg-do compile } */
++/* { dg-options "-fno-delete-null-pointer-checks" } */
++
++extern struct module __this_module;
++static inline void
++trace_module_get  (struct module *mod, unsigned long ip) { }
++struct module;
++static inline __attribute__((no_instrument_function))
++int try_module_get(struct module *module)
++{
++  int ret = 1;
++  if (module)
++    {
++      if (module_is_live(module))
++      {
++        __label__ __here;
++        asm("");
++        __here:
++        trace_module_get(module, (unsigned long)&&__here);
++      }
++      else
++      ret = 0;
++    }
++  return ret;
++}
++struct net_device;
++struct net_device_ops {
++    int (*ndo_open)(struct net_device *dev);
++};
++int t3e3_open(struct net_device *dev)
++{
++  int ret = hdlc_open(dev);
++  if (ret)
++    return ret;
++  try_module_get((&__this_module));
++  return 0;
++}
++const struct net_device_ops t3e3_ops = { .ndo_open = t3e3_open };
+Index: gcc/testsuite/gcc.dg/torture/pr51071.c
+===================================================================
+--- gcc/testsuite/gcc.dg/torture/pr51071.c     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/torture/pr51071.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,33 @@
++/* { dg-do compile } */
++
++void foo (void);
++void bar (void *);
++extern int t;
++
++static void kmalloc_large (int size, int flags)
++{
++  (void) size;
++  (void) flags;
++  foo ();
++  bar (({__here:&&__here;}));
++}
++
++static void kmalloc (int size, int flags)
++{
++  if (size)
++    {
++      if ((unsigned long) size > 0x1000)
++      kmalloc_large (size, flags);
++
++      if (flags)
++      bar (({__here:&&__here;}));
++    }
++}
++
++void compress_file_range (int i, int j, int k)
++{
++  int nr_pages = ({j < k;});
++
++  if (i || t)
++    kmalloc (0x1000UL * nr_pages, 0x40UL);
++}
+Index: gcc/testsuite/gcc.dg/volatile-bitfields-2.c
+===================================================================
+--- gcc/testsuite/gcc.dg/volatile-bitfields-2.c        (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/gcc.dg/volatile-bitfields-2.c        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,15 @@
++/* { dg-do run } */
++/* { dg-options "-fstrict-volatile-bitfields" } */
++
++extern void abort(void);
++struct thing {
++  volatile unsigned short a: 8;
++  volatile unsigned short b: 8;
++} t = {1,2};
++
++int main()
++{
++  t.a = 3;
++  if (t.a !=3 || t.b !=2) abort();
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/20020201-1.c
+===================================================================
+--- gcc/testsuite/gcc.dg/20020201-1.c  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/gcc.dg/20020201-1.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -7,12 +7,8 @@
+ /* { dg-options "-fprofile-arcs" } */
+ /* { dg-do run { target native } } */
+-extern void abort (void);
+-extern void exit (int);
++#include <stdlib.h>
+-int rand (void);
+-void srand (unsigned int seed);
+-
+ int globvar;
+ void
+Index: gcc/testsuite/ChangeLog
+===================================================================
+--- gcc/testsuite/ChangeLog    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/testsuite/ChangeLog    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,232 @@
++2012-08-06  Anna Tikhonova  <anna.m.tikhonova@gmail.com>
++
++      * gcc.dg/20020201-1.c: Remove declarations for exit, abort,
++      rand, srand. Include <stdlib.h>.
++
++2012-07-16  Steven Bosscher  <steven@gcc.gnu.org>
++
++      Backport from trunk:
++      2012-07-13  Hans-Peter Nilsson  <hp@axis.com>
++
++      PR rtl-optimization/53908
++      * gcc.dg/torture/pr53908.c: New test.
++
++2012-07-14  Mikael Morin  <mikael.morin@gcc.gnu.org>
++
++      Backport from trunk:
++      2012-01-09  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/51758
++      * gfortran.dg/optional_absent_2.f90: New.
++
++2012-07-03  Michael Hope  <michael.hope@linaro.org>
++
++      PR c++/53814
++      * g++.dg/cpp0x/nullptr28.C: Change selector for explicit
++      options.
++
++2012-06-28  Richard Guenther  <rguenther@suse.de>
++
++      PR middle-end/53790
++      * gcc.dg/torture/pr53790.c: New testcase.
++
++2012-06-25  Jason Merrill  <jason@redhat.com>
++
++      PR c++/52988
++      * g++.dg/cpp0x/nullptr28.C: New.
++
++2012-06-19  Kaz Kojima  <kkojima@gcc.gnu.org>
++
++      * gcc.dg/stack-usage-1.c: Remove dg-options line for sh targets
++      and add __sh__ case.
++
++2012-06-14  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/53597
++      * gfortran.dg/save_4.f90: New.
++
++2012-06-13  Christian Bruel  <christian.bruel@st.com>
++
++      PR target/53621
++      * gcc.dg/stack-usage-1.c: Force -fomit-frame-pointer on SH.
++
++2012-06-05  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/50619
++      * gfortran.dg/init_flag_10.f90: New.
++
++2012-06-04  Edmar Wienskoski  <edmar@freescale.com>
++
++      PR target/53559
++      * gcc.target/powerpc/cell_builtin_1.c: New test case.
++      * gcc.target/powerpc/cell_builtin_2.c: Ditto.
++      * gcc.target/powerpc/cell_builtin_3.c: Ditto.
++      * gcc.target/powerpc/cell_builtin_4.c: Ditto.
++      * gcc.target/powerpc/cell_builtin_5.c: Ditto.
++      * gcc.target/powerpc/cell_builtin_6.c: Ditto.
++      * gcc.target/powerpc/cell_builtin_7.c: Ditto.
++      * gcc.target/powerpc/cell_builtin_8.c: Ditto.
++
++2012-05-23  Michael Hope  <michael.hope@linaro.org>
++
++      PR c++/52796
++      * g++.dg/cpp0x/variadic-value1.C: Change selector for explicit
++      options.
++
++2012-05-23  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/53389
++      * gfortran.dg/realloc_on_assign_15.f90: New.
++
++2012-05-22  Richard Guenther  <rguenther@suse.de>
++
++      Backport from mainline
++      2011-11-10  Richard Guenther  <rguenther@suse.de>
++
++      PR middle-end/51071
++      * gcc.dg/torture/pr51071.c: New testcase.
++      * gcc.dg/torture/pr51071-2.c: Likewise.
++
++2012-05-22  Richard Guenther  <rguenther@suse.de>
++
++      Backport from mainline
++      2012-02-28  Richard Guenther  <rguenther@suse.de>
++
++      PR target/52407
++      * gcc.dg/torture/pr52407.c: New testcase.
++
++2012-05-22  Richard Guenther  <rguenther@suse.de>
++
++      Backport from mainline
++      2012-04-12  Richard Guenther  <rguenther@suse.de>
++
++      PR c/52862
++      * gcc.dg/pr52862.c: New testcase.
++
++2012-05-21  Joseph Myers  <joseph@codesourcery.com>
++
++      PR c/53418
++      * gcc.c-torture/compile/pr53418-1.c,
++      gcc.c-torture/compile/pr53418-2.c: New tests.
++
++2012-05-21  H.J. Lu  <hongjiu.lu@intel.com>
++
++      Backport from mainline
++      2012-05-21  Uros Bizjak  <ubizjak@gmail.com>
++                  H.J. Lu  <hongjiu.lu@intel.com>
++
++      PR target/53416
++      * gcc.target/i386/pr53416.c: New file.
++
++2012-05-14  Uros Bizjak  <ubizjak@gmail.com>
++
++      * gcc.target/i386/avx256-unaligned-load-[1234].c: Update scan strings.
++      * gcc.target/i386/avx256-unaligned-store-[1234].c: Ditto.
++
++2012-05-03  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Backport from mainline
++      2012-05-03  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      PR target/53199
++      * gcc.target/powwerpc/pr53199.c: New file.
++
++2012-05-02  Tobias Burnus  <burnus@net-b.de>
++
++      Backport from mainline
++      2012-04-16  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/52864
++      * gfortran.dg/pointer_intent_6.f90: New.
++
++2012-04-30  Uros Bizjak  <ubizjak@gmail.com>
++
++      Backport from mainline
++      2012-04-27  Paolo Bonzini  <bonzini@gnu.org>
++
++      PR target/53138
++      * gcc.c-torture/execute/20120427-1.c: New testcase.
++
++2012-04-24  Jakub Jelinek  <jakub@redhat.com>
++
++      PR middle-end/53084
++      * gcc.c-torture/execute/pr53084.c: New test.
++
++2012-04-13  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      Backport from mainline
++      2012-04-12  Michael Meissner  <meissner@linux.vnet.ibm.com>
++
++      PR target/52775
++      * gcc.target/powerpc/pr52775.c: New file.
++
++2012-04-03  Jason Merrill  <jason@redhat.com>
++
++      PR c++/52796
++      * g++.dg/cpp0x/variadic-value1.C: New.
++
++2012-03-28  Joey Ye  <joey.ye@arm.com>
++
++      Backported from mainline
++      2011-12-20  Bernd Schmidt  <bernds@codesourcery.com>
++
++      PR middle-end/51200
++      * gcc.target/arm/volatile-bitfields-4.c: New test.
++      * c-c++-common/abi-bf.c: New test.
++
++      2011-12-26  Joey Ye  <joey.ye@arm.com>
++
++      PR middle-end/51200
++      * gcc.dg/volatile-bitfields-2.c: New test.
++
++2012-03-28  Martin Jambor  <mjambor@suse.cz>
++
++      Backported from mainline
++      2012-03-27  Martin Jambor  <mjambor@suse.cz>
++
++      PR middle-end/52693
++      * gcc.dg/torture/pr52693.c: New test.
++
++2012-03-28  Jakub Jelinek  <jakub@redhat.com>
++
++      PR target/52736
++      * gcc.target/i386/pr52736.c: New test.
++
++2012-03-24  Jan Hubicka  <jh@suse.cz>
++
++      PR middle-end/51737
++      * g++.dg/torture/pr51737.C: New testcase
++
++2012-03-24  Steven Bosscher  <steven@gcc.gnu.org>
++
++      PR middle-end/52640
++      * gcc.c-torture/compile/limits-externdecl.c: New test.
++
++2012-03-16  Jan Hubicka  <jh@suse.cz>
++
++      PR middle-end/48600
++      * g++.dg/torture/pr48600.C: New testcase.
++
++2012-03-10  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/52469
++      * gfortran.dg/proc_ptr_34.f90: New.
++
++2012-03-06  Tobias Burnus  <burnus@net-b.de>
++
++      Backport from mainline
++      2012-03-02  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/52452
++      * gfortran.dg/intrinsic_8.f90: New.
++
++2012-03-02  Peter Bergner  <bergner@vnet.ibm.com>
++
++      Backport from mainline
++      2012-03-02  Peter Bergner  <bergner@vnet.ibm.com>
++
++      * gcc.target/powerpc/pr52457.c: New test.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: gcc/testsuite/g++.dg/cpp0x/variadic-value1.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/variadic-value1.C       (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/variadic-value1.C       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,24 @@
++// PR c++/52796
++// { dg-options "-std=c++0x -pedantic-errors" }
++
++inline void *operator new(__SIZE_TYPE__ s, void *p) { return p; }
++
++struct A
++{
++  int i;
++  template<class... Ts>
++  A(Ts&&... ts): i(ts...) { }
++};
++
++static union {
++  unsigned char c[sizeof(A)];
++  int i;
++};
++
++int main()
++{
++  i = 0xdeadbeef;
++  new(c) A;
++  if (i != 0)
++    __builtin_abort();
++}
+Index: gcc/testsuite/g++.dg/cpp0x/nullptr28.C
+===================================================================
+--- gcc/testsuite/g++.dg/cpp0x/nullptr28.C     (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/g++.dg/cpp0x/nullptr28.C     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,17 @@
++// { dg-do run }
++// { dg-options "-std=c++0x -pedantic-errors" }
++
++typedef decltype(nullptr) nullptr_t;
++
++int i;
++nullptr_t n;
++const nullptr_t& f() { ++i; return n; }
++
++nullptr_t g() { return f(); }
++
++int main()
++{
++  g();
++  if (i != 1)
++    __builtin_abort ();
++}
+Index: gcc/testsuite/c-c++-common/abi-bf.c
+===================================================================
+--- gcc/testsuite/c-c++-common/abi-bf.c        (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/testsuite/c-c++-common/abi-bf.c        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,3 @@
++/* { dg-warning "incompatible" } */
++/* { dg-do compile } */
++/* { dg-options "-fstrict-volatile-bitfields -fabi-version=1" } */
+Index: gcc/cp/typeck.c
+===================================================================
+--- gcc/cp/typeck.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cp/typeck.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1822,7 +1822,7 @@
+   if (error_operand_p (exp))
+     return error_mark_node;
+-  if (NULLPTR_TYPE_P (type))
++  if (NULLPTR_TYPE_P (type) && !TREE_SIDE_EFFECTS (exp))
+     return nullptr_node;
+   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
+Index: gcc/cp/decl.c
+===================================================================
+--- gcc/cp/decl.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cp/decl.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -3636,7 +3636,7 @@
+     TYPE_SIZE_UNIT (nullptr_type_node) = size_int (GET_MODE_SIZE (ptr_mode));
+     TYPE_UNSIGNED (nullptr_type_node) = 1;
+     TYPE_PRECISION (nullptr_type_node) = GET_MODE_BITSIZE (ptr_mode);
+-    SET_TYPE_MODE (nullptr_type_node, Pmode);
++    SET_TYPE_MODE (nullptr_type_node, ptr_mode);
+     record_builtin_type (RID_MAX, "decltype(nullptr)", nullptr_type_node);
+     nullptr_node = build_int_cst (nullptr_type_node, 0);
+   }
+Index: gcc/cp/ChangeLog
+===================================================================
+--- gcc/cp/ChangeLog   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cp/ChangeLog   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,20 @@
++2012-06-25  Jason Merrill  <jason@redhat.com>
++
++      PR c++/52988
++      * typeck.c (decay_conversion): Don't discard side-effects from
++      expressions of nullptr_t.
++
++2012-04-04  Steve Ellcey <sje@cup.hp.com>
++
++      Backported from mainline.
++      * decl.c (cxx_init_decl_processing): Use ptr_mode instead of Pmode.
++
++2012-04-03  Jason Merrill  <jason@redhat.com>
++
++      PR c++/52796
++      * pt.c (tsubst_initializer_list): A pack expansion with no elements
++      means value-initialization.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: gcc/cp/pt.c
+===================================================================
+--- gcc/cp/pt.c        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cp/pt.c        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -17785,6 +17785,7 @@
+             }
+           else
+             {
++            tree tmp;
+               decl = tsubst_copy (TREE_PURPOSE (t), argvec, 
+                                   tf_warning_or_error, NULL_TREE);
+@@ -17793,10 +17794,17 @@
+                 in_base_initializer = 1;
+             init = TREE_VALUE (t);
++            tmp = init;
+             if (init != void_type_node)
+               init = tsubst_expr (init, argvec,
+                                   tf_warning_or_error, NULL_TREE,
+                                   /*integral_constant_expression_p=*/false);
++            if (init == NULL_TREE && tmp != NULL_TREE)
++              /* If we had an initializer but it instantiated to nothing,
++                 value-initialize the object.  This will only occur when
++                 the initializer was a pack expansion where the parameter
++                 packs used in that expansion were of length zero.  */
++              init = void_type_node;
+               in_base_initializer = 0;
+             }
+Index: gcc/cp/semantics.c
+===================================================================
+--- gcc/cp/semantics.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/cp/semantics.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -6763,7 +6763,6 @@
+   STRIP_NOPS (sub);
+   subtype = TREE_TYPE (sub);
+-  gcc_assert (POINTER_TYPE_P (subtype));
+   if (TREE_CODE (sub) == ADDR_EXPR)
+     {
+Index: gcc/tree-ssa-ccp.c
+===================================================================
+--- gcc/tree-ssa-ccp.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/tree-ssa-ccp.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1364,6 +1364,10 @@
+       if (!DECL_INITIAL (base)
+         && (TREE_STATIC (base) || DECL_EXTERNAL (base)))
+         return error_mark_node;
++      /* Do not return an error_mark_node DECL_INITIAL.  LTO uses this
++       as special marker (_not_ zero ...) for its own purposes.  */
++      if (DECL_INITIAL (base) == error_mark_node)
++      return NULL_TREE;
+       return DECL_INITIAL (base);
+     case ARRAY_REF:
+Index: gcc/expr.c
+===================================================================
+--- gcc/expr.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/expr.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -5971,6 +5971,8 @@
+               || bitpos % GET_MODE_ALIGNMENT (mode))
+              && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target)))
+             || (bitpos % BITS_PER_UNIT != 0)))
++      || (bitsize >= 0 && mode != BLKmode
++        && GET_MODE_BITSIZE (mode) > bitsize)
+       /* If the RHS and field are a constant size and the size of the
+        RHS isn't the same size as the bitfield, we must use bitfield
+        operations.  */
+@@ -9182,6 +9184,7 @@
+       orig_op0 = op0
+         = expand_expr (tem,
+                        (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
++                        && COMPLETE_TYPE_P (TREE_TYPE (tem))
+                         && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
+                             != INTEGER_CST)
+                         && modifier != EXPAND_STACK_PARM
+Index: gcc/gcov-iov.c
+===================================================================
+--- gcc/gcov-iov.c     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/gcov-iov.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -19,8 +19,8 @@
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+-#include <stdio.h>
+-#include <stdlib.h>
++#include "bconfig.h"
++#include "system.h"
+ /* Command line arguments are the base GCC version and the development
+    phase (the latter may be an empty string).  */
+@@ -48,8 +48,14 @@
+   if (*ptr == '.')
+     minor = strtoul (ptr + 1, 0, 10);
++  /* For releases the development phase is an empty string, for
++     prerelease versions on a release branch it is "prerelease".
++     Consider both equal as patch-level releases do not change
++     the GCOV version either.
++     On the trunk the development phase is "experimental".  */
+   phase = argv[2][0];
+-  if (phase == '\0')
++  if (phase == '\0'
++      || strcmp (argv[2], "prerelease") == 0)
+     phase = '*';
+   v[0] = (major < 10 ? '0' : 'A' - 10) + major;
+Index: gcc/predict.c
+===================================================================
+--- gcc/predict.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/predict.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1790,7 +1790,8 @@
+ static void
+ predict_paths_for_bb (basic_block cur, basic_block bb,
+                     enum br_predictor pred,
+-                    enum prediction taken)
++                    enum prediction taken,
++                    bitmap visited)
+ {
+   edge e;
+   edge_iterator ei;
+@@ -1811,7 +1812,7 @@
+       continue;
+       gcc_assert (bb == cur || dominated_by_p (CDI_POST_DOMINATORS, cur, bb));
+-      /* See if there is how many edge from e->src that is not abnormal
++      /* See if there is an edge from e->src that is not abnormal
+        and does not lead to BB.  */
+       FOR_EACH_EDGE (e2, ei2, e->src->succs)
+       if (e2 != e
+@@ -1824,16 +1825,20 @@
+       /* If there is non-abnormal path leaving e->src, predict edge
+        using predictor.  Otherwise we need to look for paths
+-       leading to e->src.  */
++       leading to e->src.
++
++       The second may lead to infinite loop in the case we are predicitng
++       regions that are only reachable by abnormal edges.  We simply
++       prevent visiting given BB twice.  */
+       if (found)
+         predict_edge_def (e, pred, taken);
+-      else
+-      predict_paths_for_bb (e->src, e->src, pred, taken);
++      else if (bitmap_set_bit (visited, e->src->index))
++      predict_paths_for_bb (e->src, e->src, pred, taken, visited);
+     }
+   for (son = first_dom_son (CDI_POST_DOMINATORS, cur);
+        son;
+        son = next_dom_son (CDI_POST_DOMINATORS, son))
+-    predict_paths_for_bb (son, bb, pred, taken);
++    predict_paths_for_bb (son, bb, pred, taken, visited);
+ }
+ /* Sets branch probabilities according to PREDiction and
+@@ -1843,7 +1848,9 @@
+ predict_paths_leading_to (basic_block bb, enum br_predictor pred,
+                         enum prediction taken)
+ {
+-  predict_paths_for_bb (bb, bb, pred, taken);
++  bitmap visited = BITMAP_ALLOC (NULL);
++  predict_paths_for_bb (bb, bb, pred, taken, visited);
++  BITMAP_FREE (visited);
+ }
+ /* Like predict_paths_leading_to but take edge instead of basic block.  */
+@@ -1866,7 +1873,11 @@
+       break;
+       }
+   if (!has_nonloop_edge)
+-    predict_paths_for_bb (bb, bb, pred, taken);
++    {
++      bitmap visited = BITMAP_ALLOC (NULL);
++      predict_paths_for_bb (bb, bb, pred, taken, visited);
++      BITMAP_FREE (visited);
++    }
+   else
+     predict_edge_def (e, pred, taken);
+ }
+Index: gcc/ada/ChangeLog
+===================================================================
+--- gcc/ada/ChangeLog  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/ada/ChangeLog  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,12 @@
++2012-05-26  Eric Botcazou  <ebotcazou@adacore.com>
++
++      * gcc-interface/decl.c (variant_desc): Rename 'record' to 'new_type'.
++      (build_variant_list): Adjust to above renaming.
++      (gnat_to_gnu_entity) <E_Record_Subtype>: Likewise.  Give a unique name
++      to the type of the variant containers.
++      (create_variant_part_from): Likewise.  Give a unique name to the type
++      of the variant part.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: gcc/ada/gcc-interface/decl.c
+===================================================================
+--- gcc/ada/gcc-interface/decl.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/ada/gcc-interface/decl.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -120,8 +120,8 @@
+   /* The value of the qualifier.  */
+   tree qual;
+-  /* The record associated with this variant.  */
+-  tree record;
++  /* The type of the variant after transformation.  */
++  tree new_type;
+ } variant_desc;
+ DEF_VEC_O(variant_desc);
+@@ -3157,11 +3157,16 @@
+                     {
+                       tree old_variant = v->type;
+                       tree new_variant = make_node (RECORD_TYPE);
++                      tree suffix
++                        = concat_name (DECL_NAME (gnu_variant_part),
++                                       IDENTIFIER_POINTER
++                                       (DECL_NAME (v->field)));
+                       TYPE_NAME (new_variant)
+-                        = DECL_NAME (TYPE_NAME (old_variant));
++                        = concat_name (TYPE_NAME (gnu_type),
++                                       IDENTIFIER_POINTER (suffix));
+                       copy_and_substitute_in_size (new_variant, old_variant,
+                                                    gnu_subst_list);
+-                      v->record = new_variant;
++                      v->new_type = new_variant;
+                     }
+               }
+             else
+@@ -3265,7 +3270,7 @@
+                           if (selected_variant)
+                             gnu_cont_type = gnu_type;
+                           else
+-                            gnu_cont_type = v->record;
++                            gnu_cont_type = v->new_type;
+                         }
+                       else
+                         /* The front-end may pass us "ghost" components if
+@@ -7704,7 +7709,7 @@
+         v->type = variant_type;
+         v->field = gnu_field;
+         v->qual = qual;
+-        v->record = NULL_TREE;
++        v->new_type = NULL_TREE;
+         /* Recurse on the variant subpart of the variant, if any.  */
+         variant_subpart = get_variant_part (variant_type);
+@@ -8457,7 +8462,9 @@
+   /* First create the type of the variant part from that of the old one.  */
+   new_union_type = make_node (QUAL_UNION_TYPE);
+-  TYPE_NAME (new_union_type) = DECL_NAME (TYPE_NAME (old_union_type));
++  TYPE_NAME (new_union_type)
++    = concat_name (TYPE_NAME (record_type),
++                 IDENTIFIER_POINTER (DECL_NAME (old_variant_part)));
+   /* If the position of the variant part is constant, subtract it from the
+      size of the type of the parent to get the new size.  This manual CSE
+@@ -8491,7 +8498,7 @@
+       continue;
+       /* Retrieve the list of fields already added to the new variant.  */
+-      new_variant = v->record;
++      new_variant = v->new_type;
+       field_list = TYPE_FIELDS (new_variant);
+       /* If the old variant had a variant subpart, we need to create a new
+Index: gcc/fortran/trans-array.c
+===================================================================
+--- gcc/fortran/trans-array.c  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/fortran/trans-array.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2056,6 +2056,11 @@
+   gfc_se se;
+   int n;
++  /* Don't evaluate the arguments for realloc_lhs_loop_for_fcn_call; otherwise,
++     arguments could get evaluated multiple times.  */
++  if (ss->is_alloc_lhs)
++    return;
++
+   /* TODO: This can generate bad code if there are ordering dependencies,
+      e.g., a callee allocated function and an unknown size constructor.  */
+   gcc_assert (ss != NULL);
+@@ -7548,7 +7553,7 @@
+   scalar = 1;
+   for (; arg; arg = arg->next)
+     {
+-      if (!arg->expr)
++      if (!arg->expr || arg->expr->expr_type == EXPR_NULL)
+       continue;
+       newss = gfc_walk_subexpr (head, arg->expr);
+Index: gcc/fortran/decl.c
+===================================================================
+--- gcc/fortran/decl.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/fortran/decl.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -3623,8 +3623,9 @@
+       }
+     }
+-  /* Module variables implicitly have the SAVE attribute.  */
+-  if (gfc_current_state () == COMP_MODULE && !current_attr.save)
++  /* Since Fortran 2008 module variables implicitly have the SAVE attribute.  */
++  if (gfc_current_state () == COMP_MODULE && !current_attr.save
++      && (gfc_option.allow_std & GFC_STD_F2008) != 0)
+     current_attr.save = SAVE_IMPLICIT;
+   colon_seen = 1;
+Index: gcc/fortran/ChangeLog
+===================================================================
+--- gcc/fortran/ChangeLog      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/fortran/ChangeLog      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,60 @@
++2012-07-14  Mikael Morin  <mikael@gcc.gnu.org>
++
++      Backport from trunk:
++      2012-01-09  Mikael Morin  <mikael@gcc.gnu.org>
++
++      PR fortran/51758
++      * trans-array.c (gfc_walk_elemental_function_args):
++      Skip over NULL() actual arguments.
++
++2012-06-14  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/53597
++      * decl.c (match_attr_spec): Only mark module variables
++      as SAVE_IMPLICIT for Fortran 2008 and later.
++
++2012-06-05  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/50619
++      * resolve.c (build_default_init_expr): Don't initialize
++      ASSOCIATE names.
++
++2012-06-01  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/53521
++      * trans.c (gfc_deallocate_scalar_with_status): Properly
++      handle the case size == 0.
++
++2012-05-23  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/53389
++      * trans-array.c (gfc_add_loop_ss_code): Don't evaluate
++      expression, if ss->is_alloc_lhs is set.
++
++2012-05-02  Tobias Burnus  <burnus@net-b.de>
++
++      Backport from mainline
++      2012-04-12  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/52864
++      * expr.c (gfc_check_vardef_context): Fix assignment check for
++      pointer components.
++
++2012-03-10  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/52469
++      * trans-types.c (gfc_get_function_type): Handle backend_decl
++      of a procedure pointer.
++
++2012-03-06  Tobias Burnus  <burnus@net-b.de>
++
++      Backport from mainline
++      2012-03-02  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/52452
++      * resolve.c (resolve_intrinsic): Don't search for a
++      function if we know that it is a subroutine.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: gcc/fortran/expr.c
+===================================================================
+--- gcc/fortran/expr.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/fortran/expr.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -4474,7 +4474,11 @@
+       if (ptr_component && ref->type == REF_COMPONENT)
+       check_intentin = false;
+       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
+-      ptr_component = true;
++      {
++        ptr_component = true;
++        if (!pointer)
++          check_intentin = false;
++      }
+     }
+   if (check_intentin && sym->attr.intent == INTENT_IN)
+     {
+Index: gcc/fortran/trans.c
+===================================================================
+--- gcc/fortran/trans.c        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/fortran/trans.c        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1005,15 +1005,12 @@
+   if (!res && size != 0)
+     _gfortran_os_error ("Allocation would exceed memory limit");
+-  if (size == 0)
+-    return NULL;
+-
+   return res;
+ }  */
+ tree
+ gfc_call_realloc (stmtblock_t * block, tree mem, tree size)
+ {
+-  tree msg, res, nonzero, zero, null_result, tmp;
++  tree msg, res, nonzero, null_result, tmp;
+   tree type = TREE_TYPE (mem);
+   size = gfc_evaluate_now (size, block);
+@@ -1044,15 +1041,6 @@
+                        build_empty_stmt (input_location));
+   gfc_add_expr_to_block (block, tmp);
+-  /* if (size == 0) then the result is NULL.  */
+-  tmp = fold_build2_loc (input_location, MODIFY_EXPR, type, res,
+-                       build_int_cst (type, 0));
+-  zero = fold_build1_loc (input_location, TRUTH_NOT_EXPR, boolean_type_node,
+-                        nonzero);
+-  tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, zero, tmp,
+-                       build_empty_stmt (input_location));
+-  gfc_add_expr_to_block (block, tmp);
+-
+   return res;
+ }
+Index: gcc/fortran/trans-types.c
+===================================================================
+--- gcc/fortran/trans-types.c  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/fortran/trans-types.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2519,7 +2519,11 @@
+             || sym->attr.flavor == FL_PROGRAM);
+   if (sym->backend_decl)
+-    return TREE_TYPE (sym->backend_decl);
++    {
++      if (sym->attr.proc_pointer)
++      return TREE_TYPE (TREE_TYPE (sym->backend_decl));
++      return TREE_TYPE (sym->backend_decl);
++    }
+   alternate_return = 0;
+   typelist = NULL_TREE;
+Index: gcc/fortran/resolve.c
+===================================================================
+--- gcc/fortran/resolve.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/fortran/resolve.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1452,7 +1452,7 @@
+   if (sym->intmod_sym_id)
+     isym = gfc_intrinsic_function_by_id ((gfc_isym_id) sym->intmod_sym_id);
+-  else
++  else if (!sym->attr.subroutine)
+     isym = gfc_find_function (sym->name);
+   if (isym)
+@@ -9700,7 +9700,8 @@
+       || sym->attr.data
+       || sym->module
+       || sym->attr.cray_pointee
+-      || sym->attr.cray_pointer)
++      || sym->attr.cray_pointer
++      || sym->assoc)
+     return NULL;
+   /* Now we'll try to build an initializer expression.  */
+Index: gcc/BASE-VER
+===================================================================
+--- gcc/BASE-VER       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/BASE-VER       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1 +1 @@
+-4.6.3
++4.6.4
+Index: gcc/stor-layout.c
+===================================================================
+--- gcc/stor-layout.c  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/stor-layout.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -660,12 +660,13 @@
+         /* See if we can use an ordinary integer mode for a bit-field.
+            Conditions are: a fixed size that is correct for another mode,
+            occupying a complete byte or bytes on proper boundary,
+-           and not volatile or not -fstrict-volatile-bitfields.  */
++           and not -fstrict-volatile-bitfields.  If the latter is set,
++           we unfortunately can't check TREE_THIS_VOLATILE, as a cast
++           may make a volatile object later.  */
+         if (TYPE_SIZE (type) != 0
+             && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
+             && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT
+-            && !(TREE_THIS_VOLATILE (decl)
+-                 && flag_strict_volatile_bitfields > 0))
++            && flag_strict_volatile_bitfields <= 0)
+           {
+             enum machine_mode xmode
+               = mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1);
+Index: gcc/tree-vect-loop.c
+===================================================================
+--- gcc/tree-vect-loop.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/tree-vect-loop.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2104,7 +2104,8 @@
+           if (stmt_info
+               && !STMT_VINFO_RELEVANT_P (stmt_info)
+               && (!STMT_VINFO_LIVE_P (stmt_info)
+-                  || STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def))
++                  || !VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (stmt_info)))
++            && !STMT_VINFO_IN_PATTERN_P (stmt_info))
+             continue;
+           if (STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt)))
+@@ -2251,11 +2252,19 @@
+       {
+         gimple stmt = gsi_stmt (si);
+         stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
++
++        if (STMT_VINFO_IN_PATTERN_P (stmt_info))
++          {
++            stmt = STMT_VINFO_RELATED_STMT (stmt_info);
++            stmt_info = vinfo_for_stmt (stmt);
++          }
++
+         /* Skip stmts that are not vectorized inside the loop.  */
+         if (!STMT_VINFO_RELEVANT_P (stmt_info)
+             && (!STMT_VINFO_LIVE_P (stmt_info)
+-                || STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def))
++                || !VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (stmt_info))))
+           continue;
++
+         vec_inside_cost += STMT_VINFO_INSIDE_OF_LOOP_COST (stmt_info) * factor;
+         /* FIXME: for stmts in the inner-loop in outer-loop vectorization,
+            some of the "outside" costs are generated inside the outer-loop.  */
+Index: gcc/c-typeck.c
+===================================================================
+--- gcc/c-typeck.c     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/c-typeck.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -4315,6 +4315,11 @@
+     ret = fold_build3_loc (colon_loc, COND_EXPR, result_type, ifexp, op1, op2);
+   else
+     {
++      if (int_operands)
++      {
++        op1 = remove_c_maybe_const_expr (op1);
++        op2 = remove_c_maybe_const_expr (op2);
++      }
+       ret = build3 (COND_EXPR, result_type, ifexp, op1, op2);
+       if (int_operands)
+       ret = note_integer_operands (ret);
+Index: gcc/tree-sra.c
+===================================================================
+--- gcc/tree-sra.c     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/tree-sra.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2937,7 +2937,13 @@
+     }
+   else
+     {
+-      if (access_has_children_p (lacc) && access_has_children_p (racc))
++      if (access_has_children_p (lacc)
++        && access_has_children_p (racc)
++        /* When an access represents an unscalarizable region, it usually
++           represents accesses with variable offset and thus must not be used
++           to generate new memory accesses.  */
++        && !lacc->grp_unscalarizable_region
++        && !racc->grp_unscalarizable_region)
+       {
+         gimple_stmt_iterator orig_gsi = *gsi;
+         enum unscalarized_data_handling refreshed;
+Index: gcc/lto/lto.c
+===================================================================
+--- gcc/lto/lto.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/lto/lto.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -893,7 +893,8 @@
+   for (node = cgraph_nodes; node; node = node->next)
+     {
+-      if (!partition_cgraph_node_p (node))
++      if (!partition_cgraph_node_p (node)
++        || node->aux)
+       continue;
+       file_data = node->local.lto_file_data;
+@@ -923,13 +924,13 @@
+         npartitions++;
+       }
+-      if (!node->aux)
+-        add_cgraph_node_to_partition (partition, node);
++      add_cgraph_node_to_partition (partition, node);
+     }
+   for (vnode = varpool_nodes; vnode; vnode = vnode->next)
+     {
+-      if (!partition_varpool_node_p (vnode))
++      if (!partition_varpool_node_p (vnode)
++        || vnode->aux)
+       continue;
+       file_data = vnode->lto_file_data;
+       slot = pointer_map_contains (pmap, file_data);
+@@ -943,8 +944,7 @@
+         npartitions++;
+       }
+-      if (!vnode->aux)
+-        add_varpool_node_to_partition (partition, vnode);
++      add_varpool_node_to_partition (partition, vnode);
+     }
+   for (node = cgraph_nodes; node; node = node->next)
+     node->aux = NULL;
+@@ -1050,8 +1050,9 @@
+   for (i = 0; i < n_nodes; i++)
+     {
+-      if (!order[i]->aux)
+-        add_cgraph_node_to_partition (partition, order[i]);
++      if (order[i]->aux)
++      continue;
++      add_cgraph_node_to_partition (partition, order[i]);
+       total_size -= order[i]->global.size;
+       /* Once we added a new node to the partition, we also want to add
+@@ -1231,6 +1232,8 @@
+           }
+         i = best_i;
+         /* When we are finished, avoid creating empty partition.  */
++        while (i < n_nodes - 1 && order[i + 1]->aux)
++          i++;
+         if (i == n_nodes - 1)
+           break;
+         partition = new_partition ("");
+Index: gcc/lto/ChangeLog
+===================================================================
+--- gcc/lto/ChangeLog  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/lto/ChangeLog  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,12 @@
++2012-04-23  Peter Bergner  <bergner@vnet.ibm.com>
++
++      Backport from mainline
++      2011-06-11  Jan Hubicka  <jh@suse.cz>
++
++      PR lto/48246
++      * lto.c (lto_1_to_1_map): Don't create empty partitions.
++      (lto_balanced_map): Likewise.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: gcc/ipa-prop.c
+===================================================================
+--- gcc/ipa-prop.c     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/ipa-prop.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -704,12 +704,11 @@
+       || is_global_var (base))
+     return;
+-  if (detect_type_change (op, base, call, jfunc, offset))
++  binfo = TYPE_BINFO (TREE_TYPE (base));
++  if (!binfo
++      || detect_type_change (op, base, call, jfunc, offset))
+     return;
+-  binfo = TYPE_BINFO (TREE_TYPE (base));
+-  if (!binfo)
+-    return;
+   binfo = get_binfo_at_offset (binfo, offset, TREE_TYPE (op));
+   if (binfo)
+     {
+Index: gcc/varasm.c
+===================================================================
+--- gcc/varasm.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/varasm.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,7 +1,7 @@
+ /* Output variables, constants and external declarations, for GNU compiler.
+    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
+    1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+-   2010, 2011  Free Software Foundation, Inc.
++   2010, 2011, 2012  Free Software Foundation, Inc.
+ This file is part of GCC.
+@@ -30,6 +30,7 @@
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
++#include "pointer-set.h"
+ #include "tm.h"
+ #include "rtl.h"
+ #include "tree.h"
+@@ -2097,6 +2098,19 @@
+    it all the way to final.  See PR 17982 for further discussion.  */
+ static GTY(()) tree pending_assemble_externals;
++/* FIXME: Trunk is at GCC 4.8 now and the above problem still hasn't been
++   addressed properly.  This caused PR 52640 due to O(external_decls**2)
++   lookups in the pending_assemble_externals TREE_LIST in assemble_external.
++   Paper over with this pointer set, which we use to see if we have already
++   added a decl to pending_assemble_externals without first traversing
++   the entire pending_assemble_externals list.  See assemble_external().  */
++static struct pointer_set_t *pending_assemble_externals_set;
++
++/* Some targets delay some output to final using TARGET_ASM_FILE_END.
++   As a result, assemble_external can be called after the list of externals
++   is processed and the pointer set destroyed.  */
++static bool pending_assemble_externals_processed;
++
+ #ifdef ASM_OUTPUT_EXTERNAL
+ /* True if DECL is a function decl for which no out-of-line copy exists.
+    It is assumed that DECL's assembler name has been set.  */
+@@ -2146,6 +2160,8 @@
+     assemble_external_real (TREE_VALUE (list));
+   pending_assemble_externals = 0;
++  pending_assemble_externals_processed = true;
++  pointer_set_destroy (pending_assemble_externals_set);
+ #endif
+ }
+@@ -2186,7 +2202,13 @@
+     weak_decls = tree_cons (NULL, decl, weak_decls);
+ #ifdef ASM_OUTPUT_EXTERNAL
+-  if (value_member (decl, pending_assemble_externals) == NULL_TREE)
++  if (pending_assemble_externals_processed)
++    {
++      assemble_external_real (decl);
++      return;
++    }
++
++  if (! pointer_set_insert (pending_assemble_externals_set, decl))
+     pending_assemble_externals = tree_cons (NULL, decl,
+                                           pending_assemble_externals);
+ #endif
+@@ -3922,6 +3944,13 @@
+          tem = TREE_OPERAND (tem, 0))
+       ;
++      if (TREE_CODE (tem) == MEM_REF
++        && TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR)
++      {
++        reloc = compute_reloc_for_constant (TREE_OPERAND (tem, 0));
++        break;
++      }
++
+       if (TREE_PUBLIC (tem))
+       reloc |= 2;
+       else
+@@ -3990,6 +4019,9 @@
+       if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
+       output_constant_def (tem, 0);
++
++      if (TREE_CODE (tem) == MEM_REF)
++      output_addressed_constants (TREE_OPERAND (tem, 0));
+       break;
+     case PLUS_EXPR:
+@@ -6019,6 +6051,10 @@
+   if (readonly_data_section == NULL)
+     readonly_data_section = text_section;
++
++#ifdef ASM_OUTPUT_EXTERNAL
++  pending_assemble_externals_set = pointer_set_create ();
++#endif
+ }
+ enum tls_model
+Index: gcc/tree-vect-stmts.c
+===================================================================
+--- gcc/tree-vect-stmts.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/tree-vect-stmts.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -623,6 +623,46 @@
+ }
++/* Model cost for type demotion and promotion operations.  PWR is normally
++   zero for single-step promotions and demotions.  It will be one if 
++   two-step promotion/demotion is required, and so on.  Each additional
++   step doubles the number of instructions required.  */
++
++static void
++vect_model_promotion_demotion_cost (stmt_vec_info stmt_info,
++                                  enum vect_def_type *dt, int pwr)
++{
++  int i, tmp;
++  int inside_cost = 0, outside_cost = 0, single_stmt_cost;
++
++  /* The SLP costs were already calculated during SLP tree build.  */
++  if (PURE_SLP_STMT (stmt_info))
++    return;
++
++  single_stmt_cost = vect_get_stmt_cost (vec_promote_demote);
++  for (i = 0; i < pwr + 1; i++)
++    {
++      tmp = (STMT_VINFO_TYPE (stmt_info) == type_promotion_vec_info_type) ?
++      (i + 1) : i;
++      inside_cost += vect_pow2 (tmp) * single_stmt_cost;
++    }
++
++  /* FORNOW: Assuming maximum 2 args per stmts.  */
++  for (i = 0; i < 2; i++)
++    {
++      if (dt[i] == vect_constant_def || dt[i] == vect_external_def)
++        outside_cost += vect_get_stmt_cost (vector_stmt);
++    }
++
++  if (vect_print_dump_info (REPORT_COST))
++    fprintf (vect_dump, "vect_model_promotion_demotion_cost: inside_cost = %d, "
++             "outside_cost = %d .", inside_cost, outside_cost);
++
++  /* Set the costs in STMT_INFO.  */
++  stmt_vinfo_set_inside_of_loop_cost (stmt_info, NULL, inside_cost);
++  stmt_vinfo_set_outside_of_loop_cost (stmt_info, NULL, outside_cost);
++}
++
+ /* Function vect_cost_strided_group_size
+    For strided load or store, return the group_size only if it is the first
+@@ -691,7 +731,7 @@
+     {
+       /* Uses a high and low interleave operation for each needed permute.  */
+       inside_cost = ncopies * exact_log2(group_size) * group_size
+-        * vect_get_stmt_cost (vector_stmt);
++        * vect_get_stmt_cost (vec_perm);
+       if (vect_print_dump_info (REPORT_COST))
+         fprintf (vect_dump, "vect_model_store_cost: strided group_size = %d .",
+@@ -795,7 +835,7 @@
+     {
+       /* Uses an even and odd extract operations for each needed permute.  */
+       inside_cost = ncopies * exact_log2(group_size) * group_size
+-      * vect_get_stmt_cost (vector_stmt);
++      * vect_get_stmt_cost (vec_perm);
+       if (vect_print_dump_info (REPORT_COST))
+         fprintf (vect_dump, "vect_model_load_cost: strided group_size = %d .",
+@@ -855,7 +895,7 @@
+     case dr_explicit_realign:
+       {
+         *inside_cost += ncopies * (2 * vect_get_stmt_cost (vector_load)
+-           + vect_get_stmt_cost (vector_stmt));
++                                 + vect_get_stmt_cost (vec_perm));
+         /* FIXME: If the misalignment remains fixed across the iterations of
+            the containing loop, the following cost should be added to the
+@@ -863,6 +903,9 @@
+         if (targetm.vectorize.builtin_mask_for_load)
+           *inside_cost += vect_get_stmt_cost (vector_stmt);
++        if (vect_print_dump_info (REPORT_COST))
++          fprintf (vect_dump, "vect_model_load_cost: explicit realign");
++
+         break;
+       }
+     case dr_explicit_realign_optimized:
+@@ -886,7 +929,12 @@
+           }
+         *inside_cost += ncopies * (vect_get_stmt_cost (vector_load)
+-          + vect_get_stmt_cost (vector_stmt));
++                                 + vect_get_stmt_cost (vec_perm));
++
++        if (vect_print_dump_info (REPORT_COST))
++          fprintf (vect_dump,
++                 "vect_model_load_cost: explicit realign optimized");
++
+         break;
+       }
+@@ -2919,7 +2967,7 @@
+       STMT_VINFO_TYPE (stmt_info) = type_demotion_vec_info_type;
+       if (vect_print_dump_info (REPORT_DETAILS))
+         fprintf (vect_dump, "=== vectorizable_demotion ===");
+-      vect_model_simple_cost (stmt_info, ncopies, dt, NULL);
++      vect_model_promotion_demotion_cost (stmt_info, dt, multi_step_cvt);
+       return true;
+     }
+@@ -3217,7 +3265,7 @@
+       STMT_VINFO_TYPE (stmt_info) = type_promotion_vec_info_type;
+       if (vect_print_dump_info (REPORT_DETAILS))
+         fprintf (vect_dump, "=== vectorizable_promotion ===");
+-      vect_model_simple_cost (stmt_info, 2*ncopies, dt, NULL);
++      vect_model_promotion_demotion_cost (stmt_info, dt, multi_step_cvt);
+       return true;
+     }
+Index: gcc/tree-inline.c
+===================================================================
+--- gcc/tree-inline.c  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/tree-inline.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -4947,7 +4947,7 @@
+               if ((e = cgraph_edge (id->dst_node, gsi_stmt (bsi))) != NULL)
+                 {
+                   if (!e->inline_failed)
+-                    cgraph_remove_node_and_inline_clones (e->callee);
++                    cgraph_remove_node_and_inline_clones (e->callee, id->dst_node);
+                   else
+                     cgraph_remove_edge (e);
+                 }
+@@ -4957,8 +4957,8 @@
+                   {
+                     if ((e = cgraph_edge (node, gsi_stmt (bsi))) != NULL)
+                       {
+-                        if (!e->inline_failed)
+-                          cgraph_remove_node_and_inline_clones (e->callee);
++                        if (!e->inline_failed && e->callee != id->src_node)
++                          cgraph_remove_node_and_inline_clones (e->callee, id->dst_node);
+                         else
+                           cgraph_remove_edge (e);
+                       }
+Index: gcc/combine.c
+===================================================================
+--- gcc/combine.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/combine.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1788,6 +1788,10 @@
+   if (set == 0)
+     return 0;
++  /* The simplification in expand_field_assignment may call back to
++     get_last_value, so set safe guard here.  */
++  subst_low_luid = DF_INSN_LUID (insn);
++
+   set = expand_field_assignment (set);
+   src = SET_SRC (set), dest = SET_DEST (set);
+Index: gcc/df-problems.c
+===================================================================
+--- gcc/df-problems.c  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/df-problems.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -3956,6 +3956,19 @@
+   df_simulate_initialize_backwards (merge_bb, test_use);
+   for (insn = across_to; ; insn = next)
+     {
++      if (CALL_P (insn))
++      {
++        if (RTL_CONST_OR_PURE_CALL_P (insn))
++          /* Pure functions can read from memory.  Const functions can
++             read from arguments that the ABI has forced onto the stack.
++             Neither sort of read can be volatile.  */
++          memrefs_in_across |= MEMREF_NORMAL;
++        else
++          {
++            memrefs_in_across |= MEMREF_VOLATILE;
++            mem_sets_in_across |= MEMREF_VOLATILE;
++          }
++      }
+       if (NONDEBUG_INSN_P (insn))
+       {
+         df_simulate_find_defs (insn, test_set);
+Index: gcc/config.gcc
+===================================================================
+--- gcc/config.gcc     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config.gcc     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -817,7 +817,7 @@
+ arm*-*-linux*)                        # ARM GNU/Linux with ELF
+       tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
+       case $target in
+-      arm*b-*)
++      arm*b-*-linux*)
+               tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
+               ;;
+       esac
+@@ -925,7 +925,7 @@
+       extra_objs="avr-devices.o"
+       ;;
+ avr-*-*)
+-      tm_file="avr/avr.h dbxelf.h newlib-stdint.h"
++      tm_file="avr/avr.h dbxelf.h avr/avr-stdint.h"
+       use_gcc_stdint=wrap
+       extra_gcc_objs="driver-avr.o avr-devices.o"
+       extra_objs="avr-devices.o"
+Index: gcc/gimple.c
+===================================================================
+--- gcc/gimple.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/gimple.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2275,8 +2275,6 @@
+ bool
+ gimple_has_side_effects (const_gimple s)
+ {
+-  unsigned i;
+-
+   if (is_gimple_debug (s))
+     return false;
+@@ -2292,45 +2290,15 @@
+   if (is_gimple_call (s))
+     {
+-      unsigned nargs = gimple_call_num_args (s);
++      int flags = gimple_call_flags (s);
+-      if (!(gimple_call_flags (s) & (ECF_CONST | ECF_PURE)))
+-        return true;
+-      else if (gimple_call_flags (s) & ECF_LOOPING_CONST_OR_PURE)
+-      /* An infinite loop is considered a side effect.  */
++      /* An infinite loop is considered a side effect.  */
++      if (!(flags & (ECF_CONST | ECF_PURE))
++        || (flags & ECF_LOOPING_CONST_OR_PURE))
+       return true;
+-      if (gimple_call_lhs (s)
+-          && TREE_SIDE_EFFECTS (gimple_call_lhs (s)))
+-      {
+-        gcc_checking_assert (gimple_has_volatile_ops (s));
+-        return true;
+-      }
+-
+-      if (TREE_SIDE_EFFECTS (gimple_call_fn (s)))
+-        return true;
+-
+-      for (i = 0; i < nargs; i++)
+-        if (TREE_SIDE_EFFECTS (gimple_call_arg (s, i)))
+-        {
+-          gcc_checking_assert (gimple_has_volatile_ops (s));
+-          return true;
+-        }
+-
+       return false;
+     }
+-  else
+-    {
+-      for (i = 0; i < gimple_num_ops (s); i++)
+-      {
+-        tree op = gimple_op (s, i);
+-        if (op && TREE_SIDE_EFFECTS (op))
+-          {
+-            gcc_checking_assert (gimple_has_volatile_ops (s));
+-            return true;
+-          }
+-      }
+-    }
+   return false;
+ }
+Index: gcc/gthr-posix.h
+===================================================================
+--- gcc/gthr-posix.h   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/gthr-posix.h   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -239,16 +239,15 @@
+ static inline int
+ __gthread_active_p (void)
+ {
+-  static void *const __gthread_active_ptr
+-    = __extension__ (void *) &__gthrw_(
+ /* Android's C library does not provide pthread_cancel, check for
+    `pthread_create' instead.  */
+ #ifndef __BIONIC__
+-                                     pthread_cancel
++  static void *const __gthread_active_ptr
++    = __extension__ (void *) &__gthrw_(pthread_cancel);
+ #else
+-                                     pthread_create
++  static void *const __gthread_active_ptr
++    = __extension__ (void *) &__gthrw_(pthread_create);
+ #endif
+-                                     );
+   return __gthread_active_ptr != 0;
+ }
+Index: gcc/config/alpha/linux-unwind.h
+===================================================================
+--- gcc/config/alpha/linux-unwind.h    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/alpha/linux-unwind.h    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,5 @@
+ /* DWARF2 EH unwinding support for Alpha Linux.
+-   Copyright (C) 2004, 2005, 2009, 2011 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005, 2009, 2011, 2012 Free Software Foundation, Inc.
+ This file is part of GCC.
+@@ -49,7 +49,7 @@
+   else if (pc[1] == 0x201f015f)               /* lda $0,NR_rt_sigreturn */
+     {
+       struct rt_sigframe {
+-      struct siginfo info;
++      siginfo_t info;
+       struct ucontext uc;
+       } *rt_ = context->cfa;
+       sc = &rt_->uc.uc_mcontext;
+Index: gcc/config/alpha/alpha.c
+===================================================================
+--- gcc/config/alpha/alpha.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/alpha/alpha.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2469,7 +2469,7 @@
+     {
+     case EQ:  case LE:  case LT:  case LEU:  case LTU:
+     case UNORDERED:
+-      /* We have these compares: */
++      /* We have these compares.  */
+       cmp_code = code, branch_code = NE;
+       break;
+@@ -2706,13 +2706,15 @@
+       switch (code)
+       {
+       case EQ: case LE: case LT: case LEU: case LTU:
++      case UNORDERED:
+         /* We have these compares.  */
+         cmp_code = code, code = NE;
+         break;
+       case NE:
+-        /* This must be reversed.  */
+-        cmp_code = EQ, code = EQ;
++      case ORDERED:
++        /* These must be reversed.  */
++        cmp_code = reverse_condition (code), code = EQ;
+         break;
+       case GE: case GT: case GEU: case GTU:
+@@ -2732,6 +2734,14 @@
+         gcc_unreachable ();
+       }
++      if (cmp_mode == DImode)
++      {
++        if (!reg_or_0_operand (op0, DImode))
++          op0 = force_reg (DImode, op0);
++        if (!reg_or_8bit_operand (op1, DImode))
++          op1 = force_reg (DImode, op1);
++      }
++
+       tem = gen_reg_rtx (cmp_mode);
+       emit_insn (gen_rtx_SET (VOIDmode, tem,
+                             gen_rtx_fmt_ee (cmp_code, cmp_mode,
+@@ -2743,6 +2753,14 @@
+       local_fast_math = 1;
+     }
++  if (cmp_mode == DImode)
++    {
++      if (!reg_or_0_operand (op0, DImode))
++      op0 = force_reg (DImode, op0);
++      if (!reg_or_8bit_operand (op1, DImode))
++      op1 = force_reg (DImode, op1);
++    }
++
+   /* We may be able to use a conditional move directly.
+      This avoids emitting spurious compares.  */
+   if (signed_comparison_operator (cmp, VOIDmode)
+@@ -2761,11 +2779,13 @@
+   switch (code)
+     {
+     case EQ:  case LE:  case LT:  case LEU:  case LTU:
++    case UNORDERED:
+       /* We have these compares: */
+       break;
+     case NE:
+-      /* This must be reversed.  */
++    case ORDERED:
++      /* These must be reversed.  */
+       code = reverse_condition (code);
+       cmov_code = EQ;
+       break;
+Index: gcc/config/m32c/m32c.c
+===================================================================
+--- gcc/config/m32c/m32c.c     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/m32c/m32c.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -447,7 +447,7 @@
+     flag_ivopts = 0;
+   /* This target defaults to strict volatile bitfields.  */
+-  if (flag_strict_volatile_bitfields < 0)
++  if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))
+     flag_strict_volatile_bitfields = 1;
+   /* r8c/m16c have no 16-bit indirect call, so thunks are involved.
+Index: gcc/config/spu/spu.c
+===================================================================
+--- gcc/config/spu/spu.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/spu/spu.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -6794,6 +6794,7 @@
+       case scalar_to_vec:
+       case cond_branch_not_taken:
+       case vec_perm:
++      case vec_promote_demote:
+         return 1;
+       case scalar_store:
+Index: gcc/config/sparc/sparc.c
+===================================================================
+--- gcc/config/sparc/sparc.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/sparc/sparc.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -3658,13 +3658,17 @@
+ {
+   x = delegitimize_mem_from_attrs (x);
+-  if (GET_CODE (x) == LO_SUM
+-      && GET_CODE (XEXP (x, 1)) == UNSPEC
+-      && XINT (XEXP (x, 1), 1) == UNSPEC_TLSLE)
+-    {
+-      x = XVECEXP (XEXP (x, 1), 0, 0);
+-      gcc_assert (GET_CODE (x) == SYMBOL_REF);
+-    }
++  if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 1)) == UNSPEC)
++    switch (XINT (XEXP (x, 1), 1))
++      {
++      case UNSPEC_MOVE_PIC:
++      case UNSPEC_TLSLE:
++      x = XVECEXP (XEXP (x, 1), 0, 0);
++      gcc_assert (GET_CODE (x) == SYMBOL_REF);
++      break;
++      default:
++      break;
++      }
+   return x;
+ }
+@@ -9634,6 +9638,7 @@
+                                                      void_list_node));
+         DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
+                                          NULL_TREE, void_type_node);
++        TREE_PUBLIC (decl) = 1;
+         TREE_STATIC (decl) = 1;
+         make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
+         DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
+Index: gcc/config/rx/rx.c
+===================================================================
+--- gcc/config/rx/rx.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/rx/rx.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2348,7 +2348,7 @@
+ rx_option_override (void)
+ {
+   /* This target defaults to strict volatile bitfields.  */
+-  if (flag_strict_volatile_bitfields < 0)
++  if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))
+     flag_strict_volatile_bitfields = 1;
+   rx_override_options_after_change ();
+Index: gcc/config/i386/i386.h
+===================================================================
+--- gcc/config/i386/i386.h     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/i386/i386.h     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -424,7 +424,7 @@
+ /* Feature tests against the various architecture variations.  */
+ enum ix86_arch_indices {
+-  X86_ARCH_CMOVE,             /* || TARGET_SSE */
++  X86_ARCH_CMOV,
+   X86_ARCH_CMPXCHG,
+   X86_ARCH_CMPXCHG8B,
+   X86_ARCH_XADD,
+@@ -435,12 +435,17 @@
+ extern unsigned char ix86_arch_features[X86_ARCH_LAST];
+-#define TARGET_CMOVE          ix86_arch_features[X86_ARCH_CMOVE]
++#define TARGET_CMOV           ix86_arch_features[X86_ARCH_CMOV]
+ #define TARGET_CMPXCHG                ix86_arch_features[X86_ARCH_CMPXCHG]
+ #define TARGET_CMPXCHG8B      ix86_arch_features[X86_ARCH_CMPXCHG8B]
+ #define TARGET_XADD           ix86_arch_features[X86_ARCH_XADD]
+ #define TARGET_BSWAP          ix86_arch_features[X86_ARCH_BSWAP]
++/* For sane SSE instruction set generation we need fcomi instruction.
++   It is safe to enable all CMOVE instructions.  Also, RDRAND intrinsic
++   expands to a sequence that includes conditional move. */
++#define TARGET_CMOVE          (TARGET_CMOV || TARGET_SSE || TARGET_RDRND)
++
+ #define TARGET_FISTTP         (TARGET_SSE3 && TARGET_80387)
+ extern int x86_prefetch_sse;
+@@ -1668,6 +1673,17 @@
+ #define LEGITIMATE_CONSTANT_P(X)  legitimate_constant_p (X)
++/* Try a machine-dependent way of reloading an illegitimate address
++   operand.  If we find one, push the reload and jump to WIN.  This
++   macro is used in only one place: `find_reloads_address' in reload.c.  */
++
++#define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, INDL, WIN)    \
++do {                                                                  \
++  if (ix86_legitimize_reload_address ((X), (MODE), (OPNUM),           \
++                                    (int)(TYPE), (INDL)))             \
++    goto WIN;                                                         \
++} while (0)
++
+ /* If defined, a C expression to determine the base term of address X.
+    This macro is used in only one place: `find_base_term' in alias.c.
+Index: gcc/config/i386/i386.md
+===================================================================
+--- gcc/config/i386/i386.md    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/i386/i386.md    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -233,9 +233,6 @@
+   ;; For BMI support
+   UNSPEC_BEXTR
+-
+-  ;; For RDRAND support
+-  UNSPEC_RDRAND
+ ])
+ (define_c_enum "unspecv" [
+@@ -270,6 +267,9 @@
+   UNSPECV_WRFSBASE
+   UNSPECV_WRGSBASE
+   UNSPECV_SPLIT_STACK_RETURN
++
++  ;; For RDRAND support
++  UNSPECV_RDRAND
+ ])
+ ;; Constants to represent pcomtrue/pcomfalse variants
+@@ -16349,7 +16349,8 @@
+ (define_insn "*x86_mov<mode>cc_0_m1_neg"
+   [(set (match_operand:SWI48 0 "register_operand" "=r")
+       (neg:SWI48 (match_operator 1 "ix86_carry_flag_operator"
+-                  [(reg FLAGS_REG) (const_int 0)])))]
++                  [(reg FLAGS_REG) (const_int 0)])))
++   (clobber (reg:CC FLAGS_REG))]
+   ""
+   "sbb{<imodesuffix>}\t%0, %0"
+   [(set_attr "type" "alu")
+@@ -18357,9 +18358,9 @@
+ (define_insn "rdrand<mode>_1"
+   [(set (match_operand:SWI248 0 "register_operand" "=r")
+-      (unspec:SWI248 [(const_int 0)] UNSPEC_RDRAND))
++      (unspec_volatile:SWI248 [(const_int 0)] UNSPECV_RDRAND))
+    (set (reg:CCC FLAGS_REG)
+-      (unspec:CCC [(const_int 0)] UNSPEC_RDRAND))]
++      (unspec_volatile:CCC [(const_int 0)] UNSPECV_RDRAND))]
+   "TARGET_RDRND"
+   "rdrand\t%0"
+   [(set_attr "type" "other")
+Index: gcc/config/i386/sse.md
+===================================================================
+--- gcc/config/i386/sse.md     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/i386/sse.md     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -392,18 +392,7 @@
+   DONE;
+ })
+-(define_expand "avx_movu<ssemodesuffix><avxmodesuffix>"
+-  [(set (match_operand:AVXMODEF2P 0 "nonimmediate_operand" "")
+-      (unspec:AVXMODEF2P
+-        [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "")]
+-        UNSPEC_MOVU))]
+-  "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
+-{
+-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
+-    operands[1] = force_reg (<MODE>mode, operands[1]);
+-})
+-
+-(define_insn "*avx_movu<ssemodesuffix><avxmodesuffix>"
++(define_insn "avx_movu<ssemodesuffix><avxmodesuffix>"
+   [(set (match_operand:AVXMODEF2P 0 "nonimmediate_operand" "=x,m")
+       (unspec:AVXMODEF2P
+         [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm,x")]
+@@ -429,18 +418,7 @@
+    (set_attr "prefix" "maybe_vex")
+    (set_attr "mode" "TI")])
+-(define_expand "<sse>_movu<ssemodesuffix>"
+-  [(set (match_operand:SSEMODEF2P 0 "nonimmediate_operand" "")
+-      (unspec:SSEMODEF2P
+-        [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")]
+-        UNSPEC_MOVU))]
+-  "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
+-{
+-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
+-    operands[1] = force_reg (<MODE>mode, operands[1]);
+-})
+-
+-(define_insn "*<sse>_movu<ssemodesuffix>"
++(define_insn "<sse>_movu<ssemodesuffix>"
+   [(set (match_operand:SSEMODEF2P 0 "nonimmediate_operand" "=x,m")
+       (unspec:SSEMODEF2P
+         [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm,x")]
+@@ -452,18 +430,7 @@
+    (set_attr "movu" "1")
+    (set_attr "mode" "<MODE>")])
+-(define_expand "avx_movdqu<avxmodesuffix>"
+-  [(set (match_operand:AVXMODEQI 0 "nonimmediate_operand" "")
+-      (unspec:AVXMODEQI
+-        [(match_operand:AVXMODEQI 1 "nonimmediate_operand" "")]
+-        UNSPEC_MOVU))]
+-  "TARGET_AVX"
+-{
+-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
+-    operands[1] = force_reg (<MODE>mode, operands[1]);
+-})
+-
+-(define_insn "*avx_movdqu<avxmodesuffix>"
++(define_insn "avx_movdqu<avxmodesuffix>"
+   [(set (match_operand:AVXMODEQI 0 "nonimmediate_operand" "=x,m")
+       (unspec:AVXMODEQI
+         [(match_operand:AVXMODEQI 1 "nonimmediate_operand" "xm,x")]
+@@ -475,17 +442,7 @@
+    (set_attr "prefix" "vex")
+    (set_attr "mode" "<avxvecmode>")])
+-(define_expand "sse2_movdqu"
+-  [(set (match_operand:V16QI 0 "nonimmediate_operand" "")
+-      (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "")]
+-                    UNSPEC_MOVU))]
+-  "TARGET_SSE2"
+-{
+-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
+-    operands[1] = force_reg (V16QImode, operands[1]);
+-})
+-
+-(define_insn "*sse2_movdqu"
++(define_insn "sse2_movdqu"
+   [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
+       (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "xm,x")]
+                     UNSPEC_MOVU))]
+@@ -1324,15 +1281,15 @@
+               (parallel [(const_int 0)]))
+             (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
+           (plusminus:DF
+-            (vec_select:DF (match_dup 1) (parallel [(const_int 2)]))
+-            (vec_select:DF (match_dup 1) (parallel [(const_int 3)]))))
+-        (vec_concat:V2DF
+-          (plusminus:DF
+             (vec_select:DF
+               (match_operand:V4DF 2 "nonimmediate_operand" "xm")
+               (parallel [(const_int 0)]))
+-            (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))
++            (vec_select:DF (match_dup 2) (parallel [(const_int 1)]))))
++        (vec_concat:V2DF
+           (plusminus:DF
++            (vec_select:DF (match_dup 1) (parallel [(const_int 2)]))
++            (vec_select:DF (match_dup 1) (parallel [(const_int 3)])))
++          (plusminus:DF
+             (vec_select:DF (match_dup 2) (parallel [(const_int 2)]))
+             (vec_select:DF (match_dup 2) (parallel [(const_int 3)]))))))]
+   "TARGET_AVX"
+@@ -5058,7 +5015,7 @@
+         (vec_select:DF (match_dup 0) (parallel [(const_int 1)]))))]
+   "TARGET_SSE2 && reload_completed"
+   [(set (match_dup 0) (match_dup 1))]
+-  "operands[0] = adjust_address (operands[0], DFmode, 8);")
++  "operands[0] = adjust_address (operands[0], DFmode, 0);")
+ ;; Not sure these two are ever used, but it doesn't hurt to have
+ ;; them. -aoliva
+@@ -12095,7 +12052,7 @@
+         (unspec:V8SF [(match_operand:V8HI 1 "register_operand" "x")]
+                      UNSPEC_VCVTPH2PS)
+         (parallel [(const_int 0) (const_int 1)
+-                   (const_int 1) (const_int 2)])))]
++                   (const_int 2) (const_int 3)])))]
+   "TARGET_F16C"
+   "vcvtph2ps\t{%1, %0|%0, %1}"
+   [(set_attr "type" "ssecvt")
+Index: gcc/config/i386/linux-unwind.h
+===================================================================
+--- gcc/config/i386/linux-unwind.h     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/i386/linux-unwind.h     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,6 @@
+ /* DWARF2 EH unwinding support for AMD x86-64 and x86.
+-   Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005, 2006, 2009, 2010, 2012 Free Software Foundation,
++   Inc.
+ This file is part of GCC.
+@@ -133,9 +134,9 @@
+     {
+       struct rt_sigframe {
+       int sig;
+-      struct siginfo *pinfo;
++      siginfo_t *pinfo;
+       void *puc;
+-      struct siginfo info;
++      siginfo_t info;
+       struct ucontext uc;
+       } *rt_ = context->cfa;
+       /* The void * cast is necessary to avoid an aliasing warning.
+Index: gcc/config/i386/i386-protos.h
+===================================================================
+--- gcc/config/i386/i386-protos.h      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/i386/i386-protos.h      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -59,7 +59,8 @@
+ extern bool constant_address_p (rtx);
+ extern bool legitimate_pic_operand_p (rtx);
+ extern bool legitimate_pic_address_disp_p (rtx);
+-
++extern bool ix86_legitimize_reload_address (rtx, enum machine_mode,
++                                          int, int, int);
+ extern void print_reg (rtx, int, FILE*);
+ extern void ix86_print_operand (FILE *, rtx, int);
+Index: gcc/config/i386/driver-i386.c
+===================================================================
+--- gcc/config/i386/driver-i386.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/i386/driver-i386.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -397,6 +397,7 @@
+   unsigned int has_pclmul = 0, has_abm = 0, has_lwp = 0;
+   unsigned int has_fma = 0, has_fma4 = 0, has_xop = 0;
+   unsigned int has_bmi = 0, has_tbm = 0;
++  unsigned int has_rdrnd = 0, has_f16c = 0, has_fsgsbase = 0;
+   bool arch;
+@@ -444,6 +445,8 @@
+   has_aes = ecx & bit_AES;
+   has_pclmul = ecx & bit_PCLMUL;
+   has_fma = ecx & bit_FMA;
++  has_f16c = ecx & bit_F16C;
++  has_rdrnd = ecx & bit_RDRND;
+   has_cmpxchg8b = edx & bit_CMPXCHG8B;
+   has_cmov = edx & bit_CMOV;
+@@ -451,6 +454,13 @@
+   has_sse = edx & bit_SSE;
+   has_sse2 = edx & bit_SSE2;
++  if (max_level >= 7)
++    {
++      __cpuid_count (7, 0, eax, ebx, ecx, edx);
++
++      has_fsgsbase = ebx & bit_FSGSBASE;
++    }
++
+   /* Check cpuid level of extended features.  */
+   __cpuid (0x80000000, ext_level, ebx, ecx, edx);
+@@ -711,10 +721,13 @@
+       const char *avx = has_avx ? " -mavx" : " -mno-avx";
+       const char *sse4_2 = has_sse4_2 ? " -msse4.2" : " -mno-sse4.2";
+       const char *sse4_1 = has_sse4_1 ? " -msse4.1" : " -mno-sse4.1";
++      const char *rdrnd = has_rdrnd ? " -mrdrnd" : " -mno-rdrnd";
++      const char *f16c = has_f16c ? " -mf16c" : " -mno-f16c";
++      const char *fsgsbase = has_fsgsbase ? " -mfsgsbase" : " -mno-fsgsbase";
+       options = concat (options, cx16, sahf, movbe, ase, pclmul,
+                       popcnt, abm, lwp, fma, fma4, xop, bmi, tbm,
+-                      avx, sse4_2, sse4_1, NULL);
++                      avx, sse4_2, sse4_1, rdrnd, f16c, fsgsbase, NULL);
+     }
+ done:
+Index: gcc/config/i386/i386.c
+===================================================================
+--- gcc/config/i386/i386.c     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/i386/i386.c     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -46,6 +46,7 @@
+ #include "target.h"
+ #include "target-def.h"
+ #include "langhooks.h"
++#include "reload.h"
+ #include "cgraph.h"
+ #include "gimple.h"
+ #include "dwarf2.h"
+@@ -2094,7 +2095,7 @@
+ /* Feature tests against the various architecture variations, used to create
+    ix86_arch_features based on the processor mask.  */
+ static unsigned int initial_ix86_arch_features[X86_ARCH_LAST] = {
+-  /* X86_ARCH_CMOVE: Conditional move was added for pentiumpro.  */
++  /* X86_ARCH_CMOV: Conditional move was added for pentiumpro.  */
+   ~(m_386 | m_486 | m_PENT | m_K6),
+   /* X86_ARCH_CMPXCHG: Compare and exchange was added for 80486.  */
+@@ -3811,7 +3812,7 @@
+          -mtune (rather than -march) points us to a processor that has them.
+          However, the VIA C3 gives a SIGILL, so we only do that for i686 and
+          higher processors.  */
+-      if (TARGET_CMOVE
++      if (TARGET_CMOV
+           && (processor_alias_table[i].flags & (PTA_PREFETCH_SSE | PTA_SSE)))
+         x86_prefetch_sse = true;
+       break;
+@@ -4181,12 +4182,6 @@
+       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
+     }
+-  /* For sane SSE instruction set generation we need fcomi instruction.
+-     It is safe to enable all CMOVE instructions.  Also, RDRAND intrinsic
+-     expands to a sequence that includes conditional move. */
+-  if (TARGET_SSE || TARGET_RDRND)
+-    TARGET_CMOVE = 1;
+-
+   /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix.  */
+   {
+     char *p;
+@@ -12168,6 +12163,64 @@
+   return false;
+ }
++/* Our implementation of LEGITIMIZE_RELOAD_ADDRESS.  Returns a value to
++   replace the input X, or the original X if no replacement is called for.
++   The output parameter *WIN is 1 if the calling macro should goto WIN,
++   0 if it should not.  */
++
++bool
++ix86_legitimize_reload_address (rtx x,
++                              enum machine_mode mode ATTRIBUTE_UNUSED,
++                              int opnum, int type,
++                              int ind_levels ATTRIBUTE_UNUSED)
++{
++  /* Reload can generate:
++
++     (plus:DI (plus:DI (unspec:DI [(const_int 0 [0])] UNSPEC_TP)
++                     (reg:DI 97))
++            (reg:DI 2 cx))
++
++     This RTX is rejected from ix86_legitimate_address_p due to
++     non-strictness of base register 97.  Following this rejection, 
++     reload pushes all three components into separate registers,
++     creating invalid memory address RTX.
++
++     Following code reloads only the invalid part of the
++     memory address RTX.  */
++
++  if (GET_CODE (x) == PLUS
++      && REG_P (XEXP (x, 1))
++      && GET_CODE (XEXP (x, 0)) == PLUS
++      && REG_P (XEXP (XEXP (x, 0), 1)))
++    {
++      rtx base, index;
++      bool something_reloaded = false;
++
++      base = XEXP (XEXP (x, 0), 1);      
++      if (!REG_OK_FOR_BASE_STRICT_P (base))
++      {
++        push_reload (base, NULL_RTX, &XEXP (XEXP (x, 0), 1), NULL,
++                     BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
++                     opnum, (enum reload_type)type);
++        something_reloaded = true;
++      }
++
++      index = XEXP (x, 1);
++      if (!REG_OK_FOR_INDEX_STRICT_P (index))
++      {
++        push_reload (index, NULL_RTX, &XEXP (x, 1), NULL,
++                     INDEX_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
++                     opnum, (enum reload_type)type);
++        something_reloaded = true;
++      }
++
++      gcc_assert (something_reloaded);
++      return true;
++    }
++
++  return false;
++}
++
+ /* Recognizes RTL expressions that are valid memory addresses for an
+    instruction.  The MODE argument is the machine mode for the MEM
+    expression that wants to use this address.
+@@ -27177,8 +27230,8 @@
+       arg_adjust = 0;
+       if (optimize
+         || target == 0
+-        || GET_MODE (target) != tmode
+-        || !insn_p->operand[0].predicate (target, tmode))
++        || !register_operand (target, tmode)
++        || GET_MODE (target) != tmode)
+       target = gen_reg_rtx (tmode);
+     }
+@@ -31377,9 +31430,9 @@
+         tmp = gen_reg_rtx (GET_MODE_INNER (mode));
+         ix86_expand_vector_extract (true, tmp, target, 1 - elt);
+         if (elt == 0)
++          tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
++        else
+           tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
+-        else
+-          tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
+         emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
+         return;
+       }
+@@ -31393,9 +31446,9 @@
+       tmp = gen_reg_rtx (GET_MODE_INNER (mode));
+       ix86_expand_vector_extract (false, tmp, target, 1 - elt);
+       if (elt == 0)
++      tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
++      else
+       tmp = gen_rtx_VEC_CONCAT (mode, tmp, val);
+-      else
+-      tmp = gen_rtx_VEC_CONCAT (mode, val, tmp);
+       emit_insn (gen_rtx_SET (VOIDmode, target, tmp));
+       return;
+@@ -32823,7 +32876,8 @@
+         return ix86_cost->cond_not_taken_branch_cost;
+       case vec_perm:
+-        return 1;
++      case vec_promote_demote:
++        return ix86_cost->vec_stmt_cost;
+       default:
+         gcc_unreachable ();
+Index: gcc/config/sh/linux-unwind.h
+===================================================================
+--- gcc/config/sh/linux-unwind.h       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/sh/linux-unwind.h       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,6 @@
+ /* DWARF2 EH unwinding support for SH Linux.
+-   Copyright (C) 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005, 2006, 2007, 2009, 2012 Free Software Foundation,
++   Inc.
+ This file is part of GCC.
+@@ -80,9 +81,9 @@
+          && (*(unsigned long *) (pc+11)  == 0x6ff0fff0))
+     {
+       struct rt_sigframe {
+-      struct siginfo *pinfo;
++      siginfo_t *pinfo;
+       void *puc;
+-      struct siginfo info;
++      siginfo_t info;
+       struct ucontext uc;
+       } *rt_ = context->cfa;
+       /* The void * cast is necessary to avoid an aliasing warning.
+@@ -179,7 +180,7 @@
+               && (*(unsigned short *) (pc+14)  == 0x00ad))))
+     {
+       struct rt_sigframe {
+-      struct siginfo info;
++      siginfo_t info;
+       struct ucontext uc;
+       } *rt_ = context->cfa;
+       /* The void * cast is necessary to avoid an aliasing warning.
+Index: gcc/config/sh/sh.c
+===================================================================
+--- gcc/config/sh/sh.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/sh/sh.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -763,11 +763,6 @@
+   SUBTARGET_OVERRIDE_OPTIONS;
+   if (optimize > 1 && !optimize_size)
+     target_flags |= MASK_SAVE_ALL_TARGET_REGS;
+-  if (flag_finite_math_only == 2)
+-    flag_finite_math_only
+-      = !flag_signaling_nans && TARGET_SH2E && ! TARGET_IEEE;
+-  if (TARGET_SH2E && !flag_finite_math_only)
+-    target_flags |= MASK_IEEE;
+   sh_cpu = PROCESSOR_SH1;
+   assembler_dialect = 0;
+   if (TARGET_SH2)
+@@ -911,8 +906,6 @@
+     if (! VALID_REGISTER_P (ADDREGNAMES_REGNO (regno)))
+       sh_additional_register_names[regno][0] = '\0';
+-  flag_omit_frame_pointer = (PREFERRED_DEBUGGING_TYPE == DWARF2_DEBUG);
+-
+   if ((flag_pic && ! TARGET_PREFERGOT)
+       || (TARGET_SHMEDIA && !TARGET_PT_FIXED))
+     flag_no_function_cse = 1;
+@@ -944,22 +937,17 @@
+       flag_schedule_insns = 0;
+     }
+-    if ((target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS) == 0)
+-       target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
+-
+   /* Unwind info is not correct around the CFG unless either a frame 
+      pointer is present or M_A_O_A is set.  Fixing this requires rewriting 
+      unwind info generation to be aware of the CFG and propagating states 
+      around edges.  */
+   if ((flag_unwind_tables || flag_asynchronous_unwind_tables
+        || flag_exceptions || flag_non_call_exceptions)   
+-      && flag_omit_frame_pointer
+-      && !(target_flags & MASK_ACCUMULATE_OUTGOING_ARGS))
++      && flag_omit_frame_pointer && !TARGET_ACCUMULATE_OUTGOING_ARGS)
+     {
+-      if (target_flags_explicit & MASK_ACCUMULATE_OUTGOING_ARGS)
+       warning (0, "unwind tables currently require either a frame pointer "
+                "or -maccumulate-outgoing-args for correctness");
+-      target_flags |= MASK_ACCUMULATE_OUTGOING_ARGS;
++      TARGET_ACCUMULATE_OUTGOING_ARGS = 1;
+     }
+   /* Unwinding with -freorder-blocks-and-partition does not work on this
+@@ -1014,11 +1002,16 @@
+       align_functions = min_align;
+     }
++  /* If the -mieee option was not explicitly set by the user, turn it on
++     unless -ffinite-math-only was specified.  See also PR 33135.  */
++  if (! global_options_set.x_TARGET_IEEE)
++    TARGET_IEEE = ! flag_finite_math_only;
++
+   if (sh_fixed_range_str)
+     sh_fix_range (sh_fixed_range_str);
+   /* This target defaults to strict volatile bitfields.  */
+-  if (flag_strict_volatile_bitfields < 0)
++  if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))
+     flag_strict_volatile_bitfields = 1;
+ }
\f
+Index: gcc/config/sh/sh.opt
+===================================================================
+--- gcc/config/sh/sh.opt       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/sh/sh.opt       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -202,7 +202,7 @@
+ Generate FPU-less SHcompact code
+ maccumulate-outgoing-args
+-Target Report Mask(ACCUMULATE_OUTGOING_ARGS)
++Target Report Var(TARGET_ACCUMULATE_OUTGOING_ARGS) Init(1)
+ Reserve space for outgoing arguments in the function prologue
+ madjust-unroll
+@@ -270,8 +270,8 @@
+ Follow Renesas (formerly Hitachi) / SuperH calling conventions
+ mieee
+-Target Report Mask(IEEE)
+-Increase the IEEE compliance for floating-point code
++Target Var(TARGET_IEEE)
++Increase the IEEE compliance for floating-point comparisons
+ mindexed-addressing
+ Target Report Mask(ALLOW_INDEXED_ADDRESS) Condition(SUPPORT_ANY_SH5_32MEDIA)
+Index: gcc/config/avr/avr-stdint.h
+===================================================================
+--- gcc/config/avr/avr-stdint.h        (.../tags/gcc_4_6_3_release)    (revision 0)
++++ gcc/config/avr/avr-stdint.h        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,66 @@
++/* Definitions for <stdint.h> types on systems using newlib.
++   Copyright (C) 2012 Free Software Foundation, Inc.
++
++This file is part of GCC.
++
++GCC 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.
++
++GCC 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 GCC; see the file COPYING3.  If not see
++<http://www.gnu.org/licenses/>.  */
++
++/*
++   The intention of this file is to supply definitions that work with
++   avr-gcc's -mint8 that sets int to an 8-bit type.
++
++   This file is intended to yield the same results as newlib-stdint.h,
++   but there are some differences to newlib-stdint.h:
++
++   - AVR is an 8-bit architecture that cannot access 16-bit values
++     atomically, this SIG_ATOMIC_TYPE is "char".
++
++   - For the same reason, [u]int_fast8_t is defined as 8-bit type.
++
++*/
++   
++#define SIG_ATOMIC_TYPE "char"
++
++#define INT8_TYPE "signed char"
++#define INT16_TYPE (INT_TYPE_SIZE == 16 ? "short int" : "long int")
++#define INT32_TYPE (INT_TYPE_SIZE == 16 ? "long int" : "long long int")
++#define INT64_TYPE (INT_TYPE_SIZE == 16 ? "long long int" : 0)
++#define UINT8_TYPE "unsigned char"
++#define UINT16_TYPE (INT_TYPE_SIZE == 16 ? "short unsigned int" : "long unsigned int")
++#define UINT32_TYPE (INT_TYPE_SIZE == 16 ? "long unsigned int" : "long long unsigned int")
++#define UINT64_TYPE (INT_TYPE_SIZE == 16 ? "long long unsigned int" : 0)
++
++#define INT_LEAST8_TYPE INT8_TYPE
++#define INT_LEAST16_TYPE INT16_TYPE
++#define INT_LEAST32_TYPE INT32_TYPE
++#define INT_LEAST64_TYPE INT64_TYPE
++#define UINT_LEAST8_TYPE UINT8_TYPE
++#define UINT_LEAST16_TYPE UINT16_TYPE
++#define UINT_LEAST32_TYPE UINT32_TYPE
++#define UINT_LEAST64_TYPE UINT64_TYPE
++
++#define INT_FAST8_TYPE INT8_TYPE
++#define INT_FAST16_TYPE (INT_TYPE_SIZE == 16 ? "int" : INT16_TYPE)
++#define INT_FAST32_TYPE INT32_TYPE
++#define INT_FAST64_TYPE INT64_TYPE
++#define UINT_FAST8_TYPE UINT8_TYPE
++#define UINT_FAST16_TYPE (INT_TYPE_SIZE == 16 ? "unsigned int" : UINT16_TYPE)
++#define UINT_FAST32_TYPE UINT32_TYPE
++#define UINT_FAST64_TYPE UINT64_TYPE
++
++#define INTPTR_TYPE PTRDIFF_TYPE
++#ifndef UINTPTR_TYPE
++#define UINTPTR_TYPE SIZE_TYPE
++#endif
+Index: gcc/config/avr/libgcc.S
+===================================================================
+--- gcc/config/avr/libgcc.S    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/avr/libgcc.S    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -582,16 +582,7 @@
+       push r17
+       push r28
+       push r29
+-#if defined (__AVR_HAVE_8BIT_SP__)
+-;; FIXME: __AVR_HAVE_8BIT_SP__ is set on device level, not on core level
+-;;        so this lines are dead code.  To make it work, devices without
+-;;        SP_H must get their own multilib(s), see PR51345.
+       in      r28,__SP_L__
+-      sub     r28,r26
+-      clr     r29
+-      out     __SP_L__,r28
+-#else
+-      in      r28,__SP_L__
+       in      r29,__SP_H__
+       sub     r28,r26
+       sbc     r29,r27
+@@ -600,7 +591,6 @@
+       out     __SP_H__,r29
+       out     __SREG__,__tmp_reg__
+       out     __SP_L__,r28
+-#endif
+ #if defined (__AVR_HAVE_EIJMP_EICALL__)
+       eijmp
+ #else
+@@ -635,15 +625,6 @@
+       ldd     r16,Y+4
+       ldd     r17,Y+3
+       ldd     r26,Y+2
+-#if defined (__AVR_HAVE_8BIT_SP__)
+-;; FIXME: __AVR_HAVE_8BIT_SP__ is set on device level, not on core level
+-;;        so this lines are dead code.  To make it work, devices without
+-;;        SP_H must get their own multilib(s).
+-      ldd     r29,Y+1
+-      add     r28,r30
+-      out     __SP_L__,r28
+-      mov     r28, r26
+-#else
+       ldd     r27,Y+1
+       add     r28,r30
+       adc     r29,__zero_reg__
+@@ -654,7 +635,6 @@
+       out     __SP_L__,r28
+       mov_l   r28, r26
+       mov_h   r29, r27
+-#endif
+       ret
+ .endfunc
+ #endif /* defined (L_epilogue) */
+Index: gcc/config/avr/avr.md
+===================================================================
+--- gcc/config/avr/avr.md      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/avr/avr.md      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -299,7 +299,7 @@
+   [(set (match_operand:HI 0 "stack_register_operand" "=q")
+         (unspec_volatile:HI [(match_operand:HI 1 "register_operand"  "r")] 
+                           UNSPECV_WRITE_SP_IRQ_OFF))]
+-  "!AVR_HAVE_8BIT_SP"
++  ""
+   "out __SP_H__, %B1
+       out __SP_L__, %A1"
+   [(set_attr "length" "2")
+@@ -309,7 +309,7 @@
+   [(set (match_operand:HI 0 "stack_register_operand" "=q")
+         (unspec_volatile:HI [(match_operand:HI 1 "register_operand"  "r")] 
+                           UNSPECV_WRITE_SP_IRQ_ON))]
+-  "!AVR_HAVE_8BIT_SP"
++  ""
+   "cli
+         out __SP_H__, %B1
+       sei
+Index: gcc/config/avr/avr.c
+===================================================================
+--- gcc/config/avr/avr.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/avr/avr.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1879,12 +1879,9 @@
+           }
+         else if (test_hard_reg_class (STACK_REG, src))
+           {
+-              *l = 2;
+-              return AVR_HAVE_8BIT_SP
+-                ? (AS2 (in,%A0,__SP_L__) CR_TAB
+-                   AS1 (clr,%B0))
+-                : (AS2 (in,%A0,__SP_L__) CR_TAB
+-                   AS2 (in,%B0,__SP_H__));
++            *l = 2;   
++            return (AS2 (in,%A0,__SP_L__) CR_TAB
++                    AS2 (in,%B0,__SP_H__));
+           }
+         if (AVR_HAVE_MOVW)
+@@ -5177,10 +5174,9 @@
+   default_file_start ();
+-  fputs ("__SREG__ = 0x3f\n", asm_out_file);
+-  if (!AVR_HAVE_8BIT_SP)
+-    fputs ("__SP_H__ = 0x3e\n", asm_out_file);
+-  fputs ("__SP_L__ = 0x3d\n", asm_out_file);
++  fputs ("__SREG__ = 0x3f\n"
++       "__SP_H__ = 0x3e\n"
++       "__SP_L__ = 0x3d\n", asm_out_file);
+   
+   fputs ("__tmp_reg__ = 0\n" 
+          "__zero_reg__ = 1\n", asm_out_file);
+Index: gcc/config/xtensa/linux-unwind.h
+===================================================================
+--- gcc/config/xtensa/linux-unwind.h   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/xtensa/linux-unwind.h   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,5 @@
+ /* DWARF2 EH unwinding support for Xtensa.
+-   Copyright (C) 2008, 2009 Free Software Foundation, Inc.
++   Copyright (C) 2008, 2009, 2012 Free Software Foundation, Inc.
+ This file is part of GCC.
+@@ -62,7 +62,7 @@
+   struct sigcontext *sc;
+   struct rt_sigframe {
+-    struct siginfo info;
++    siginfo_t info;
+     struct ucontext uc;
+   } *rt_;
+Index: gcc/config/host-linux.c
+===================================================================
+--- gcc/config/host-linux.c    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/host-linux.c    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -84,6 +84,8 @@
+ # define TRY_EMPTY_VM_SPACE   0x60000000
+ #elif defined(__mc68000__)
+ # define TRY_EMPTY_VM_SPACE   0x40000000
++#elif defined(__ARM_EABI__)
++# define TRY_EMPTY_VM_SPACE     0x60000000
+ #else
+ # define TRY_EMPTY_VM_SPACE   0
+ #endif
+Index: gcc/config/mn10300/mn10300.c
+===================================================================
+--- gcc/config/mn10300/mn10300.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/mn10300/mn10300.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2505,12 +2505,15 @@
+    may access it using GOTOFF instead of GOT.  */
+ static void
+-mn10300_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
++mn10300_encode_section_info (tree decl, rtx rtl, int first)
+ {
+   rtx symbol;
++  default_encode_section_info (decl, rtl, first);
++
+   if (! MEM_P (rtl))
+     return;
++
+   symbol = XEXP (rtl, 0);
+   if (GET_CODE (symbol) != SYMBOL_REF)
+     return;
+Index: gcc/config/ia64/linux-unwind.h
+===================================================================
+--- gcc/config/ia64/linux-unwind.h     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/ia64/linux-unwind.h     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,5 @@
+ /* DWARF2 EH unwinding support for IA64 Linux.
+-   Copyright (C) 2004, 2005, 2009 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005, 2009, 2012 Free Software Foundation, Inc.
+    This file is part of GCC.
+@@ -47,7 +47,7 @@
+       struct sigframe {
+       char scratch[16];
+       unsigned long sig_number;
+-      struct siginfo *info;
++      siginfo_t *info;
+       struct sigcontext *sc;
+       } *frame_ = (struct sigframe *)context->psp;
+       struct sigcontext *sc = frame_->sc;
+@@ -137,7 +137,7 @@
+       struct sigframe {
+       char scratch[16];
+       unsigned long sig_number;
+-      struct siginfo *info;
++      siginfo_t *info;
+       struct sigcontext *sc;
+       } *frame = (struct sigframe *)context->psp;
+       struct sigcontext *sc = frame->sc;
+Index: gcc/config/rs6000/vector.md
+===================================================================
+--- gcc/config/rs6000/vector.md        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/rs6000/vector.md        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -448,6 +448,94 @@
+   "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
+   "")
++(define_insn_and_split "*vector_uneq<mode>"
++  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
++      (uneq:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
++                  (match_operand:VEC_F 2 "vfloat_operand" "")))]
++  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
++  "#"
++  ""
++  [(set (match_dup 3)
++      (gt:VEC_F (match_dup 1)
++                (match_dup 2)))
++   (set (match_dup 4)
++      (gt:VEC_F (match_dup 2)
++                (match_dup 1)))
++   (set (match_dup 0)
++      (not:VEC_F (ior:VEC_F (match_dup 3)
++                            (match_dup 4))))]
++  "
++{
++  operands[3] = gen_reg_rtx (<MODE>mode);
++  operands[4] = gen_reg_rtx (<MODE>mode);
++}")
++
++(define_insn_and_split "*vector_ltgt<mode>"
++  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
++      (ltgt:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
++                  (match_operand:VEC_F 2 "vfloat_operand" "")))]
++  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
++  "#"
++  ""
++  [(set (match_dup 3)
++      (gt:VEC_F (match_dup 1)
++                (match_dup 2)))
++   (set (match_dup 4)
++      (gt:VEC_F (match_dup 2)
++                (match_dup 1)))
++   (set (match_dup 0)
++      (ior:VEC_F (match_dup 3)
++                 (match_dup 4)))]
++  "
++{
++  operands[3] = gen_reg_rtx (<MODE>mode);
++  operands[4] = gen_reg_rtx (<MODE>mode);
++}")
++
++(define_insn_and_split "*vector_ordered<mode>"
++  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
++      (ordered:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
++                     (match_operand:VEC_F 2 "vfloat_operand" "")))]
++  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
++  "#"
++  ""
++  [(set (match_dup 3)
++      (ge:VEC_F (match_dup 1)
++                (match_dup 2)))
++   (set (match_dup 4)
++      (ge:VEC_F (match_dup 2)
++                (match_dup 1)))
++   (set (match_dup 0)
++      (ior:VEC_F (match_dup 3)
++                 (match_dup 4)))]
++  "
++{
++  operands[3] = gen_reg_rtx (<MODE>mode);
++  operands[4] = gen_reg_rtx (<MODE>mode);
++}")
++
++(define_insn_and_split "*vector_unordered<mode>"
++  [(set (match_operand:VEC_F 0 "vfloat_operand" "")
++      (unordered:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")
++                       (match_operand:VEC_F 2 "vfloat_operand" "")))]
++  "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)"
++  "#"
++  ""
++  [(set (match_dup 3)
++      (ge:VEC_F (match_dup 1)
++                (match_dup 2)))
++   (set (match_dup 4)
++      (ge:VEC_F (match_dup 2)
++                (match_dup 1)))
++   (set (match_dup 0)
++      (not:VEC_F (ior:VEC_F (match_dup 3)
++                            (match_dup 4))))]
++  "
++{
++  operands[3] = gen_reg_rtx (<MODE>mode);
++  operands[4] = gen_reg_rtx (<MODE>mode);
++}")
++
+ ;; Note the arguments for __builtin_altivec_vsel are op2, op1, mask
+ ;; which is in the reverse order that we want
+ (define_expand "vector_select_<mode>"
+Index: gcc/config/rs6000/rs6000.c
+===================================================================
+--- gcc/config/rs6000/rs6000.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/rs6000/rs6000.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -3695,12 +3695,23 @@
+       case vec_to_scalar:
+       case scalar_to_vec:
+       case cond_branch_not_taken:
+-      case vec_perm:
+         return 1;
+       case cond_branch_taken:
+         return 3;
++      case vec_perm:
++      if (TARGET_VSX)
++        return 4;
++      else
++        return 1;
++
++      case vec_promote_demote:
++      if (TARGET_VSX)
++        return 5;
++      else
++        return 1;
++
+       case unaligned_load:
+         if (TARGET_VSX && TARGET_ALLOW_MOVMISALIGN)
+           {
+@@ -15811,7 +15822,6 @@
+ print_operand (FILE *file, rtx x, int code)
+ {
+   int i;
+-  HOST_WIDE_INT val;
+   unsigned HOST_WIDE_INT uval;
+   switch (code)
+@@ -16252,34 +16262,17 @@
+     case 'W':
+       /* MB value for a PowerPC64 rldic operand.  */
+-      val = (GET_CODE (x) == CONST_INT
+-           ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
++      i = clz_hwi (GET_CODE (x) == CONST_INT
++                 ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
+-      if (val < 0)
+-      i = -1;
+-      else
+-      for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
+-        if ((val <<= 1) < 0)
+-          break;
+-
+ #if HOST_BITS_PER_WIDE_INT == 32
+-      if (GET_CODE (x) == CONST_INT && i >= 0)
++      if (GET_CODE (x) == CONST_INT && i > 0)
+       i += 32;  /* zero-extend high-part was all 0's */
+       else if (GET_CODE (x) == CONST_DOUBLE && i == 32)
+-      {
+-        val = CONST_DOUBLE_LOW (x);
+-
+-        gcc_assert (val);
+-        if (val < 0)
+-          --i;
+-        else
+-          for ( ; i < 64; i++)
+-            if ((val <<= 1) < 0)
+-              break;
+-      }
++      i = clz_hwi (CONST_DOUBLE_LOW (x)) + 32;
+ #endif
+-      fprintf (file, "%d", i + 1);
++      fprintf (file, "%d", i);
+       return;
+     case 'x':
+@@ -17229,6 +17222,10 @@
+     case EQ:
+     case GT:
+     case GTU:
++    case ORDERED:
++    case UNORDERED:
++    case UNEQ:
++    case LTGT:
+       mask = gen_reg_rtx (mode);
+       emit_insn (gen_rtx_SET (VOIDmode,
+                             mask,
+Index: gcc/config/rs6000/vsx.md
+===================================================================
+--- gcc/config/rs6000/vsx.md   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/rs6000/vsx.md   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1006,9 +1006,9 @@
+   "VECTOR_MEM_VSX_P (<MODE>mode)"
+ {
+   if (INTVAL (operands[3]) == 0)
+-    return \"xxpermdi %x0,%x1,%x2,1\";
++    return \"xxpermdi %x0,%x2,%x1,1\";
+   else if (INTVAL (operands[3]) == 1)
+-    return \"xxpermdi %x0,%x2,%x1,0\";
++    return \"xxpermdi %x0,%x1,%x2,0\";
+   else
+     gcc_unreachable ();
+ }
+Index: gcc/config/rs6000/rs6000.h
+===================================================================
+--- gcc/config/rs6000/rs6000.h (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/rs6000/rs6000.h (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -469,10 +469,11 @@
+ /* ISA 2.01 allowed FCFID to be done in 32-bit, previously it was 64-bit only.
+    Enable 32-bit fcfid's on any of the switches for newer ISA machines or
+    XILINX.  */
+-#define TARGET_FCFID  (TARGET_POWERPC64 \
+-                       || TARGET_POPCNTB      /* ISA 2.02 */ \
+-                       || TARGET_CMPB         /* ISA 2.05 */ \
+-                       || TARGET_POPCNTD      /* ISA 2.06 */ \
++#define TARGET_FCFID  (TARGET_POWERPC64                               \
++                       || TARGET_PPC_GPOPT    /* 970/power4 */        \
++                       || TARGET_POPCNTB      /* ISA 2.02 */          \
++                       || TARGET_CMPB         /* ISA 2.05 */          \
++                       || TARGET_POPCNTD      /* ISA 2.06 */          \
+                        || TARGET_XILINX_FPU)
+ #define TARGET_FCTIDZ TARGET_FCFID
+Index: gcc/config/rs6000/altivec.md
+===================================================================
+--- gcc/config/rs6000/altivec.md       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/rs6000/altivec.md       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2394,8 +2394,8 @@
+ (define_insn "altivec_stvlx"
+   [(parallel
+-    [(set (match_operand:V4SI 0 "memory_operand" "=Z")
+-        (match_operand:V4SI 1 "register_operand" "v"))
++    [(set (match_operand:V16QI 0 "memory_operand" "=Z")
++        (match_operand:V16QI 1 "register_operand" "v"))
+      (unspec [(const_int 0)] UNSPEC_STVLX)])]
+   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
+   "stvlx %1,%y0"
+@@ -2403,8 +2403,8 @@
+ (define_insn "altivec_stvlxl"
+   [(parallel
+-    [(set (match_operand:V4SI 0 "memory_operand" "=Z")
+-        (match_operand:V4SI 1 "register_operand" "v"))
++    [(set (match_operand:V16QI 0 "memory_operand" "=Z")
++        (match_operand:V16QI 1 "register_operand" "v"))
+      (unspec [(const_int 0)] UNSPEC_STVLXL)])]
+   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
+   "stvlxl %1,%y0"
+@@ -2412,8 +2412,8 @@
+ (define_insn "altivec_stvrx"
+   [(parallel
+-    [(set (match_operand:V4SI 0 "memory_operand" "=Z")
+-        (match_operand:V4SI 1 "register_operand" "v"))
++    [(set (match_operand:V16QI 0 "memory_operand" "=Z")
++        (match_operand:V16QI 1 "register_operand" "v"))
+      (unspec [(const_int 0)] UNSPEC_STVRX)])]
+   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
+   "stvrx %1,%y0"
+@@ -2421,8 +2421,8 @@
+ (define_insn "altivec_stvrxl"
+   [(parallel
+-    [(set (match_operand:V4SI 0 "memory_operand" "=Z")
+-        (match_operand:V4SI 1 "register_operand" "v"))
++    [(set (match_operand:V16QI 0 "memory_operand" "=Z")
++        (match_operand:V16QI 1 "register_operand" "v"))
+      (unspec [(const_int 0)] UNSPEC_STVRXL)])]
+   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
+   "stvrxl %1,%y0"
+Index: gcc/config/rs6000/rs6000.md
+===================================================================
+--- gcc/config/rs6000/rs6000.md        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/rs6000/rs6000.md        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2524,8 +2524,19 @@
+   if (GET_CODE (addr1) == PLUS)
+     {
+       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
+-      addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
++      if (TARGET_AVOID_XFORM)
++      {
++        emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
++        addr2 = op2;
++      }
++      else
++      addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
+     }
++  else if (TARGET_AVOID_XFORM)
++    {
++      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
++      addr2 = op2;
++    }
+   else
+     {
+       emit_move_insn (op2, GEN_INT (4));
+@@ -2574,8 +2585,19 @@
+   if (GET_CODE (addr1) == PLUS)
+     {
+       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
+-      addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
++      if (TARGET_AVOID_XFORM)
++      {
++        emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
++        addr2 = op2;
++      }
++      else
++      addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
+     }
++  else if (TARGET_AVOID_XFORM)
++    {
++      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
++      addr2 = op2;
++    }
+   else
+     {
+       emit_move_insn (op2, GEN_INT (4));
+@@ -2655,8 +2677,19 @@
+   if (GET_CODE (addr1) == PLUS)
+     {
+       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
+-      addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
++      if (TARGET_AVOID_XFORM)
++      {
++        emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
++        addr2 = op2;
++      }
++      else
++      addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
+     }
++  else if (TARGET_AVOID_XFORM)
++    {
++      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
++      addr2 = op2;
++    }
+   else
+     {
+       emit_move_insn (op2, GEN_INT (4));
+@@ -2700,8 +2733,19 @@
+   if (GET_CODE (addr1) == PLUS)
+     {
+       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
+-      addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
++      if (TARGET_AVOID_XFORM)
++      {
++        emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
++        addr2 = op2;
++      }
++      else
++      addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
+     }
++  else if (TARGET_AVOID_XFORM)
++    {
++      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
++      addr2 = op2;
++    }
+   else
+     {
+       emit_move_insn (op2, GEN_INT (4));
+
+Property changes on: gcc/config/rs6000/rs6000.md
+___________________________________________________________________
+Added: svn:mergeinfo
+   Merged /trunk/gcc/config/rs6000/rs6000.md:r187119
+Index: gcc/config/arm/arm.c
+===================================================================
+--- gcc/config/arm/arm.c       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/arm/arm.c       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -2005,7 +2005,8 @@
+                          global_options_set.x_param_values);
+   /* ARM EABI defaults to strict volatile bitfields.  */
+-  if (TARGET_AAPCS_BASED && flag_strict_volatile_bitfields < 0)
++  if (TARGET_AAPCS_BASED && flag_strict_volatile_bitfields < 0
++      && abi_version_at_least(2))
+     flag_strict_volatile_bitfields = 1;
+   /* Enable sw prefetching at -O3 for CPUS that have prefetch, and we have deemed
+@@ -23422,8 +23423,11 @@
+       }
+     }
++  /* Note: label is before barrier so that in cmp failure case we still get
++     a barrier to stop subsequent loads floating upwards past the ldrex
++     PR target/48126.  */
++  arm_output_asm_insn (emit, 1, operands, "%sLSYB%%=:", LOCAL_LABEL_PREFIX);
+   arm_process_output_memory_barrier (emit, NULL);
+-  arm_output_asm_insn (emit, 1, operands, "%sLSYB%%=:", LOCAL_LABEL_PREFIX);
+ }
+ static rtx
+Index: gcc/config/arm/arm.h
+===================================================================
+--- gcc/config/arm/arm.h       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/arm/arm.h       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -294,7 +294,8 @@
+ #define TARGET_HAVE_DMB               (arm_arch7)
+ /* Nonzero if this chip implements a memory barrier via CP15.  */
+-#define TARGET_HAVE_DMB_MCR   (arm_arch6k && ! TARGET_HAVE_DMB)
++#define TARGET_HAVE_DMB_MCR   (arm_arch6 && ! TARGET_HAVE_DMB \
++                               && ! TARGET_THUMB1)
+ /* Nonzero if this chip implements a memory barrier instruction.  */
+ #define TARGET_HAVE_MEMORY_BARRIER (TARGET_HAVE_DMB || TARGET_HAVE_DMB_MCR)
+Index: gcc/config/pa/predicates.md
+===================================================================
+--- gcc/config/pa/predicates.md        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/pa/predicates.md        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -421,9 +421,9 @@
+   (ior (match_operand 0 "register_operand")
+        (match_operand 0 "cint_ior_operand")))
+-;; True iff OP is a CONST_INT of the forms 0...0xxxx or
+-;; 0...01...1xxxx. Such values can be the left hand side x in (x <<
+-;; r), using the zvdepi instruction.
++;; True iff OP is a CONST_INT of the forms 0...0xxxx, 0...01...1xxxx,
++;; or 1...1xxxx. Such values can be the left hand side x in (x << r),
++;; using the zvdepi instruction.
+ (define_predicate "lhs_lshift_cint_operand"
+   (match_code "const_int")
+Index: gcc/config/pa/linux-unwind.h
+===================================================================
+--- gcc/config/pa/linux-unwind.h       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/pa/linux-unwind.h       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,5 @@
+ /* DWARF2 EH unwinding support for PA Linux.
+-   Copyright (C) 2004, 2005, 2009 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005, 2009, 2012 Free Software Foundation, Inc.
+ This file is part of GCC.
+@@ -63,7 +63,7 @@
+   int i;
+   struct sigcontext *sc;
+   struct rt_sigframe {
+-    struct siginfo info;
++    siginfo_t info;
+     struct ucontext uc;
+   } *frame;
+Index: gcc/config/pa/pa.md
+===================================================================
+--- gcc/config/pa/pa.md        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/pa/pa.md        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -6348,7 +6348,7 @@
+   ""
+   "*
+ {
+-  int x = INTVAL (operands[1]);
++  unsigned HOST_WIDE_INT x = UINTVAL (operands[1]);
+   operands[2] = GEN_INT (4 + exact_log2 ((x >> 4) + 1));
+   operands[1] = GEN_INT ((x & 0xf) - 0x10);
+   return \"{zvdepi %1,%2,%0|depwi,z %1,%%sar,%2,%0}\";
+@@ -6366,7 +6366,7 @@
+   "exact_log2 (INTVAL (operands[1]) + 1) > 0"
+   "*
+ {
+-  int x = INTVAL (operands[1]);
++  HOST_WIDE_INT x = INTVAL (operands[1]);
+   operands[2] = GEN_INT (exact_log2 (x + 1));
+   return \"{vdepi -1,%2,%0|depwi -1,%%sar,%2,%0}\";
+ }"
+@@ -6383,7 +6383,7 @@
+   "INTVAL (operands[1]) == -2"
+   "*
+ {
+-  int x = INTVAL (operands[1]);
++  HOST_WIDE_INT x = INTVAL (operands[1]);
+   operands[2] = GEN_INT (exact_log2 ((~x) + 1));
+   return \"{vdepi 0,%2,%0|depwi 0,%%sar,%2,%0}\";
+ }"
+@@ -6447,7 +6447,7 @@
+   "TARGET_64BIT"
+   "*
+ {
+-  int x = INTVAL (operands[1]);
++  unsigned HOST_WIDE_INT x = UINTVAL (operands[1]);
+   operands[2] = GEN_INT (4 + exact_log2 ((x >> 4) + 1));
+   operands[1] = GEN_INT ((x & 0x1f) - 0x20);
+   return \"depdi,z %1,%%sar,%2,%0\";
+@@ -6465,7 +6465,7 @@
+   "TARGET_64BIT && exact_log2 (INTVAL (operands[1]) + 1) > 0"
+   "*
+ {
+-  int x = INTVAL (operands[1]);
++  HOST_WIDE_INT x = INTVAL (operands[1]);
+   operands[2] = GEN_INT (exact_log2 (x + 1));
+   return \"depdi -1,%%sar,%2,%0\";
+ }"
+@@ -6482,7 +6482,7 @@
+   "TARGET_64BIT && INTVAL (operands[1]) == -2"
+   "*
+ {
+-  int x = INTVAL (operands[1]);
++  HOST_WIDE_INT x = INTVAL (operands[1]);
+   operands[2] = GEN_INT (exact_log2 ((~x) + 1));
+   return \"depdi 0,%%sar,%2,%0\";
+ }"
+@@ -6671,6 +6671,20 @@
\f
+ ;; Unconditional and other jump instructions.
++;; Trivial return used when no epilogue is needed.
++(define_insn "return"
++  [(return)
++   (use (reg:SI 2))]
++  "pa_can_use_return_insn ()"
++  "*
++{
++  if (TARGET_PA_20)
++    return \"bve%* (%%r2)\";
++  return \"bv%* %%r0(%%r2)\";
++}"
++  [(set_attr "type" "branch")
++   (set_attr "length" "4")])
++
+ ;; This is used for most returns.
+ (define_insn "return_internal"
+   [(return)
+@@ -6719,11 +6733,8 @@
+   rtx x;
+   /* Try to use the trivial return first.  Else use the full epilogue.  */
+-  if (reload_completed
+-      && !frame_pointer_needed
+-      && !df_regs_ever_live_p (2)
+-      && (compute_frame_size (get_frame_size (), 0) ? 0 : 1))
+-    x = gen_return_internal ();
++  if (pa_can_use_return_insn ())
++    x = gen_return ();
+   else
+     {
+       hppa_expand_epilogue ();
+Index: gcc/config/pa/pa-protos.h
+===================================================================
+--- gcc/config/pa/pa-protos.h  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/pa/pa-protos.h  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -136,6 +136,7 @@
+ extern int cint_ok_for_move (HOST_WIDE_INT);
+ extern void hppa_expand_prologue (void);
+ extern void hppa_expand_epilogue (void);
++extern bool pa_can_use_return_insn (void);
+ extern int ior_mask_p (unsigned HOST_WIDE_INT);
+ extern void compute_zdepdi_operands (unsigned HOST_WIDE_INT,
+                                    unsigned *);
+Index: gcc/config/pa/pa.c
+===================================================================
+--- gcc/config/pa/pa.c (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/pa/pa.c (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -185,6 +185,7 @@
+ static void pa_conditional_register_usage (void);
+ static enum machine_mode pa_c_mode_for_suffix (char);
+ static section *pa_function_section (tree, enum node_frequency, bool, bool);
++static unsigned int pa_section_type_flags (tree, const char *, int);
+ /* The following extra sections are only used for SOM.  */
+ static GTY(()) section *som_readonly_data_section;
+@@ -400,6 +401,9 @@
+ #undef TARGET_ASM_FUNCTION_SECTION
+ #define TARGET_ASM_FUNCTION_SECTION pa_function_section
++#undef TARGET_SECTION_TYPE_FLAGS
++#define TARGET_SECTION_TYPE_FLAGS pa_section_type_flags
++
+ struct gcc_target targetm = TARGET_INITIALIZER;
\f
+ /* Parse the -mfixed-range= option string.  */
+@@ -4442,6 +4446,24 @@
+     }
+ }
++bool
++pa_can_use_return_insn (void)
++{
++  if (!reload_completed)
++    return false;
++
++  if (frame_pointer_needed)
++    return false;
++
++  if (df_regs_ever_live_p (2))
++    return false;
++
++  if (crtl->profile)
++    return false;
++
++  return compute_frame_size (get_frame_size (), 0) == 0;
++}
++
+ rtx
+ hppa_pic_save_rtx (void)
+ {
+@@ -4586,7 +4608,7 @@
+   rtx saved_rp;
+   rtx ins;
+-  /* Instruction stream at the normal return address for the export stub:
++  /* The instruction stream at the return address of a PA1.X export stub is:
+       0x4bc23fd1 | stub+8:   ldw -18(sr0,sp),rp
+       0x004010a1 | stub+12:  ldsid (sr0,rp),r1
+@@ -4594,11 +4616,17 @@
+       0xe0400002 | stub+20:  be,n 0(sr0,rp)
+      0xe0400002 must be specified as -532676606 so that it won't be
+-     rejected as an invalid immediate operand on 64-bit hosts.  */
++     rejected as an invalid immediate operand on 64-bit hosts.
+-  HOST_WIDE_INT insns[4] = {0x4bc23fd1, 0x004010a1, 0x00011820, -532676606};
+-  int i;
++     The instruction stream at the return address of a PA2.0 export stub is:
++      0x4bc23fd1 | stub+8:   ldw -18(sr0,sp),rp
++      0xe840d002 | stub+12:  bve,n (rp)
++  */
++
++  HOST_WIDE_INT insns[4];
++  int i, len;
++
+   if (count != 0)
+     return NULL_RTX;
+@@ -4620,11 +4648,26 @@
+   ins = copy_to_reg (gen_rtx_AND (Pmode, rp, MASK_RETURN_ADDR));
+   label = gen_label_rtx ();
++  if (TARGET_PA_20)
++    {
++      insns[0] = 0x4bc23fd1;
++      insns[1] = -398405630;
++      len = 2;
++    }
++  else
++    {
++      insns[0] = 0x4bc23fd1;
++      insns[1] = 0x004010a1;
++      insns[2] = 0x00011820;
++      insns[3] = -532676606;
++      len = 4;
++    }
++
+   /* Check the instruction stream at the normal return address for the
+      export stub.  If it is an export stub, than our return address is
+      really in -24[frameaddr].  */
+-  for (i = 0; i < 3; i++)
++  for (i = 0; i < len; i++)
+     {
+       rtx op0 = gen_rtx_MEM (SImode, plus_constant (ins, i * 4)); 
+       rtx op1 = GEN_INT (insns[i]);
+@@ -7501,7 +7544,7 @@
+     return 24;
+   else
+     {
+-      if (!TARGET_LONG_CALLS && distance < 240000)
++      if (!TARGET_LONG_CALLS && distance < MAX_PCREL17F_OFFSET)
+       return 8;
+       if (TARGET_LONG_ABS_CALL && !flag_pic)
+@@ -7714,7 +7757,7 @@
+   /* pc-relative branch.  */
+   if (!TARGET_LONG_CALLS
+       && ((TARGET_PA_20 && !sibcall && distance < 7600000)
+-        || distance < 240000))
++        || distance < MAX_PCREL17F_OFFSET))
+     length += 8;
+   /* 64-bit plabel sequence.  */
+@@ -8073,7 +8116,7 @@
+   if (TARGET_FAST_INDIRECT_CALLS
+       || (!TARGET_PORTABLE_RUNTIME
+         && ((TARGET_PA_20 && !TARGET_SOM && distance < 7600000)
+-            || distance < 240000)))
++            || distance < MAX_PCREL17F_OFFSET)))
+     return 8;
+   if (flag_pic)
+@@ -10392,4 +10435,23 @@
+   return default_function_section (decl, freq, startup, exit);
+ }
++/* Implement TARGET_SECTION_TYPE_FLAGS.  */
++
++static unsigned int
++pa_section_type_flags (tree decl, const char *name, int reloc)
++{
++  unsigned int flags;
++
++  flags = default_section_type_flags (decl, name, reloc);
++
++  /* Function labels are placed in the constant pool.  This can
++     cause a section conflict if decls are put in ".data.rel.ro"
++     or ".data.rel.ro.local" using the __attribute__ construct.  */
++  if (strcmp (name, ".data.rel.ro") == 0
++      || strcmp (name, ".data.rel.ro.local") == 0)
++    flags |= SECTION_WRITE | SECTION_RELRO;
++
++  return flags;
++}
++
+ #include "gt-pa.h"
+Index: gcc/config/pa/pa.h
+===================================================================
+--- gcc/config/pa/pa.h (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/pa/pa.h (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1563,3 +1563,12 @@
+ #undef TARGET_HAVE_TLS
+ #define TARGET_HAVE_TLS true
+ #endif
++
++/* The maximum offset in bytes for a PA 1.X pc-relative call to the
++   head of the preceding stub table.  The selected offsets have been
++   chosen so that approximately one call stub is allocated for every
++   86.7 instructions.  A long branch stub is two instructions when
++   not generating PIC code.  For HP-UX and ELF targets, PIC stubs are
++   seven and four instructions, respectively.  */  
++#define MAX_PCREL17F_OFFSET \
++  (flag_pic ? (TARGET_HPUX ? 198164 : 221312) : 240000)
+Index: gcc/config/mips/linux-unwind.h
+===================================================================
+--- gcc/config/mips/linux-unwind.h     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/mips/linux-unwind.h     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,6 @@
+ /* DWARF2 EH unwinding support for MIPS Linux.
+-   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2012 Free Software
++   Foundation, Inc.
+ This file is part of GCC.
+@@ -75,7 +76,7 @@
+       struct rt_sigframe {
+       u_int32_t ass[4];  /* Argument save space for o32.  */
+       u_int32_t trampoline[2];
+-      struct siginfo info;
++      siginfo_t info;
+       _sig_ucontext_t uc;
+       } *rt_ = context->cfa;
+       sc = &rt_->uc.uc_mcontext;
+Index: gcc/config/h8300/h8300.c
+===================================================================
+--- gcc/config/h8300/h8300.c   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/h8300/h8300.c   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -416,7 +416,7 @@
+     }
+   /* This target defaults to strict volatile bitfields.  */
+-  if (flag_strict_volatile_bitfields < 0)
++  if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))
+     flag_strict_volatile_bitfields = 1;
+ }
+Index: gcc/config/bfin/linux-unwind.h
+===================================================================
+--- gcc/config/bfin/linux-unwind.h     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/config/bfin/linux-unwind.h     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,5 @@
+ /* DWARF2 EH unwinding support for Blackfin.
+-   Copyright (C) 2007, 2009 Free Software Foundation, Inc.
++   Copyright (C) 2007, 2009, 2012 Free Software Foundation, Inc.
+ This file is part of GCC.
+@@ -48,10 +48,10 @@
+     {
+       struct rt_sigframe {
+       int sig;
+-      struct siginfo *pinfo;
++      siginfo_t *pinfo;
+       void *puc;
+       char retcode[8];
+-      struct siginfo info;
++      siginfo_t info;
+       struct ucontext uc;
+       } *rt_ = context->cfa;
+Index: gcc/convert.c
+===================================================================
+--- gcc/convert.c      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ gcc/convert.c      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -44,11 +44,6 @@
+   if (TREE_TYPE (expr) == type)
+     return expr;
+-  /* Propagate overflow to the NULL pointer.  */
+-  if (integer_zerop (expr))
+-    return force_fit_type_double (type, double_int_zero, 0,
+-                                TREE_OVERFLOW (expr));
+-
+   switch (TREE_CODE (TREE_TYPE (expr)))
+     {
+     case POINTER_TYPE:
+Index: libstdc++-v3/configure
+===================================================================
+--- libstdc++-v3/configure     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/configure     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -19477,7 +19477,85 @@
++# For copy-assignable gthreads types
++
++
++  ac_ext=cpp
++ac_cpp='$CXXCPP $CPPFLAGS'
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
++
++  ac_save_CXXFLAGS="$CXXFLAGS"
++  CXXFLAGS="$CXXFLAGS -std=c++0x -I${toplevel_srcdir}/gcc"
++
++  target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
++  case $target_thread_file in
++    posix)
++      CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
++  esac
++
++  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gthreads types are copy-assignable in C++11 mode" >&5
++$as_echo_n "checking whether gthreads types are copy-assignable in C++11 mode... " >&6; }
++
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++#include "gthr.h"
++int
++main ()
++{
++
++      #ifdef __GTHREAD_MUTEX_INIT
++      __gthread_mutex_t m1;
++      __gthread_mutex_t m2 = __GTHREAD_MUTEX_INIT;
++      m1 = m2;
++      #endif
++      #ifdef __GTHREAD_RECURSIVE_MUTEX_INIT
++      __gthread_recursive_mutex_t r1;
++      __gthread_recursive_mutex_t r2 = __GTHREAD_RECURSIVE_MUTEX_INIT;
++      r1 = r2;
++      #endif
++      #ifdef __GTHREAD_HAS_COND
++      #ifdef __GTHREAD_COND_INIT
++      __gthread_cond_t c1;
++      __gthread_cond_t c2 = __GTHREAD_COND_INIT;
++      c1 = c2;
++      #endif
++      #endif
++
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_cxx_try_compile "$LINENO"; then :
++  ac_gthread_cxx11_copy_assign=1
++else
++  ac_gthread_cxx11_copy_assign=0
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++
++  if test $ac_gthread_cxx11_copy_assign = 1 ; then res_gthr_copy_assign=yes ;
++  else res_gthr_copy_assign=no ; fi
++  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res_gthr_copy_assign" >&5
++$as_echo "$res_gthr_copy_assign" >&6; }
++
++  if test x"$res_gthr_copy_assign" = x"no"; then
++
++$as_echo "#define _GLIBCXX_GTHREADS_NO_COPY_ASSIGN_IN_CXX11 1" >>confdefs.h
++
++  fi
++
++  CXXFLAGS="$ac_save_CXXFLAGS"
++  ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++
++
+   ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
+ if test "x$ac_cv_header_locale_h" = x""yes; then :
+Index: libstdc++-v3/src/condition_variable.cc
+===================================================================
+--- libstdc++-v3/src/condition_variable.cc     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/src/condition_variable.cc     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,6 +1,6 @@
+ // condition_variable -*- C++ -*-
+-// Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
++// Copyright (C) 2008, 2009, 2010, 2012 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
+@@ -34,7 +34,12 @@
+   {
+ #ifdef __GTHREAD_COND_INIT
+     __native_type __tmp = __GTHREAD_COND_INIT;
++#if defined __GXX_EXPERIMENTAL_CXX0X__ \
++  && defined _GLIBCXX_GTHREADS_NO_COPY_ASSIGN_IN_CXX11
++    __builtin_memcpy(&_M_cond, &__tmp, sizeof(_M_cond));
++#else
+     _M_cond = __tmp;
++#endif
+ #else
+     int __e = __gthread_cond_init(&_M_cond, 0);
+Index: libstdc++-v3/configure.ac
+===================================================================
+--- libstdc++-v3/configure.ac  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/configure.ac  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -164,6 +164,9 @@
+ # For gthread support
+ GLIBCXX_CHECK_GTHREADS
++# For copy-assignable gthreads types
++GLIBCXX_GTHREADS_CXX11_COPY_ASSIGN
++
+ AC_LC_MESSAGES
+ # Check for available headers.
+Index: libstdc++-v3/include/debug/safe_iterator.h
+===================================================================
+--- libstdc++-v3/include/debug/safe_iterator.h (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/include/debug/safe_iterator.h (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,6 +1,6 @@
+ // Safe iterator implementation  -*- C++ -*-
+-// Copyright (C) 2003, 2004, 2005, 2006, 2009, 2010, 2011
++// Copyright (C) 2003, 2004, 2005, 2006, 2009, 2010, 2011, 2012
+ // Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+@@ -142,7 +142,25 @@
+                             ._M_iterator(__x, "other"));
+       }
++#ifdef __GXX_EXPERIMENTAL_CXX0X__
+       /**
++       * @brief Move construction.
++       * @post __x is singular and unattached
++       */
++      _Safe_iterator(_Safe_iterator&& __x) : _M_current()
++      {
++      _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
++                            || __x._M_current == _Iterator(),
++                            _M_message(__msg_init_copy_singular)
++                            ._M_iterator(*this, "this")
++                            ._M_iterator(__x, "other"));
++      std::swap(_M_current, __x._M_current);
++      this->_M_attach(__x._M_sequence);
++      __x._M_detach();
++      }
++#endif
++
++      /**
+        *  @brief Converting constructor from a mutable iterator to a
+        *  constant iterator.
+       */
+@@ -181,7 +199,28 @@
+       return *this;
+       }
++#ifdef __GXX_EXPERIMENTAL_CXX0X__
+       /**
++       * @brief Move assignment.
++       * @post __x is singular and unattached
++       */
++      _Safe_iterator&
++      operator=(_Safe_iterator&& __x)
++      {
++      _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
++                            || __x._M_current == _Iterator(),
++                            _M_message(__msg_copy_singular)
++                            ._M_iterator(*this, "this")
++                            ._M_iterator(__x, "other"));
++      _M_current = __x._M_current;
++      _M_attach(__x._M_sequence);
++      __x._M_detach();
++      __x._M_current = _Iterator();
++      return *this;
++      }
++#endif
++
++      /**
+        *  @brief Iterator dereference.
+        *  @pre iterator is dereferenceable
+        */
+@@ -415,7 +454,9 @@
+       /// Is this iterator equal to the sequence's before_begin() iterator if
+       /// any?
+       bool _M_is_before_begin() const
+-      { return _BeforeBeginHelper<_Sequence>::_M_Is(base(), _M_get_sequence()); }
++      {
++      return _BeforeBeginHelper<_Sequence>::_M_Is(base(), _M_get_sequence());
++      }
+     };
+   template<typename _IteratorL, typename _IteratorR, typename _Sequence>
+Index: libstdc++-v3/include/std/condition_variable
+===================================================================
+--- libstdc++-v3/include/std/condition_variable        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/include/std/condition_variable        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,6 +1,6 @@
+ // <condition_variable> -*- C++ -*-
+-// Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
++// Copyright (C) 2008, 2009, 2010, 2011, 2012 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
+@@ -171,6 +171,26 @@
+     condition_variable                        _M_cond;
+     mutex                             _M_mutex;
++    // scoped unlock - unlocks in ctor, re-locks in dtor
++    template<typename _Lock>
++      struct _Unlock
++      {
++      explicit _Unlock(_Lock& __lk) : _M_lock(__lk) { __lk.unlock(); }
++
++      ~_Unlock() noexcept(false)
++      {
++        if (uncaught_exception())
++          __try { _M_lock.lock(); } __catch(...) { }
++        else
++          _M_lock.lock();
++      }
++
++      _Unlock(const _Unlock&) = delete;
++      _Unlock& operator=(const _Unlock&) = delete;
++
++      _Lock& _M_lock;
++      };
++
+   public:
+     typedef condition_variable::native_handle_type    native_handle_type;
+@@ -198,21 +218,8 @@
+       void
+       wait(_Lock& __lock)
+       {
+-      // scoped unlock - unlocks in ctor, re-locks in dtor
+-      struct _Unlock {
+-        explicit _Unlock(_Lock& __lk) : _M_lock(__lk) { __lk.unlock(); }
+-        ~_Unlock() noexcept(false)
+-        {
+-          if (uncaught_exception())
+-            __try { _M_lock.lock(); } __catch(...) { }
+-          else
+-            _M_lock.lock();
+-        }
+-        _Lock& _M_lock;
+-      };
+-
+       unique_lock<mutex> __my_lock(_M_mutex);
+-      _Unlock __unlock(__lock);
++      _Unlock<_Lock> __unlock(__lock);
+       // _M_mutex must be unlocked before re-locking __lock so move
+       // ownership of _M_mutex lock to an object with shorter lifetime.
+       unique_lock<mutex> __my_lock2(std::move(__my_lock));
+@@ -233,11 +240,12 @@
+       wait_until(_Lock& __lock,
+                const chrono::time_point<_Clock, _Duration>& __atime)
+       {
+-        unique_lock<mutex> __my_lock(_M_mutex);
+-        __lock.unlock();
+-        cv_status __status = _M_cond.wait_until(__my_lock, __atime);
+-        __lock.lock();
+-        return __status;
++      unique_lock<mutex> __my_lock(_M_mutex);
++      _Unlock<_Lock> __unlock(__lock);
++      // _M_mutex must be unlocked before re-locking __lock so move
++      // ownership of _M_mutex lock to an object with shorter lifetime.
++      unique_lock<mutex> __my_lock2(std::move(__my_lock));
++      return _M_cond.wait_until(__my_lock2, __atime);
+       }
+     template<typename _Lock, typename _Clock,
+Index: libstdc++-v3/include/std/mutex
+===================================================================
+--- libstdc++-v3/include/std/mutex     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/include/std/mutex     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -130,7 +130,7 @@
+   public:
+     // matches a gthr-win32.h recursive mutex
+     template<typename _Rm>
+-      static typename enable_if<sizeof(&_Rm::sema), void>::type
++      static typename enable_if<(bool)sizeof(&_Rm::sema), void>::type
+       _S_destroy(_Rm* __mx)
+       {
+         __gthread_mutex_t __tmp;
+@@ -139,7 +139,7 @@
+     // matches a recursive mutex with a member 'actual'
+     template<typename _Rm>
+-      static typename enable_if<sizeof(&_Rm::actual), void>::type
++      static typename enable_if<(bool)sizeof(&_Rm::actual), void>::type
+       _S_destroy(_Rm* __mx)
+       { __gthread_mutex_destroy(&__mx->actual); }
+Index: libstdc++-v3/include/ext/concurrence.h
+===================================================================
+--- libstdc++-v3/include/ext/concurrence.h     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/include/ext/concurrence.h     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,6 +1,6 @@
+ // Support for concurrent programing -*- C++ -*-
+-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
++// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
+ // Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+@@ -140,6 +140,18 @@
+   }
+ #endif
+  
++  template<typename _Tp>
++    static inline void
++    __copy_gthr_type(_Tp& __to, const _Tp& __from)
++    {
++#if defined __GXX_EXPERIMENTAL_CXX0X__ \
++  && defined _GLIBCXX_GTHREADS_NO_COPY_ASSIGN_IN_CXX11
++      __builtin_memcpy(&__to, &__from, sizeof(__to));
++#else
++      __to = __from;
++#endif
++    }
++
+   class __mutex 
+   {
+   private:
+@@ -156,7 +168,7 @@
+       {
+ #if defined __GTHREAD_MUTEX_INIT
+         __gthread_mutex_t __tmp = __GTHREAD_MUTEX_INIT;
+-        _M_mutex = __tmp;
++        __copy_gthr_type(_M_mutex, __tmp);
+ #else
+         __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex); 
+ #endif
+@@ -214,7 +226,7 @@
+       {
+ #if defined __GTHREAD_RECURSIVE_MUTEX_INIT
+         __gthread_recursive_mutex_t __tmp = __GTHREAD_RECURSIVE_MUTEX_INIT;
+-        _M_mutex = __tmp;
++        __copy_gthr_type(_M_mutex, __tmp);
+ #else
+         __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION(&_M_mutex); 
+ #endif
+@@ -270,7 +282,7 @@
+     // matches a gthr-win32.h recursive mutex
+     template<typename _Rm>
+-      static typename __enable_if<sizeof(&_Rm::sema), void>::__type
++      static typename __enable_if<(bool)sizeof(&_Rm::sema), void>::__type
+       _S_destroy(_Rm* __mx)
+       {
+         __gthread_mutex_t __tmp;
+@@ -279,7 +291,7 @@
+     // matches a recursive mutex with a member 'actual'
+     template<typename _Rm>
+-      static typename __enable_if<sizeof(&_Rm::actual), void>::__type
++      static typename __enable_if<(bool)sizeof(&_Rm::actual), void>::__type
+       _S_destroy(_Rm* __mx)
+       { __gthread_mutex_destroy(&__mx->actual); }
+@@ -332,7 +344,7 @@
+       {
+ #if defined __GTHREAD_COND_INIT
+         __gthread_cond_t __tmp = __GTHREAD_COND_INIT;
+-        _M_cond = __tmp;
++        __copy_gthr_type(_M_cond, __tmp);
+ #else
+         __GTHREAD_COND_INIT_FUNCTION(&_M_cond);
+ #endif
+Index: libstdc++-v3/include/ext/rope
+===================================================================
+--- libstdc++-v3/include/ext/rope      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/include/ext/rope      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,7 +1,7 @@
+ // SGI's rope class -*- C++ -*-
+-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+-// Free Software Foundation, Inc.
++// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
++// 2012 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
+@@ -445,6 +445,17 @@
+     identity_element(_Rope_Concat_fn<_CharT, _Alloc>)
+     { return rope<_CharT, _Alloc>(); }
++  static inline void
++  __copy_gthr_mutex(__gthread_mutex_t& __to, const __gthread_mutex_t& __from)
++  {
++#if defined __GXX_EXPERIMENTAL_CXX0X__ \
++  && defined _GLIBCXX_GTHREADS_NO_COPY_ASSIGN_IN_CXX11
++    __builtin_memcpy(&__to, &__from, sizeof(__to));
++#else
++    __to = __from;
++#endif
++  }
++
+   // Class _Refcount_Base provides a type, _RC_t, a data member,
+   // _M_ref_count, and member functions _M_incr and _M_decr, which perform
+   // atomic preincrement/predecrement.  The constructor initializes
+@@ -464,7 +475,7 @@
+     {
+ #ifdef __GTHREAD_MUTEX_INIT
+       __gthread_mutex_t __tmp = __GTHREAD_MUTEX_INIT;
+-      _M_ref_count_lock = __tmp;
++      __copy_gthr_mutex(_M_ref_count_lock, __tmp);
+ #elif defined(__GTHREAD_MUTEX_INIT_FUNCTION)
+       __GTHREAD_MUTEX_INIT_FUNCTION (&_M_ref_count_lock);
+ #else
+@@ -605,7 +616,7 @@
+     {
+       // Do not copy a POSIX/gthr mutex once in use.  However, bits are bits.
+       __gthread_mutex_t __tmp = __GTHREAD_MUTEX_INIT;
+-      _M_c_string_lock = __tmp;
++      __copy_gthr_mutex(_M_c_string_lock, __tmp);
+     }
+ #else
+     { __GTHREAD_MUTEX_INIT_FUNCTION (&_M_c_string_lock); }
+Index: libstdc++-v3/include/bits/stl_algo.h
+===================================================================
+--- libstdc++-v3/include/bits/stl_algo.h       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/include/bits/stl_algo.h       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1811,7 +1811,8 @@
+         for (; __first != __last; ++__first)
+           if (__pred(*__first))
+             {
+-              *__result1 = _GLIBCXX_MOVE(*__first);
++              if (__result1 != __first)
++                *__result1 = _GLIBCXX_MOVE(*__first);
+               ++__result1;
+             }
+           else
+Index: libstdc++-v3/ChangeLog
+===================================================================
+--- libstdc++-v3/ChangeLog     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/ChangeLog     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,65 @@
++2012-07-22  Jonathan Wakely  <jwakely.gcc@gmail.com>
++
++      PR libstdc++/53270
++      * acinclude.m4 (GLIBCXX_GTHREADS_CXX11_COPY_ASSIGN): Define.
++      * configure.ac (GLIBCXX_GTHREADS_CXX11_COPY_ASSIGN): Use it.
++      * config.h.in: Regenerate.
++      * configure: Likewise.
++      * include/ext/concurrence.h (__copy_gthr_type): Define.
++      (__mutex::__mutex, __recursive_mutex::__recursive_mutex,
++      __cond::__cond): Use it.
++      * include/ext/rope (__copy_gthr_mutex): Define.
++      (_Refcount_Base::_Refcount_Base, _Rope_RopeRep::_Rope_RopeRep): Use
++      it.
++      * src/condition_variable.cc (condition_variable::condition_variable):
++      Use memcpy instead of assignment.
++
++2012-07-07  Jonathan Wakely  <jwakely.gcc@gmail.com>
++
++      PR libstdc++/53578
++      * include/ext/concurrence.h (__recursive_mutex::_S_destroy): Fix
++      narrowing conversion.
++      * include/std/mutex (__recursive_mutex_base::_S_destroy): Likewise.
++
++2012-07-05  Jonathan Wakely  <jwakely.gcc@gmail.com>
++
++      PR libstdc++/53830
++      * include/std/condition_variable (condition_variable_any::wait):
++      Move _Unlock type to class scope.
++      (condition_variable_any::wait_until): Reuse it.
++      * testsuite/30_threads/condition_variable_any/53830.cc: New.
++
++2012-06-20  Jörg Sonnenberger <joerg@britannica.bec.de>
++          Jonathan Wakely  <jwakely.gcc@gmail.com>
++
++      PR libstdc++/53678
++      * config/os/bsd/netbsd/ctype_base.h: Check for _CTYPE_U.
++      * testsuite/22_locale/ctype_base/53678.cc: New.
++
++2012-04-12   Jeffrey Yasskin  <jyasskin@google.com>
++
++      PR libstdc++/52822
++      * include/bits/stl_algo.h (__stable_partition_adaptive): Avoid
++      move-assigning an object to itself by explicitly testing for
++      identity.
++      * testsuite/25_algorithms/stable_partition/pr52822.cc: Test
++      vectors, which have a destructive self-move-assignment.
++      * testsuite/25_algorithms/stable_partition/moveable.cc (test02):
++      Test with rvalstruct, which explicitly checks
++      self-move-assignment.
++
++2012-04-09  Terry Guo  <terry.guo@arm.com>
++
++      * testsuite/Makefile.am (TEST_GCC_EXEC_PREFIX): New.
++      * testsuite/Makefile.in: Regenerated.
++
++2012-03-08  Jonathan Wakely  <jwakely.gcc@gmail.com>
++
++      PR libstdc++/52433
++      * include/debug/safe_iterator.h (_Safe_iterator): Add move
++      constructor and move assignment operator.
++      * testsuite/23_containers/vector/debug/52433.cc: New.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: libstdc++-v3/testsuite/25_algorithms/stable_partition/pr52822.cc
+===================================================================
+--- libstdc++-v3/testsuite/25_algorithms/stable_partition/pr52822.cc   (.../tags/gcc_4_6_3_release)    (revision 0)
++++ libstdc++-v3/testsuite/25_algorithms/stable_partition/pr52822.cc   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,43 @@
++// { dg-options "-std=gnu++0x" }
++
++// Copyright (C) 2012 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 Pred 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/>.
++
++// 25.2.12 [lib.alg.partitions] Partitions.
++
++#include <algorithm>
++#include <vector>
++#include <testsuite_hooks.h>
++
++bool true_vector_pred(const std::vector<int>&) { return true; }
++
++void
++test01()
++{
++  std::vector<std::vector<int> > v(1);
++  v[0].push_back(7);
++  VERIFY( v[0].size() == 1 );
++  std::stable_partition(v.begin(), v.end(), &true_vector_pred);
++  VERIFY( v[0].size() == 1 );
++}
++
++int
++main()
++{
++  test01();
++  return 0;
++}
+Index: libstdc++-v3/testsuite/25_algorithms/stable_partition/moveable.cc
+===================================================================
+--- libstdc++-v3/testsuite/25_algorithms/stable_partition/moveable.cc  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/testsuite/25_algorithms/stable_partition/moveable.cc  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,6 +1,6 @@
+ // { dg-options "-std=gnu++0x" }
+-// Copyright (C) 2009, 2010 Free Software Foundation, Inc.
++// Copyright (C) 2009, 2010, 2012 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
+@@ -39,6 +39,11 @@
+ const int B[] = {2, 4, 6, 8, 10, 12, 14, 16, 1, 3, 5, 7, 9, 11, 13, 15, 17};
+ const int N = sizeof(A) / sizeof(int);
++// Check that starting with a true predicate works too. (PR52822)
++const int A2[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
++const int B2[] = {2, 4, 6, 8, 10, 12, 14, 16, 3, 5, 7, 9, 11, 13, 15, 17};
++const int N2 = sizeof(A2) / sizeof(int);
++
+ struct Pred
+ {
+   bool
+@@ -46,7 +51,7 @@
+   { return (x.val % 2) == 0; }
+ };
+-// 25.2.12 stable_partition()
++// 25.2.12 stable_partition(), starting with a false predicate.
+ void
+ test01()
+ {
+@@ -60,9 +65,24 @@
+   VERIFY( std::equal(s1, s1 + N, B) );
+ }
++// 25.2.12 stable_partition(), starting with a true predicate.
++void
++test02()
++{
++  bool test __attribute__((unused)) = true;
++
++  rvalstruct s1[N2];
++  std::copy(A2, A2 + N2, s1);
++  Container con(s1, s1 + N2);
++
++  std::stable_partition(con.begin(), con.end(), Pred());
++  VERIFY( std::equal(s1, s1 + N2, B2) );
++}
++
+ int
+ main()
+ {
+   test01();
++  test02();
+   return 0;
+ }
+Index: libstdc++-v3/testsuite/Makefile.in
+===================================================================
+--- libstdc++-v3/testsuite/Makefile.in (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/testsuite/Makefile.in (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -502,6 +502,7 @@
+       @echo 'set target_triplet $(target_triplet)' >>site.tmp
+       @echo 'set libiconv "$(LIBICONV)"' >>site.tmp
+       @echo 'set baseline_dir "$(baseline_dir)"' >> site.tmp
++      @echo 'set TEST_GCC_EXEC_PREFIX "$(libdir)/gcc/"' >> site.tmp
+       @echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
+       @test ! -f site.exp || \
+         sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
+Index: libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc
+===================================================================
+--- libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc  (.../tags/gcc_4_6_3_release)    (revision 0)
++++ libstdc++-v3/testsuite/30_threads/condition_variable_any/53830.cc  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,68 @@
++// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } }
++// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* powerpc-ibm-aix* } }
++// { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } }
++// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } }
++// { dg-require-cstdint "" }
++// { dg-require-gthreads "" }
++// { dg-require-sched-yield "" }
++// { dg-require-nanosleep "" }
++
++// Copyright (C) 2012 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/>.
++
++// PR libstdc++/53830
++// Test for deadlock in condition_variable_any::wait_for
++
++#include <thread>
++#include <mutex>
++#include <condition_variable>
++#include <chrono>
++#include <atomic>
++
++std::mutex mutex;
++std::condition_variable_any cv;
++
++std::atomic<int> barrier(0);
++
++// waits for data from another thread
++void wait_for_data()
++{
++  std::unique_lock<std::mutex> lock(mutex);
++  barrier = 1;
++  cv.wait_for(lock, std::chrono::milliseconds(100), []{ return false; });
++  // read data
++}
++
++// passes data to waiting thread
++void provide_data()
++{
++  while (barrier == 0)
++    std::this_thread::yield();
++  std::unique_lock<std::mutex> lock(mutex);
++  // pass data
++  std::this_thread::sleep_for(std::chrono::seconds(1));
++  cv.notify_one();
++}
++
++int main()
++{
++  std::thread thread1(wait_for_data);
++  provide_data();
++  thread1.join();
++  return 0;
++}
++
+Index: libstdc++-v3/testsuite/22_locale/ctype_base/53678.cc
+===================================================================
+--- libstdc++-v3/testsuite/22_locale/ctype_base/53678.cc       (.../tags/gcc_4_6_3_release)    (revision 0)
++++ libstdc++-v3/testsuite/22_locale/ctype_base/53678.cc       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,28 @@
++// Copyright (C) 2012 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 }
++
++// 22.2.1 The ctype category
++
++#include <locale>
++
++// libstdc++/53678
++void test01()
++{
++  bool NetBSD __attribute__((unused)) = true;
++}
+Index: libstdc++-v3/testsuite/Makefile.am
+===================================================================
+--- libstdc++-v3/testsuite/Makefile.am (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/testsuite/Makefile.am (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -59,6 +59,7 @@
+       @echo 'set target_triplet $(target_triplet)' >>site.tmp
+       @echo 'set libiconv "$(LIBICONV)"' >>site.tmp
+       @echo 'set baseline_dir "$(baseline_dir)"' >> site.tmp
++      @echo 'set TEST_GCC_EXEC_PREFIX "$(libdir)/gcc/"' >> site.tmp
+       @echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
+       @test ! -f site.exp || \
+         sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
+Index: libstdc++-v3/testsuite/23_containers/vector/debug/52433.cc
+===================================================================
+--- libstdc++-v3/testsuite/23_containers/vector/debug/52433.cc (.../tags/gcc_4_6_3_release)    (revision 0)
++++ libstdc++-v3/testsuite/23_containers/vector/debug/52433.cc (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -0,0 +1,43 @@
++// Copyright (C) 2012 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-require-debug-mode "" }
++// { dg-options "-std=gnu++0x" }
++// { dg-do compile }
++
++// PR libstdc++/52433
++
++#include <vector>
++
++struct X
++{
++    std::vector<int>::iterator i;
++
++    X() = default;
++    X(const X&) = default;
++    X(X&&) = default;
++    X& operator=(const X&) = default;
++    X& operator=(X&&) = default;
++};
++
++X test01()
++{
++    X x;
++    x = X();
++    return x;
++}
++
+Index: libstdc++-v3/config.h.in
+===================================================================
+--- libstdc++-v3/config.h.in   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/config.h.in   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -692,6 +692,9 @@
+ /* Define if a fully dynamic basic_string is wanted. */
+ #undef _GLIBCXX_FULLY_DYNAMIC_STRING
++/* Define if gthreads types cannot be copy-assigned in C++11. */
++#undef _GLIBCXX_GTHREADS_NO_COPY_ASSIGN_IN_CXX11
++
+ /* Define if gthreads library is available. */
+ #undef _GLIBCXX_HAS_GTHREADS
+Index: libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
+===================================================================
+--- libstdc++-v3/config/os/bsd/netbsd/ctype_base.h     (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/config/os/bsd/netbsd/ctype_base.h     (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,6 +1,6 @@
+ // Locale support -*- C++ -*-
+-// Copyright (C) 2000, 2009 Free Software Foundation, Inc.
++// Copyright (C) 2000, 2009, 2011, 2012 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
+@@ -31,8 +31,6 @@
+ //   anoncvs@anoncvs.netbsd.org:/cvsroot/basesrc/include/ctype.h
+ // See www.netbsd.org for details of access.
+   
+-#include <sys/param.h>
+-
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+@@ -47,7 +45,7 @@
+     // on the mask type. Because of this, we don't use an enum.
+     typedef unsigned char             mask;
+-#if __NetBSD_Version__ < 599004100
++#ifndef _CTYPE_U
+     static const mask upper           = _U;
+     static const mask lower   = _L;
+     static const mask alpha   = _U | _L;
+Index: libstdc++-v3/acinclude.m4
+===================================================================
+--- libstdc++-v3/acinclude.m4  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libstdc++-v3/acinclude.m4  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -3213,6 +3213,58 @@
+   ])
+ ])
++dnl
++dnl Check whether gthreads types can be copy-assigned in C++11 mode.
++dnl
++AC_DEFUN([GLIBCXX_GTHREADS_CXX11_COPY_ASSIGN], [
++
++  AC_LANG_SAVE
++  AC_LANG_CPLUSPLUS
++  ac_save_CXXFLAGS="$CXXFLAGS"
++  CXXFLAGS="$CXXFLAGS -std=c++0x -I${toplevel_srcdir}/gcc"
++
++  target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
++  case $target_thread_file in
++    posix)
++      CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
++  esac
++
++  AC_MSG_CHECKING([whether gthreads types are copy-assignable in C++11 mode])
++
++  AC_TRY_COMPILE([#include "gthr.h"],
++    [
++      #ifdef __GTHREAD_MUTEX_INIT
++      __gthread_mutex_t m1;
++      __gthread_mutex_t m2 = __GTHREAD_MUTEX_INIT;
++      m1 = m2;
++      #endif
++      #ifdef __GTHREAD_RECURSIVE_MUTEX_INIT
++      __gthread_recursive_mutex_t r1;
++      __gthread_recursive_mutex_t r2 = __GTHREAD_RECURSIVE_MUTEX_INIT;
++      r1 = r2;
++      #endif
++      #ifdef __GTHREAD_HAS_COND
++      #ifdef __GTHREAD_COND_INIT
++      __gthread_cond_t c1;
++      __gthread_cond_t c2 = __GTHREAD_COND_INIT;
++      c1 = c2;
++      #endif
++      #endif
++    ], [ac_gthread_cxx11_copy_assign=1], [ac_gthread_cxx11_copy_assign=0])
++
++  if test $ac_gthread_cxx11_copy_assign = 1 ; then res_gthr_copy_assign=yes ;
++  else res_gthr_copy_assign=no ; fi
++  AC_MSG_RESULT([$res_gthr_copy_assign])
++
++  if test x"$res_gthr_copy_assign" = x"no"; then
++    AC_DEFINE(_GLIBCXX_GTHREADS_NO_COPY_ASSIGN_IN_CXX11, 1,
++            [Define if gthreads types cannot be copy-assigned in C++11.])
++  fi
++
++  CXXFLAGS="$ac_save_CXXFLAGS"
++  AC_LANG_RESTORE
++])
++
+ # Macros from the top-level gcc directory.
+ m4_include([../config/gc++filt.m4])
+ m4_include([../config/tls.m4])
+Index: libgfortran/intrinsics/eoshift2.c
+===================================================================
+--- libgfortran/intrinsics/eoshift2.c  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libgfortran/intrinsics/eoshift2.c  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -77,6 +77,12 @@
+       ret->offset = 0;
+       ret->dtype = array->dtype;
++
++      if (arraysize > 0)
++      ret->data = internal_malloc_size (size * arraysize);
++      else
++      ret->data = internal_malloc_size (1);
++
+       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+         {
+         index_type ub, str;
+@@ -90,12 +96,6 @@
+             * GFC_DESCRIPTOR_STRIDE(ret,i-1);
+         GFC_DIMENSION_SET(ret->dim[i], 0, ub, str);
+-
+-        if (arraysize > 0)
+-          ret->data = internal_malloc_size (size * arraysize);
+-        else
+-          ret->data = internal_malloc_size (1);
+-
+         }
+     }
+   else if (unlikely (compile_options.bounds_check))
+Index: libgfortran/ChangeLog
+===================================================================
+--- libgfortran/ChangeLog      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libgfortran/ChangeLog      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,9 @@
++2012-05-12  Tobias Burnus  <burnus@net-b.de>
++
++      PR fortran/53310
++      * intrinsics/eoshift2.c (eoshift2): Do not leak
++      memory by allocating it in the loop.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: boehm-gc/configure.ac
+===================================================================
+--- boehm-gc/configure.ac      (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ boehm-gc/configure.ac      (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -392,6 +392,7 @@
+ oldLIBS="$LIBS"
+ LIBS="$LIBS $THREADLIBS"
+ AC_CHECK_FUNCS([pthread_getattr_np])
++AC_CHECK_FUNCS([pthread_get_stackaddr_np])
+ LIBS="$oldLIBS"
+ # Configuration of machine-dependent code
+Index: boehm-gc/include/gc_config.h.in
+===================================================================
+--- boehm-gc/include/gc_config.h.in    (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ boehm-gc/include/gc_config.h.in    (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -87,6 +87,9 @@
+ /* Define to 1 if you have the `pthread_getattr_np' function. */
+ #undef HAVE_PTHREAD_GETATTR_NP
++/* Define to 1 if you have the `pthread_get_stackaddr_np_np' function. */
++#undef HAVE_PTHREAD_GET_STACKADDR_NP
++
+ /* Define to 1 if you have the <stdint.h> header file. */
+ #undef HAVE_STDINT_H
+Index: boehm-gc/include/private/gcconfig.h
+===================================================================
+--- boehm-gc/include/private/gcconfig.h        (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ boehm-gc/include/private/gcconfig.h        (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1331,7 +1331,11 @@
+        These aren't used when dyld support is enabled (it is by default) */
+ #     define DATASTART ((ptr_t) get_etext())
+ #     define DATAEND  ((ptr_t) get_end())
+-#     define STACKBOTTOM ((ptr_t) 0xc0000000)
++#     ifdef HAVE_PTHREAD_GET_STACKADDR_NP
++#       define STACKBOTTOM (ptr_t)pthread_get_stackaddr_np(pthread_self())
++#     else
++#       define STACKBOTTOM ((ptr_t) 0xc0000000)
++#     endif
+ #     define USE_MMAP
+ #     define USE_MMAP_ANON
+ #     define USE_ASM_PUSH_REGS
+@@ -2011,7 +2015,11 @@
+        These aren't used when dyld support is enabled (it is by default) */
+ #     define DATASTART ((ptr_t) get_etext())
+ #     define DATAEND  ((ptr_t) get_end())
+-#     define STACKBOTTOM ((ptr_t) 0x7fff5fc00000)
++#     ifdef HAVE_PTHREAD_GET_STACKADDR_NP
++#       define STACKBOTTOM (ptr_t)pthread_get_stackaddr_np(pthread_self())
++#     else
++#       define STACKBOTTOM ((ptr_t) 0x7fff5fc00000)
++#     endif
+ #     define USE_MMAP
+ #     define USE_MMAP_ANON
+ #     ifdef GC_DARWIN_THREADS
+Index: boehm-gc/ChangeLog
+===================================================================
+--- boehm-gc/ChangeLog (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ boehm-gc/ChangeLog (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,17 @@
++2012-03-02  Jack Howarth  <howarth@bromo.med.uc.edu>
++
++      Backport from mainline
++      2012-02-23  Patrick Marlier  <patrick.marlier@gmail.com>
++                  Jack Howarth  <howarth@bromo.med.uc.edu>
++
++      PR boehm-gc/52179
++      * include/gc_config.h.in: Undefine HAVE_PTHREAD_GET_STACKADDR_NP.
++      * include/private/gcconfig.h (DARWIN): Define STACKBOTTOM with
++      pthread_get_stackaddr_np when available.
++      * configure.ac (THREADS): Check availability of
++      pthread_get_stackaddr_np.
++      * configure: Regenerate.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: boehm-gc/configure
+===================================================================
+--- boehm-gc/configure (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ boehm-gc/configure (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -15246,6 +15246,17 @@
+ fi
+ done
++for ac_func in pthread_get_stackaddr_np
++do :
++  ac_fn_c_check_func "$LINENO" "pthread_get_stackaddr_np" "ac_cv_func_pthread_get_stackaddr_np"
++if test "x$ac_cv_func_pthread_get_stackaddr_np" = x""yes; then :
++  cat >>confdefs.h <<_ACEOF
++#define HAVE_PTHREAD_GET_STACKADDR_NP 1
++_ACEOF
++
++fi
++done
++
+ LIBS="$oldLIBS"
+ # Configuration of machine-dependent code
+Index: libffi/src/powerpc/aix.S
+===================================================================
+--- libffi/src/powerpc/aix.S   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libffi/src/powerpc/aix.S   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+-   aix.S - Copyright (c) 2002,2009 Free Software Foundation, Inc.
++   aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc.
+    based on darwin.S by John Hornkvist
+    PowerPC Assembly glue.
+@@ -79,6 +79,8 @@
+       .set f20,20
+       .set f21,21
++      .extern .ffi_prep_args
++
+ #define LIBFFI_ASM
+ #include <fficonfig.h>
+ #include <ffi.h>
+@@ -125,6 +127,7 @@
+       /* Call ffi_prep_args.  */
+       mr      r4, r1
+       bl      .ffi_prep_args
++      nop
+       /* Now do the call.  */
+       ld      r0, 0(r29)
+@@ -226,6 +229,7 @@
+       /* Call ffi_prep_args.  */
+       mr      r4, r1
+       bl      .ffi_prep_args
++      nop
+       /* Now do the call.  */
+       lwz     r0, 0(r29)
+Index: libffi/src/powerpc/aix_closure.S
+===================================================================
+--- libffi/src/powerpc/aix_closure.S   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libffi/src/powerpc/aix_closure.S   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -79,6 +79,8 @@
+       .set f20,20
+       .set f21,21
++      .extern .ffi_closure_helper_DARWIN
++
+ #define LIBFFI_ASM
+ #define JUMPTARGET(name) name
+ #define L(x) x
+@@ -165,6 +167,7 @@
+       /* look up the proper starting point in table  */
+       /* by using return type as offset */
++      lhz     r3, 10(r3)      /* load type from return type */
+       ld      r4, LC..60(2)   /* get address of jump table */
+       sldi    r3, r3, 4       /* now multiply return type by 16 */
+       ld      r0, 240+16(r1)  /* load return address */
+@@ -337,8 +340,9 @@
+       /* look up the proper starting point in table  */
+       /* by using return type as offset */
++      lhz     r3, 6(r3)       /* load type from return type */
+       lwz     r4, LC..60(2)   /* get address of jump table */
+-      slwi    r3, r3, 4       /* now multiply return type by 4 */
++      slwi    r3, r3, 4       /* now multiply return type by 16 */
+       lwz     r0, 176+8(r1)   /* load return address */
+       add     r3, r3, r4      /* add contents of table to table address */
+       mtctr   r3
+Index: libffi/ChangeLog
+===================================================================
+--- libffi/ChangeLog   (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libffi/ChangeLog   (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,17 @@
++2012-03-22  David Edelsohn  <dje.gcc@gmail.com>
++
++      Backport from mainline:
++      2012-03-09  David Edelsohn  <dje.gcc@gmail.com>
++
++      * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64
++      change to return value of ffi_closure_helper_DARWIN and load type
++      from return type.
++
++      From Tom Honermann <tom.honermann@oracle.com>:
++      * src/powerpc/aix.S: Declare .ffi_prep_args.  Insert nops after
++      branch instructions.
++      * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: libjava/configure.ac
+===================================================================
+--- libjava/configure.ac       (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libjava/configure.ac       (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -886,14 +886,9 @@
+         SYSTEMSPEC="-lunicows $SYSTEMSPEC"
+       fi
+     ;;
+-    *-*-darwin9*)
++    *-*-darwin[[912]]*)
+       SYSTEMSPEC="%{!Zdynamiclib:%{!Zbundle:-allow_stack_execute}}"
+     ;;
+-    *-*-darwin[[12]]*)
+-      # Something is incompatible with pie, would be nice to fix it and
+-      # remove -no_pie.  PR49461
+-      SYSTEMSPEC="-no_pie %{!Zdynamiclib:%{!Zbundle:-allow_stack_execute}}"
+-    ;;
+     *)
+       SYSTEMSPEC=
+     ;;
+Index: libjava/ChangeLog
+===================================================================
+--- libjava/ChangeLog  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libjava/ChangeLog  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -1,3 +1,13 @@
++2012-03-02  Jack Howarth  <howarth@bromo.med.uc.edu>
++
++      Backport from mainline
++      2012-02-23  Patrick Marlier  <patrick.marlier@gmail.com>
++                  Jack Howarth  <howarth@bromo.med.uc.edu>
++
++      PR target/49461
++      * configure.ac (SYSTEMSPEC): No longer pass -no_pie for darwin11.
++      * configure: Regenerate.
++
+ 2012-03-01  Release Manager
+       * GCC 4.6.3 released.
+Index: libjava/configure
+===================================================================
+--- libjava/configure  (.../tags/gcc_4_6_3_release)    (revision 190226)
++++ libjava/configure  (.../branches/gcc-4_6-branch)   (revision 190226)
+@@ -19775,14 +19775,9 @@
+         SYSTEMSPEC="-lunicows $SYSTEMSPEC"
+       fi
+     ;;
+-    *-*-darwin9*)
++    *-*-darwin[912]*)
+       SYSTEMSPEC="%{!Zdynamiclib:%{!Zbundle:-allow_stack_execute}}"
+     ;;
+-    *-*-darwin[12]*)
+-      # Something is incompatible with pie, would be nice to fix it and
+-      # remove -no_pie.  PR49461
+-      SYSTEMSPEC="-no_pie %{!Zdynamiclib:%{!Zbundle:-allow_stack_execute}}"
+-    ;;
+     *)
+       SYSTEMSPEC=
+     ;;
This page took 0.447328 seconds and 4 git commands to generate.