aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2007-02-08builtins-20.c: Add some -~ complex cases.Kaveh R. Ghazi2-0/+22
* gcc.dg/builtins-20.c: Add some -~ complex cases. From-SVN: r121710
2007-02-08* lower-subreg.c (simple_move): Reject PARTIAL_INT modes.Ian Lance Taylor2-0/+9
From-SVN: r121707
2007-02-08rs6000.md (ctz<mode>2, [...]): Remove constraints from define_expand's ↵Roger Sayle2-16/+23
match_operands. * config/rs6000/rs6000.md (ctz<mode>2, ffs<mode>2, popcount<mode>2, parity<mode>2, smulsi3_highpart, abstf2_internal, allocate_stack, tablejumpdi, movsi_to_cr_one): Remove constraints from define_expand's match_operands. From-SVN: r121706
2007-02-08Daily bump.GCC Administrator1-1/+1
From-SVN: r121704
2007-02-07global.c (compute_regsets): Move declatation of "i" inside of #ifdef ↵Roger Sayle2-1/+6
ELIMINABLE_REGS to avoid unused... * global.c (compute_regsets): Move declatation of "i" inside of #ifdef ELIMINABLE_REGS to avoid unused variable bootstrap failure. From-SVN: r121697
2007-02-07class.c (uncache_this_class_ref): New.Andrew Haley4-0/+34
2007-02-07 Andrew Haley <aph@redhat.com> * class.c (uncache_this_class_ref): New. * expr.c (build_jni_stub): Initialize the class. (expand_byte_code): Call uncache_this_class_ref after generating code. From-SVN: r121695
2007-02-07re PR c++/30703 (ICE Segmentation fault on using OpenMP)Jakub Jelinek4-11/+32
PR c++/30703 * gimplify.c (gimplify_scan_omp_clauses): Remove special casing of INDIRECT_REF <RESULT_DECL>. * cp-gimplify.c (cp_genericize_r): Don't dereference invisiref parameters and result decls in omp clauses. (cxx_omp_privatize_by_reference): Pass also invisiref PARM_DECLs by reference. * testsuite/libgomp.c++/pr30703.C: New test. From-SVN: r121688
2007-02-07* config/i386/i386.c (override_options): Set PTA_SSSE3 for core2.Jakub Jelinek2-1/+5
From-SVN: r121687
2007-02-07* lib/target-supports.exp (check_effective_target_simulator): New.Hans-Peter Nilsson2-0/+23
From-SVN: r121683
2007-02-07raise-gcc.c (get_region_description_for, [...]): Replaced _Unwind_Word with ↵Andreas Krebbel2-4/+10
_uleb128_t and _Unwind_SWord with _sleb128_t. 2007-02-07 Andreas Krebbel <krebbel1@de.ibm.com> * raise-gcc.c (get_region_description_for, get_call_site_action_for, get_action_description_for): Replaced _Unwind_Word with _uleb128_t and _Unwind_SWord with _sleb128_t. From-SVN: r121681
2007-02-07Daily bump.GCC Administrator1-1/+1
From-SVN: r121676
2007-02-06re PR target/29746 (gcc fails to bootstrap on sh4-*-linux-gnu)J"orn Rennecke2-3/+24
PR target/29746 * config/sh/sh.c (expand_cbranchdi4): Use scratch register properly. (sh_initialize_trampoline): Add parentheses to avoid a warning. Co-Authored-By: Kaz Kojima <kkojima@gcc.gnu.org> From-SVN: r121671
2007-02-06loop.texi: Document possibility not to perform disambiguation of loops with ↵Zdenek Dvorak13-264/+615
multiple latches. * doc/loop.texi: Document possibility not to perform disambiguation of loops with multiple latches. * cfgloopmanip.c (alp_enum_p): Removed. (add_loop): Handle subloops. Use get_loop_body_with_size. (create_preheader): Do not allow ENTRY_BLOCK_PTR to be preheader. * cfghooks.c (redirect_edge_and_branch_force): Set dominator for the new forwarder block. (make_forwarder_block): Only call new_bb_cbk if it is not NULL. Handle the case latch is NULL. * tree-ssa-dom.c (tree_ssa_dominator_optimize): Avoid cfg modifications when marking loop exits. * ifcvt.c (if_convert): Ditto. Mark loop exits even if cfg cannot be modified. * loop-init.c (loop_optimizer_init): Do not modify cfg. Call disambiguate_loops_with_multiple_latches. * tree-cfgcleanup.c (cleanup_tree_cfg_loop): Calculate dominators before fix_loop_structure. * cfgloop.c: Include pointer-set.h and output.h. (canonicalize_loop_headers, HEADER_BLOCK, LATCH_EDGE, update_latch_info, mfb_keep_just, mfb_keep_nonlatch): Removed. (get_loop_latch_edges, find_subloop_latch_edge_by_profile, find_subloop_latch_edge_by_ivs, find_subloop_latch_edge, mfb_redirect_edges_in_set, form_subloop, merge_latch_edges, disambiguate_multiple_latches, get_loop_body_with_size, disambiguate_loops_with_multiple_latches): New functions. (flow_loop_dump): Dump multiple latch edges. (flow_loop_nodes_find): Handle loops with multiple latches. (flow_loops_find): Ditto. Do not call canonicalize_loop_headers. (glb_enum_p): Modified. (get_loop_body): Use get_loop_body_with_size. * cfgloop.h (LOOPS_HAVE_RECORDED_EXITS): New flag. (AVOID_CFG_MODIFICATIONS): New constant. (disambiguate_loops_with_multiple_latches, add_loop, get_loop_body_with_size): Declare. * Makefile.in (cfgloop.o): Add pointer-set.h and output.h. * gcc.dg/tree-ssa/loop-25.c: New test. From-SVN: r121670
2007-02-06re PR driver/30714 (gcj driver doesn't recognize files starting with II)Tom Tromey2-1/+6
PR java/30714: * jvspec.c (lang_specific_driver): Check for the '-' in '-I'. From-SVN: r121666
2007-02-06re PR inline-asm/28686 (ebp from clobber list used as operand)Seongbae Park2-27/+60
2007-02-06 Seongbae Park <seongbae.park@gmail.com> PR inline-asm/28686 * global.c (compute_regsets): New function. (global_alloc): Refactored ELIMINABLE_REGSET and NO_GLOBAL_ALLOC_REGS computation out. (rest_of_handle_global_alloc): Call compute_regsets() for non-optimizing case. From-SVN: r121663
2007-02-06constraints.md (Y2): Rename from Y.Richard Henderson5-83/+115
* config/i386/constraints.md (Y2): Rename from Y. (Yi): New constraint. * config/i386/i386.md (movsi_1, movdi_2, pushdf_nointeger, pushdf_integer, movdf_nointeger, movdf_integer, zero_extendsidi2_32, zero_extendsidi2_rex64, truncxfdf2_mixed): Change Y constraints to Y2. (extendsfdf2_mixed, extendsfdf2_sse, truncdfsf_fast_mixed, truncdfsf_fast_sse, truncdfsf_mixed, fix_truncdfdi_sse, fix_truncdfsi_sse, floatsidf2_mixed, floatsidf2_sse, floatdidf2_mixed, floatdidf2_sse, absnegdf2_mixed, absnegdf2_sse, sse_setccdf, fop_df_comm_mixed, fop_df_comm_sse, fop_df_1_mixed, fop_df_1_sse): Change Y constraints to x. * config/i386/mmx.md (mov<MMXMODEI>_internal_rex64, mov<MMXMODEI>_internal, movv2sf_internal_rex64, movv2sf_internal, vec_extractv2si_1): Change Y constraints to Y2. * config/i386/sse.md (vec_setv4sf_0, vec_concatv2df, vec_dupv4si, vec_dupv2di, sse2_concatv2si, vec_concatv4si_1, vec_concatv2di): Change Y constraints to Y2. (sse2_loadld): Change Y constraints to x. From-SVN: r121660
2007-02-06* gcc.target/i386/cvt-1.c: Don't expect xmm registers.Richard Henderson2-2/+6
From-SVN: r121659
2007-02-06ChangeLog: Doh!Roger Sayle1-0/+5
* ChangeLog: Doh! Missed in the last commit. From-SVN: r121654
2007-02-06rs6000.md (popcount<mode>2): Rewrite.Roger Sayle6-21/+144
* config/rs6000/rs6000.md (popcount<mode>2): Rewrite. (parity<mode>2): New define_expand using rs6000_emit_parity. * config/rs6000/rs6000.c (rs6000_emit_popcount, rs6000_emit_parity): New functions. * config/rs6000/rs6000-protos.h (rs6000_emit_popcount, rs6000_emit_parity): Prototype here. * gcc.target/powerpc/popcount-1.c: New test case. * gcc.target/powerpc/parity-1.c: Likewise. From-SVN: r121653
2007-02-06lower-subreg.c (simple_move_operand): Reject CONST.Ian Lance Taylor2-2/+15
* lower-subreg.c (simple_move_operand): Reject CONST. (resolve_clobber): Call validate_change rather than directly assigning to XEXP (pat, 0). From-SVN: r121652
2007-02-06Makefile.in (tree-ssa-loop-ivopts.o): Add pointer-set.h dependency.Paolo Bonzini7-373/+217
2006-02-06 Paolo Bonzini <bonzini@gnu.org> * Makefile.in (tree-ssa-loop-ivopts.o): Add pointer-set.h dependency. (tree-ssa-reassoc.o): Add pointer-set.h dependency. (tree-cfg.o): Remove hashtab.h dependency. * tree-ssa-loop-ivopts.c: Include pointer-set.h. (struct ivopts_data): Change niters to pointer_map_t. (struct nfe_cache_elt, nfe_hash, nfe_eq): Delete. (niter_for_exit): Create pointer_map on demand. Change for pointer_map API. (tree_ssa_iv_optimize_init): Initialize data->niters to NULL. (free_loop_data): Destroy data->niters if created and reset field. (tree_ssa_iv_optimize_finalize): Don't delete data->niters here. (tree_ssa_iv_optimize_loop): Check for presence of stale data. * tree-ssa-reassoc.c: Include pointer-set.h. (bb_rank): Change to long *. (operand_rank): Change to pointer_map_t. (find_operand_rank): Return long, -1 if not found. Declare as inline. (insert_operand_rank): Accept long. (operand_entry_hash, operand_entry_eq): Remove. (get_rank): Return long. Adjust for changes above. (init_reassoc): Change rank type to long. Adjust creation of bb_rank and operand_rank. (fini_reassoc): Delete operand_rank with pointer_map_destroy. * tree-ssa-structalias.c (vi_for_tree): Change to pointer_map. (struct tree_vi, tree_vi_t, tree_vi_hash, tree_vi_eq): Delete. (insert_vi_for_tree): Rewrite for pointer_map API. Assert argument is not NULL. (lookup_vi_for_tree): Rewrite for pointer_map API. Return varinfo_t directly since it cannot be NULL. (get_vi_for_tree): Rewrite for pointer_map API. (find_what_p_points_to): Adjust for change to lookup_vi_for_tree. (init_alias_vars): Create vi_for_tree as pointer_map. (delete_points_to_sets): Delete vi_for_tree using pointer_map_destroy. * tree-cfg.c: Don't include hashtab.h. (edge_to_cases): Declare as pointer_map. (struct edge_to_cases_elt, edge_to_cases_hash, edge_to_cases_eq): Delete. (edge_to_cases_cleanup): Rewrite as pointer_map_traverse callback. (start_recording_case_labels): Create edge_to_cases as pointer_map. (end_recoding_case_labels): Cleanup edge_to_cases manually before destroying it. (record_switch_edge): Delete. (get_cases_for_edge): Adjust for pointer_map API, inline record_switch_edge (rewritten for new API), remove goto. From-SVN: r121648
2007-02-06tree.c (tree_int_map_hash, [...]): Remove prototypes and make them non-static.Paolo Bonzini6-18/+65
gcc: 2007-02-06 Paolo Bonzini <bonzini@gnu.org> * tree.c (tree_int_map_hash, tree_int_map_eq, tree_int_map_marked_p): Remove prototypes and make them non-static. (struct tree_int_map): Remove. * tree.h (struct tree_int_map): Move here, turning TO into an unsigned int. (tree_int_map_hash, tree_int_map_eq, tree_int_map_marked_p): Declare. * tree.h (TREE_COMPLEXITY): Remove. (struct tree_exp): Remove complexity field. * tree.c (build1_stat): Don't set it. gcc/ada: 2007-02-06 Paolo Bonzini <bonzini@gnu.org> * Make-lang.in (ada/decl.o): Add gt-ada-decl.h dependency. * decl.c: Include gt-ada-decl.h. (annotate_value_cache): New. (annotate_value): Use it instead of TREE_COMPLEXITY. From-SVN: r121647
2007-02-06re PR middle-end/27302 (Fold does not fold (i < j) == (j > i) to 1)Richard Guenther2-0/+57
2007-02-06 Richard Guenther <rguenther@suse.de> PR middle-end/27302 * gcc.dg/torture/pr27302-2.c: New testcase. From-SVN: r121644
2007-02-06tree-vectorizer.c (vect_is_simple_use): Support induction.Dorit Nuzman29-88/+892
2007-02-06 Dorit Nuzman <dorit@il.ibm.com> Victor Kaplansky <victork@il.ibm.com> * tree-vectorizer.c (vect_is_simple_use): Support induction. (vect_is_simple_reduction): Support reduction with induction as one of the operands. (vect_is_simple_iv_evolution): Fix formatting. * tree-vect-analyze.c (vect_mark_stmts_to_be_vectorized): Fix formatting. Don't mark induction phis for vectorization. (vect_analyze_scalar_cycles): Analyze all inductions, then reductions. * tree-vect-transform.c (get_initial_def_for_induction): New function. (vect_get_vec_def_for_operand): Support induction. (vect_get_vec_def_for_stmt_copy): Fix formatting and add check for induction case. (vectorizable_reduction): Support reduction with induction as one of the operands. (vectorizable_type_demotion): Use def-type of stmt argument rather than dummy def-type. * tree-ssa-loop.c (gate_scev_const_prop): Return the value of flag_tree_scev_cprop. * common.opt (tree-scev-cprop): New flag. * tree-vect-transform.c (vect_create_destination_var): Use 'kind' in call to vect_get_new_vect_var. Co-Authored-By: Victor Kaplansky <victork@il.ibm.com> From-SVN: r121643
2007-02-06tree-vect-patterns.c (vect_recog_widen_mult_pattern): Check that vectype is ↵Ira Rosen4-1/+48
not NULL. * tree-vect-patterns.c (vect_recog_widen_mult_pattern): Check that vectype is not NULL. (vect_pattern_recog_1): Likewise. From-SVN: r121640
2007-02-06fold-const.c (negate_expr_p): Handle CONJ_EXPR.Kaveh R. Ghazi4-0/+54
* fold-const.c (negate_expr_p): Handle CONJ_EXPR. (fold_negate_expr): Likewise. testsuite: * gcc.dg/builtins-20.c: Add more cases. From-SVN: r121639
2007-02-06re PR debug/30189 (ICE on modified_type_die)Alexandre Oliva4-3/+34
gcc/ChangeLog: PR debug/30189 * dwarf2out.c (modified_type_die): Follow DECL_ORIGINAL_TYPE even if cv-qualification is the same. gcc/testsuite/ChangeLog: PR debug/30189 * gcc.dg/pr30189.c: New test. From-SVN: r121638
2007-02-06darwin-tramp.asm (__trampoline_setup): Call __enable_execute_stack on ↵Geoffrey Keating2-2/+9
completion. * config/rs6000/darwin-tramp.asm (__trampoline_setup): Call __enable_execute_stack on completion. From-SVN: r121633
2007-02-06Add the PR number to my previous ChangeLog entries.Steven G. Kargl2-1/+2
From-SVN: r121632
2007-02-06Daily bump.GCC Administrator1-1/+1
From-SVN: r121629
2007-02-05amdfam10Harsha Jagasia20-149/+1865
From-SVN: r121625
2007-02-05* config/xtensa/xtensa.c (constantpool_mem_p): Skip over SUBREGs.Bob Wilson2-0/+6
From-SVN: r121622
2007-02-05tree-vectorizer.h (vectorizable_function): Add argument type argument, ↵Richard Guenther11-82/+189
change return type. 2007-02-05 Richard Guenther <rguenther@suse.de> * tree-vectorizer.h (vectorizable_function): Add argument type argument, change return type. * tree-vect-patterns.c (vect_recog_pow_pattern): Adjust caller. * tree-vect-transform.c (vectorizable_function): Handle extra argument, return vectorized function decl. (build_vectorized_function_call): Remove. (vectorizable_call): Handle calls with result and argument types differing. Handle loop vectorization factor correctly. * targhooks.c (default_builtin_vectorized_function): Adjust for extra argument. * targhooks.h (default_builtin_vectorized_function): Likewise. * target.h (builtin_vectorized_function): Add argument type argument. * config/i386/i386.c (ix86_builtin_vectorized_function): Handle extra argument, allow vectorizing of lrintf. * doc/tm.texi (TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION): Adjust documentation of target hook. * gcc.target/i386/vectorize3.c: New testcase. From-SVN: r121617
2007-02-05re PR target/30665 (peephole2 misapplied on postinc mem)Hans-Peter Nilsson1-0/+1
PR target/30665 * config/cris/cris.md ("*andsi_movu", "*andsi_clear", "*andhi_movu") ("*andhi_clear", andu (casesi+45)): For size-changed operand where memory is allowed, require !side_effects_p, not just !MEM_VOLATILE_P. From-SVN: r121613
2007-02-05cris.md ("*andsi_movu", [...]): For size-changed operand where memory is ↵Hans-Peter Nilsson2-7/+13
allowed... * config/cris/cris.md ("*andsi_movu", "*andsi_clear", "*andhi_movu") ("*andhi_clear", andu (casesi+45)): For size-changed operand where memory is allowed, require !side_effects_p, not just !MEM_VOLATILE_P. From-SVN: r121612
2007-02-05re PR target/30665 (peephole2 misapplied on postinc mem)Hans-Peter Nilsson3-0/+86
PR target/30665 * gcc.dg/torture/pr30665-1.c, gcc.dg/torture/pr30665-2.c: New tests. From-SVN: r121611
2007-02-05fold-const.c (fold_unary): Test for availability of BUILT_IN_COS before ↵Roger Sayle3-4/+25
simplifying REAL_PART(CEXPI)) to COS. * fold-const.c (fold_unary) <REAL_PART>: Test for availability of BUILT_IN_COS before simplifying REAL_PART(CEXPI)) to COS. <IMAG_PART>: Likewise, check for availability of BUILT_IN_SIN. * builtins.c (fold_builtin_sincos): Check for TARGET_C99_FUNCTIONS before canonicalizing sincos to cexpi. (fold_builtin_cexp): Likewise, for canonicalizing cexp to cexpi. From-SVN: r121607
2007-02-05alpha.c (alpha_add_builtins): New Helper function.Roger Sayle2-32/+45
* config/alpha/alpha.c (alpha_add_builtins): New Helper function. Set TREE_READONLY and TREE_NOTHROW directly, not via attributes. (alpha_init_builtins): Use alpha_add_builtins to process tables. From-SVN: r121603
2007-02-05mips-tfile.c (initialize_init_file): Correct endianness test.Roger Sayle2-4/+21
* mips-tfile.c (initialize_init_file): Correct endianness test. From-SVN: r121602
2007-02-05m68k.md (pushdi-1, [...]): Don't use the 'y' constraint.Kazu Hirata2-3/+8
* config/m68k/m68k.md (pushdi-1, pushdi, movsi+1): Don't use the 'y' constraint. From-SVN: r121600
2007-02-05re PR bootstrap/30510 (Gcc failed to bootstrap)Dirk Mueller2-1/+11
2007-02-05 Dirk Mueller <dmueller@suse.de> PR bootstrap/30510 * parser.c (cp_parser_class_specifier): Always initialize bases. From-SVN: r121596
2007-02-05dwarf2out.c (dwarf2out_frame_debug_expr): Record the register saves in a ↵Richard Sandiford2-5/+28
PARALLEL before the register assignments. gcc/ * dwarf2out.c (dwarf2out_frame_debug_expr): Record the register saves in a PARALLEL before the register assignments. From-SVN: r121594
2007-02-05tm.texi (DWARF_ALT_FRAME_RETURN_COLUMN): Do not require ↵Richard Sandiford4-18/+45
DWARF_FRAME_RETURN_COLUMN to be a general register. gcc/ * doc/tm.texi (DWARF_ALT_FRAME_RETURN_COLUMN): Do not require DWARF_FRAME_RETURN_COLUMN to be a general register. * dwarf2out.c (init_return_column_size): New function, split from... (expand_builtin_init_dwarf_reg_sizes): ...here. Allow both DWARF_FRAME_RETURN_COLUMN and DWARF_ALT_FRAME_RETURN_COLUMN to be nongeneral registers. * config/m68k/m68k.h (DWARF_FRAME_REGNUM): Only map FP and integer registers. (DWARF_FRAME_REGISTERS, DWARF_FRAME_RETURN_COLUMN): Define. (DWARF_ALT_FRAME_RETURN_COLUMN): Define. From-SVN: r121593
2007-02-05cp-tree.h (OMP_ATOMIC_CODE): Delete.Paolo Bonzini4-38/+32
2007-02-05 Paolo Bonzini <bonzini@gnu.org> * cp-tree.h (OMP_ATOMIC_CODE): Delete. (OMP_ATOMIC_DEPENDENT_P): Rewrite. * pt.c (tsubst_expr): Adjust for new format of dependent OMP_ATOMIC expressions. * semantics.c (finish_omp_atomic): Store a whole expression node in operand 1, and integer_zero_node in operand 0, for dependent OMP_ATOMIC. Rewrite to make flow easier to understand. From-SVN: r121592
2007-02-05Daily bump.GCC Administrator1-1/+1
From-SVN: r121588
2007-02-04cfgcleanup.c (try_optimize_cfg): Avoid removing ENTRY_BLOCK_PTR.Zdenek Dvorak2-3/+9
* cfgcleanup.c (try_optimize_cfg): Avoid removing ENTRY_BLOCK_PTR. From-SVN: r121584
2007-02-04cfgloopmanip.c (loop_delete_branch_edge): Removed.Zdenek Dvorak7-62/+180
* cfgloopmanip.c (loop_delete_branch_edge): Removed. (remove_path): Use can_remove_branch_p and remove_branch instead of loop_delete_branch_edge. * tree-ssa-loop-manip.c (scale_dominated_blocks_in_loop): New function. (tree_transform_and_unroll_loop): Remove dead branches immediately. Update profile using scale_dominated_blocks_in_loop. * cfghooks.c (can_remove_branch_p, remove_branch): New functions. * cfghooks.h (struct cfg_hooks): Add can_remove_branch_p. (can_remove_branch_p, remove_branch): Declare. * tree-cfg.c (tree_can_remove_branch_p): New function. (tree_cfg_hooks): Add tree_can_remove_branch_p. * cfgrtl.c (rtl_can_remove_branch_p): New function. (rtl_cfg_hooks, cfg_layout_rtl_cfg_hook): Add rtl_can_remove_branch_p. From-SVN: r121583
2007-02-04re PR middle-end/30696 (Linker failure with OpenMP and inline function)Jan Hubicka2-0/+7
PR middle-end/30696 * ipa-inline.c (cgraph_clone_inlined_nodes): When there are unanalyzed nodes in cgraph, don't remove offline copy of the function. From-SVN: r121582
2007-02-04re PR fortran/30611 ([4.1 only] Confusing error message for negative ncopies ↵Francois-Xavier Coudert4-1/+47
in REPEAT) PR fortran/30611 * trans-intrinsic.c (gfc_conv_intrinsic_repeat): Evaluate arguments only once. Generate check that NCOPIES argument is not negative. * intrinsics/string_intrinsics.c (string_repeat): Don't check if ncopies is negative. * gcc/testsuite/gfortran.dg/repeat_1.f90: New test. From-SVN: r121581
2007-02-04invoke.texi: Update documentation.Steven G. Kargl10-18/+41
2007-02-03 Steven G. Kargl <kargl@gcc.gnu.org> * fortran/invoke.texi: Update documentation. * fortran/options.c (gfc_post_options): Deal with tabs with -std=f2003 and -pedantic. 2007-02-03 Steven G. Kargl <kargl@gcc.gnu.org> * gfortran.dg/spread_shape_1.f90: Remove tabs. * gfortran.dg/derived_init_2.f90: Ditto. * gfortran.dg/elemental_subroutine_3.f90: Ditto. * gfortran.dg/array_initializer_1.f90: Ditto. * gfortran.dg/do_2.f90: Ditto. * gfortran.dg/proc_assign_1.f90: Ditto. From-SVN: r121580