diff --git a/contrib/gcc/ChangeLog.gcc43 b/contrib/gcc/ChangeLog.gcc43 index 36df02b8d289..ded412bb47ee 100644 --- a/contrib/gcc/ChangeLog.gcc43 +++ b/contrib/gcc/ChangeLog.gcc43 @@ -156,15 +156,6 @@ * reload1.c (merge_assigned_reloads) : Do not merge a RELOAD_OTHER instruction with a RELOAD_FOR_OPERAND_ADDRESS instruction. -2007-04-24 Richard Henderson (r124106) - - * libgcc2.h (AVOID_FP_TYPE_CONVERSION): Rename from - IS_IBM_EXTENDED. Also define in terms of WIDEST_HARDWARE_FP_SIZE. - * libgcc2.c (__floatdisf): Avoid double-word arithmetic when - looking for non-zero bits shifted out. Avoid a recursive call - when constructing the scalar. - (__floatundisf): Likewise. - 2007-04-16 Lawrence Crowl (r123909) * doc/invoke.texi (Debugging Options): Add documentation for the @@ -257,11 +248,6 @@ * tree-vrp.c (vrp_int_const_binop): Handle PLUS_EXPR and the *_DIV_EXPR codes correctly with overflow infinities. -2007-03-04 Zdenek Dvorak (r122528) - - * tree-ssa-address.c (create_mem_ref): Do not put an expression - containing a cast to the base of TARGET_MEM_REF. - 2007-02-09 Dwarakanath Rajagopal (r121763) * config/i386/driver-i386.c: Turn on -mtune=native for AMDFAM10. @@ -438,11 +424,6 @@ and amdfam10. * doc/extend.texi: Add documentation for SSE4A builtins. -2007-02-01 Zdenek Dvorak (r121464) - - * toplev.c (lang_dependent_init): Call init_set_costs. - * loop-init.c (loop_optimizer_init): Do not call init_set_costs. - 2007-01-24 Jakub Jelinek (r121140) * config/i386/i386.h (x86_cmpxchg16b): Remove const. diff --git a/contrib/gcc/cp/ChangeLog b/contrib/gcc/cp/ChangeLog index a79ed04dac5f..7629e8b10d9c 100644 --- a/contrib/gcc/cp/ChangeLog +++ b/contrib/gcc/cp/ChangeLog @@ -314,12 +314,6 @@ PR c++/30895 * tree.c (cp_tree_equal): Properly handle COMPLEX_CST trees. -2007-03-02 Geoffrey Keating (r122488) - - * g++spec.c (lang_specific_driver): Add -lstdc++ when compiling - Objective-C++. Don't exit early if -shared-libgcc needs to be - added. - 2007-02-22 Simon Martin PR c++/29475 diff --git a/contrib/gcc/cp/g++spec.c b/contrib/gcc/cp/g++spec.c index 0d3a44223766..b58fdcd7fed0 100644 --- a/contrib/gcc/cp/g++spec.c +++ b/contrib/gcc/cp/g++spec.c @@ -159,19 +159,11 @@ lang_specific_driver (int *in_argc, const char *const **in_argv, arg = ""; if (library == 0 && (strcmp (arg, "c++") == 0 - || strcmp (arg, "c++-cpp-output") == 0 - || strcmp (arg, "objective-c++") == 0 - || strcmp (arg, "objective-c++-cpp-output") == 0)) + || strcmp (arg, "c++-cpp-output") == 0)) library = 1; saw_speclang = 1; } - else if (strcmp (argv[i], "-ObjC++") == 0) - { - if (library == 0) - library = 1; - saw_speclang = 1; - } /* Arguments that go directly to the linker might be .o files, or something, and so might cause libstdc++ to be needed. */ else if (strcmp (argv[i], "-Xlinker") == 0) @@ -245,6 +237,13 @@ lang_specific_driver (int *in_argc, const char *const **in_argv, if (quote) fatal ("argument to '%s' missing\n", quote); + /* If we know we don't have to do anything, bail now. */ + if (! added && library <= 0) + { + free (args); + return; + } + /* There's no point adding -shared-libgcc if we don't have a shared libgcc. */ #ifndef ENABLE_SHARED_LIBGCC diff --git a/contrib/gcc/libgcc2.c b/contrib/gcc/libgcc2.c index 5921d978cb4d..58ad32039a4b 100644 --- a/contrib/gcc/libgcc2.c +++ b/contrib/gcc/libgcc2.c @@ -1420,7 +1420,11 @@ __floatunditf (UDWtype u) #define F_MODE_OK(SIZE) \ (SIZE < DI_SIZE \ && SIZE > (DI_SIZE - SIZE + FSSIZE) \ - && !AVOID_FP_TYPE_CONVERSION(SIZE)) + /* Don't use IBM Extended Double TFmode for TI->SF calculations. \ + The conversion from long double to float suffers from double \ + rounding, because we convert via double. In any case, the \ + fallback code is faster. */ \ + && !IS_IBM_EXTENDED (SIZE)) #if defined(L_floatdisf) #define FUNC __floatdisf #define FSTYPE SFtype @@ -1511,21 +1515,13 @@ FUNC (DWtype u) hi = u >> shift; /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */ - if ((UWtype)u << (W_TYPE_SIZE - shift)) + if (u & (((DWtype)1 << shift) - 1)) hi |= 1; /* Convert the one word of data, and rescale. */ - FSTYPE f = hi, e; - if (shift == W_TYPE_SIZE) - e = Wtype_MAXp1_F; - /* The following two cases could be merged if we knew that the target - supported a native unsigned->float conversion. More often, we only - have a signed conversion, and have to add extra fixup code. */ - else if (shift == W_TYPE_SIZE - 1) - e = Wtype_MAXp1_F / 2; - else - e = (Wtype)1 << shift; - return f * e; + FSTYPE f = hi; + f *= (UDWtype)1 << shift; + return f; #endif } #endif @@ -1536,7 +1532,11 @@ FUNC (DWtype u) #define F_MODE_OK(SIZE) \ (SIZE < DI_SIZE \ && SIZE > (DI_SIZE - SIZE + FSSIZE) \ - && !AVOID_FP_TYPE_CONVERSION(SIZE)) + /* Don't use IBM Extended Double TFmode for TI->SF calculations. \ + The conversion from long double to float suffers from double \ + rounding, because we convert via double. In any case, the \ + fallback code is faster. */ \ + && !IS_IBM_EXTENDED (SIZE)) #if defined(L_floatundisf) #define FUNC __floatundisf #define FSTYPE SFtype @@ -1620,21 +1620,13 @@ FUNC (UDWtype u) hi = u >> shift; /* If we lost any nonzero bits, set the lsb to ensure correct rounding. */ - if ((UWtype)u << (W_TYPE_SIZE - shift)) + if (u & (((UDWtype)1 << shift) - 1)) hi |= 1; /* Convert the one word of data, and rescale. */ - FSTYPE f = hi, e; - if (shift == W_TYPE_SIZE) - e = Wtype_MAXp1_F; - /* The following two cases could be merged if we knew that the target - supported a native unsigned->float conversion. More often, we only - have a signed conversion, and have to add extra fixup code. */ - else if (shift == W_TYPE_SIZE - 1) - e = Wtype_MAXp1_F / 2; - else - e = (Wtype)1 << shift; - return f * e; + FSTYPE f = hi; + f *= (UDWtype)1 << shift; + return f; #endif } #endif diff --git a/contrib/gcc/libgcc2.h b/contrib/gcc/libgcc2.h index 4f8d5a410c5c..d15ab8d9dadf 100644 --- a/contrib/gcc/libgcc2.h +++ b/contrib/gcc/libgcc2.h @@ -119,16 +119,10 @@ extern short int __get_eh_table_version (struct exception_descriptor *); /* FIXME: This #ifdef probably should be removed, ie. enable the test for mips too. */ -/* Don't use IBM Extended Double TFmode for TI->SF calculations. - The conversion from long double to float suffers from double - rounding, because we convert via double. In other cases, going - through the software fp routines is much slower than the fallback. */ #ifdef __powerpc__ -#define AVOID_FP_TYPE_CONVERSION(SIZE) (SIZE == 106) -#elif defined(WIDEST_HARDWARE_FP_SIZE) -#define AVOID_FP_TYPE_CONVERSION(SIZE) (SIZE > WIDEST_HARDWARE_FP_SIZE) +#define IS_IBM_EXTENDED(SIZE) (SIZE == 106) #else -#define AVOID_FP_TYPE_CONVERSION(SIZE) 0 +#define IS_IBM_EXTENDED(SIZE) 0 #endif /* In the first part of this file, we are interfacing to calls generated diff --git a/contrib/gcc/loop-init.c b/contrib/gcc/loop-init.c index 00aa1beb638d..d2c63404516a 100644 --- a/contrib/gcc/loop-init.c +++ b/contrib/gcc/loop-init.c @@ -43,6 +43,13 @@ loop_optimizer_init (unsigned flags) struct loops *loops = XCNEW (struct loops); edge e; edge_iterator ei; + static bool first_time = true; + + if (first_time) + { + first_time = false; + init_set_costs (); + } /* Avoid annoying special cases of edges going to exit block. */ diff --git a/contrib/gcc/toplev.c b/contrib/gcc/toplev.c index 71c4a8b5d301..786ec128977b 100644 --- a/contrib/gcc/toplev.c +++ b/contrib/gcc/toplev.c @@ -1948,11 +1948,6 @@ lang_dependent_init (const char *name) provide a dummy function context for them. */ init_dummy_function_start (); init_expr_once (); - - /* Although the actions of init_set_costs are language-independent, - it uses optabs, so we cannot call it from backend_init. */ - init_set_costs (); - expand_dummy_function_end (); /* If dbx symbol table desired, initialize writing it and output the diff --git a/contrib/gcc/tree-ssa-address.c b/contrib/gcc/tree-ssa-address.c index 4fd8ae6cbab5..89f1cda7e72f 100644 --- a/contrib/gcc/tree-ssa-address.c +++ b/contrib/gcc/tree-ssa-address.c @@ -569,7 +569,7 @@ create_mem_ref (block_stmt_iterator *bsi, tree type, struct affine_tree_combination *addr) { tree mem_ref, tmp; - tree atype; + tree addr_type = build_pointer_type (type), atype; struct mem_address parts; addr_to_parts (addr, &parts); @@ -597,23 +597,18 @@ create_mem_ref (block_stmt_iterator *bsi, tree type, if (parts.symbol) { - tmp = build_addr (parts.symbol, current_function_decl); - gcc_assert (is_gimple_val (tmp)); + tmp = fold_convert (addr_type, + build_addr (parts.symbol, current_function_decl)); /* Add the symbol to base, eventually forcing it to register. */ if (parts.base) { - gcc_assert (TREE_TYPE (parts.base) == sizetype); - if (parts.index) - { - atype = TREE_TYPE (tmp); - parts.base = force_gimple_operand_bsi (bsi, - fold_build2 (PLUS_EXPR, atype, - fold_convert (atype, parts.base), + parts.base = force_gimple_operand_bsi (bsi, + fold_build2 (PLUS_EXPR, addr_type, + fold_convert (addr_type, parts.base), tmp), true, NULL_TREE); - } else { parts.index = parts.base;