Re: [RX] Add support for atomic operations
On Mon, 2016-05-09 at 15:18 +0100, Nick Clifton wrote: > > gcc/ChangeLog: > > * config/rx/rx-protos.h (is_interrupt_func, > > is_fast_interrupt_func): > > Forward declare. > > (rx_atomic_sequence): New class. > > * config/rx/rx.c (rx_print_operand): Use symbolic names for PSW > > bits. > > (is_interrupt_func, is_fast_interrupt_func): Make non-static > > and > > non-inline. > > (rx_atomic_sequence::rx_atomic_sequence, > > rx_atomic_sequence::~rx_atomic_sequence): New functions. > > * config/rx/rx.md (CTRLREG_PSW, CTRLREG_USP, CTRLREG_FPSW, > > CTRLREG_CPEN, > > CTRLREG_BPSW, CTRLREG_BPC, CTRLREG_ISP, CTRLREG_FINTV, > > CTRLREG_INTB): New constants. > > (FETCHOP): New code iterator. > > (fethcop_name, fetchop_name2): New iterator code attributes. > > (QIHI): New mode iterator. > > (atomic_exchange, atomic_exchangesi, xchg_mem, > > atomic_fetch_si, atomic_fetch_nandsi, > > atomic__fetchsi, atomic_nand_fetchsi): New > > patterns. > > Approved - please apply. > Sorry, but my original patch was buggy. There are two problems: First, when interrupts are re-enabled by restoring the PSW using the "mvtc" insn after the atomic sequence, the CC_REG is clobbered. It's not entirely clear to me why leaving out the CC_REG clobber in "mvtc" is of any benefit. Instead of adding a new "mvtc" pattern, I've just added the clobber to the existing one. With that wrong code issues around atomic sequences such as atomic decrement and test for zero are fixed. Second, the atomic__fetchsi works only with commutative operations because the memory operand and the register operand are swapped in the expander. Thus it produces wrong code for subtraction operations. The fix is to use a separate pattern for subtraction and not twist the operands. The attached patch fixes those issues. OK for trunk? Cheers, Oleg gcc/ChangeLog: * config/rx/rx.md (FETCHOP_NO_MINUS): New code iterator. (atomic__fetchsi): Extract minus operator into ... (atomic_sub_fetchsi): ... this new pattern. (mvtc): Add CC_REG clobber.Index: gcc/config/rx/rx.md === --- gcc/config/rx/rx.md (revision 236761) +++ gcc/config/rx/rx.md (working copy) @@ -2158,6 +2158,7 @@ ;; Atomic operations. (define_code_iterator FETCHOP [plus minus ior xor and]) +(define_code_iterator FETCHOP_NO_MINUS [plus ior xor and]) (define_code_attr fetchop_name [(plus "add") (minus "sub") (ior "or") (xor "xor") (and "and")]) @@ -2258,12 +2259,14 @@ }) ;; read - modify - write - return new value +;; Because subtraction is not commutative we need to specify a different +;; set of patterns for it. (define_expand "atomic__fetchsi" [(set (match_operand:SI 0 "register_operand") - (FETCHOP:SI (match_operand:SI 1 "rx_restricted_mem_operand") - (match_operand:SI 2 "register_operand"))) + (FETCHOP_NO_MINUS:SI (match_operand:SI 1 "rx_restricted_mem_operand") + (match_operand:SI 2 "register_operand"))) (set (match_dup 1) - (FETCHOP:SI (match_dup 1) (match_dup 2))) + (FETCHOP_NO_MINUS:SI (match_dup 1) (match_dup 2))) (match_operand:SI 3 "const_int_operand")] ;; memory model "" { @@ -2277,6 +2280,25 @@ DONE; }) +(define_expand "atomic_sub_fetchsi" + [(set (match_operand:SI 0 "register_operand") + (minus:SI (match_operand:SI 1 "rx_restricted_mem_operand") + (match_operand:SI 2 "rx_source_operand"))) + (set (match_dup 1) + (minus:SI (match_dup 1) (match_dup 2))) + (match_operand:SI 3 "const_int_operand")] ;; memory model + "" +{ + { +rx_atomic_sequence seq (current_function_decl); + +emit_move_insn (operands[0], operands[1]); +emit_insn (gen_subsi3 (operands[0], operands[0], operands[2])); +emit_move_insn (operands[1], operands[0]); + } + DONE; +}) + (define_expand "atomic_nand_fetchsi" [(set (match_operand:SI 0 "register_operand") (not:SI (and:SI (match_operand:SI 1 "rx_restricted_mem_operand") @@ -2674,18 +2696,16 @@ ) ;; Move to control register +;; This insn can be used in atomic sequences to restore the previous PSW +;; and re-enable interrupts. Because of that it always clobbers the CC_REG. (define_insn "mvtc" [(unspec_volatile:SI [(match_operand:SI 0 "immediate_operand" "i,i") (match_operand:SI 1 "nonmemory_operand" "r,i")] - UNSPEC_BUILTIN_MVTC)] + UNSPEC_BUILTIN_MVTC) + (clobber (reg:CC CC_REG))] "" "mvtc\t%1, %C0" [(set_attr "length" "3,7")] - ;; Ignore possible clobbering of the comparison flags in the - ;; PSW register. This is a cc0 target so any cc0 setting - ;; instruction will always be paired with a cc0 user, without - ;; the possibility of this instruction being placed in between - ;; them. ) ;; Move to interrupt priority level
Re: [C++ Patch] PR 71105 ("lambdas with default captures improperly have function pointer conversions")
OK for trunk and 6. The regression is from another issue; this bug just prevents a simple workaround for that bug. Jason
Re: libiberty: Don't needlessly clear xmemdup allocated memory
Alan Modra writes: > * xmemdup.c (xmemdup): Use xmalloc rather than xcalloc. In glibc at least, calloc can be faster than memset if the kernel is pre-zero-ing pages. Thus, in those cases, your change makes the code slower by adding an unneeded memset. Have you considered these cases?
Re: [PATCH] BFD: Fix unmatched #ifndef and #endif
On Sun, May 29, 2016 at 10:26:39AM +0900, Honggyu Kim wrote: > bfd/bfd-in.h has '#ifndef __BFD_H_SEEN__' statement at the beginning of > the header file but do not have '#endif' at the end. > > * bfd/bfd-in.h: Add #endif statment I just found my mistake. Sorry that I sent this to wrong mailing list. It should have gone to gdb mailing list. Honggyu
[PATCH] BFD: Fix unmatched #ifndef and #endif
bfd/bfd-in.h has '#ifndef __BFD_H_SEEN__' statement at the beginning of the header file but do not have '#endif' at the end. * bfd/bfd-in.h: Add #endif statment --- bfd/bfd-in.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 196bd70..ba36ee1 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -1026,3 +1026,5 @@ extern bfd_boolean v850_elf_create_sections extern bfd_boolean v850_elf_set_note (bfd *, unsigned int, unsigned int); + +#endif -- 1.9.1
[wwwdocs] gcc-4.8/changes.html -- adjust link to manual
This is a case of X86 vs x86, subtle, but meaningful. Committed. Gerald Index: gcc-4.8/changes.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-4.8/changes.html,v retrieving revision 1.137 diff -u -r1.137 changes.html --- gcc-4.8/changes.html28 Feb 2016 20:44:14 - 1.137 +++ gcc-4.8/changes.html28 May 2016 23:55:25 - @@ -597,7 +597,7 @@ one string literal argument, the ISA feature. For example, __builtin_cpu_supports("ssse3") returns a positive integer if the run-time CPU supports SSSE3 instructions. Please refer to the https://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions";> + href="https://gcc.gnu.org/onlinedocs/gcc/x86-Built-in-Functions.html";> user manual for the list of valid ISA names recognized. Caveat: If these built-in functions are called before any static
[wwwdocs] readings.html -- Tilera is now Mellanox
Mellanox acquired Tilera and the web pages redirect accordingly; except for those doc links, but those were easy enough to find. Applied. Gerald Index: readings.html === RCS file: /cvs/gcc/wwwdocs/htdocs/readings.html,v retrieving revision 1.249 diff -u -r1.249 readings.html --- readings.html 28 May 2016 20:40:34 - 1.249 +++ readings.html 28 May 2016 23:15:11 - @@ -273,13 +273,13 @@ tilegx - Manufacturer: Tilera - http://www.tilera.com/scm/docs/index.html";>Documentation + Manufacturer: Mellanox + http://www.mellanox.com/repository/solutions/tile-scm/docs/";>Documentation tilepro - Manufacturer: Tilera - http://www.tilera.com/scm/docs/index.html";>Documentation + Manufacturer: Mellanox + http://www.mellanox.com/repository/solutions/tile-scm/docs/";>Documentation v850
[C++ Patch] PR 71105 ("lambdas with default captures improperly have function pointer conversions")
Hi, I think submitter is right that by the grammar even an alone capture-default counts as a lambda-capture, thus a conversion function to pointer to function should not be added. I don't see how this issue may count as a regression, but, assuming the analysis is correct, the fix should be safe enough for gcc-6-branch too. Tested x86_64-linux. Thanks, Paolo. / /cp 2016-05-30 Paolo Carlini PR c++/71105 * lambda.c (maybe_add_lambda_conv_op): Early return also when LAMBDA_EXPR_DEFAULT_CAPTURE_MODE != CPLD_NONE. /testsuite 2016-05-30 Paolo Carlini PR c++/71105 * g++.dg/cpp0x/lambda/lambda-conv11.C: New. * g++.dg/cpp1y/lambda-conv1.C: Likewise. Index: cp/lambda.c === --- cp/lambda.c (revision 236852) +++ cp/lambda.c (working copy) @@ -872,8 +872,10 @@ maybe_add_lambda_conv_op (tree type) bool nested = (cfun != NULL); bool nested_def = decl_function_context (TYPE_MAIN_DECL (type)); tree callop = lambda_function (type); + tree lam = CLASSTYPE_LAMBDA_EXPR (type); - if (LAMBDA_EXPR_CAPTURE_LIST (CLASSTYPE_LAMBDA_EXPR (type)) != NULL_TREE) + if (LAMBDA_EXPR_CAPTURE_LIST (lam) != NULL_TREE + || LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lam) != CPLD_NONE) return; if (processing_template_decl) Index: testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C === --- testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C (revision 0) +++ testsuite/g++.dg/cpp0x/lambda/lambda-conv11.C (working copy) @@ -0,0 +1,10 @@ +// PR c++/71105 +// { dg-do compile { target c++11 } } + +void foo() +{ + int i; + static_cast([i]{}); // { dg-error "invalid static_cast" } + static_cast([=]{}); // { dg-error "invalid static_cast" } + static_cast([&]{}); // { dg-error "invalid static_cast" } +} Index: testsuite/g++.dg/cpp1y/lambda-conv1.C === --- testsuite/g++.dg/cpp1y/lambda-conv1.C (revision 0) +++ testsuite/g++.dg/cpp1y/lambda-conv1.C (working copy) @@ -0,0 +1,13 @@ +// PR c++/71105 +// { dg-do compile { target c++14 } } + +void foo() +{ + int i; + static_cast([i](auto){}); // { dg-error "invalid static_cast" } + static_cast([=](auto){}); // { dg-error "invalid static_cast" } + static_cast([&](auto){}); // { dg-error "invalid static_cast" } + static_cast([i](auto x){ return x; }); // { dg-error "invalid static_cast" } + static_cast([=](auto x){ return x; }); // { dg-error "invalid static_cast" } + static_cast([&](auto x){ return x; }); // { dg-error "invalid static_cast" } +}
[wwwdocs] Use https for sourceware.org.
Applied. Gerald Index: htdocs/c99status.html === RCS file: /cvs/gcc/wwwdocs/htdocs/c99status.html,v retrieving revision 1.63 diff -u -r1.63 c99status.html --- htdocs/c99status.html 6 Nov 2014 21:19:42 - 1.63 +++ htdocs/c99status.html 28 May 2016 20:26:35 - @@ -385,11 +385,11 @@ Compiler support is needed for thorough support of math_errhandling; see messages http://sourceware.org/ml/libc-hacker/2000-06/msg8.html";>1, +href="https://sourceware.org/ml/libc-hacker/2000-06/msg8.html";>1, http://sourceware.org/ml/libc-hacker/2000-06/msg00014.html";>2, +href="https://sourceware.org/ml/libc-hacker/2000-06/msg00014.html";>2, http://sourceware.org/ml/libc-hacker/2000-06/msg00015.html";>3 +href="https://sourceware.org/ml/libc-hacker/2000-06/msg00015.html";>3 on this subject to libc-hacker. The compiler needs to mark its output from compilations using -fno-trapping-math or -fno-math-errno, possibly using Index: htdocs/readings.html === RCS file: /cvs/gcc/wwwdocs/htdocs/readings.html,v retrieving revision 1.248 diff -u -r1.248 readings.html --- htdocs/readings.html27 May 2016 20:47:27 - 1.248 +++ htdocs/readings.html28 May 2016 20:26:35 - @@ -132,7 +132,7 @@ fr30 Manufacturer: Fujitsu Acronym stands for: Fujitsu RISC - GDB includes a http://sourceware.org/cgen/";>CGEN + GDB includes a https://sourceware.org/cgen/";>CGEN generated simulator. Index: htdocs/svnwrite.html === RCS file: /cvs/gcc/wwwdocs/htdocs/svnwrite.html,v retrieving revision 1.36 diff -u -r1.36 svnwrite.html --- htdocs/svnwrite.html23 Dec 2015 05:33:02 - 1.36 +++ htdocs/svnwrite.html28 May 2016 20:26:35 - @@ -40,7 +40,7 @@ overse...@gcc.gnu.org to add access to the GCC repository. Include the name of your sponsor and CC: her. If you do not have an account yet, use http://sourceware.org/cgi-bin/pdw/ps_form.cgi";>this form, +href="https://sourceware.org/cgi-bin/pdw/ps_form.cgi";>this form, again specifying your sponsor. We will then provision you on Index: htdocs/gcc-4.5/changes.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-4.5/changes.html,v retrieving revision 1.114 diff -u -r1.114 changes.html --- htdocs/gcc-4.5/changes.html 28 May 2016 20:16:29 - 1.114 +++ htdocs/gcc-4.5/changes.html 28 May 2016 20:26:36 - @@ -436,7 +436,7 @@ present a more intuitive view of components when used with appropriately-advanced versions of GDB. For more information, please consult the -more http://sourceware.org/gdb/wiki/STLSupport";>detailed +more https://sourceware.org/gdb/wiki/STLSupport";>detailed description. The default behavior for comparing typeinfo names has changed, Index: htdocs/gcc-4.6/changes.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-4.6/changes.html,v retrieving revision 1.153 diff -u -r1.153 changes.html --- htdocs/gcc-4.6/changes.html 14 Nov 2015 23:40:21 - 1.153 +++ htdocs/gcc-4.6/changes.html 28 May 2016 20:26:36 - @@ -34,7 +34,7 @@ Versions of the GNU C library up to and including 2.11.1 included an http://sourceware.org/bugzilla/show_bug.cgi?id=10401";>incorrect +href="https://sourceware.org/bugzilla/show_bug.cgi?id=10401";>incorrect implementation of the cproj function. GCC optimizes its builtin cproj according to the behavior specified and allowed by the ISO C99 standard. If you want to Index: htdocs/projects/beginner.html === RCS file: /cvs/gcc/wwwdocs/htdocs/projects/beginner.html,v retrieving revision 1.63 diff -u -r1.63 beginner.html --- htdocs/projects/beginner.html 22 Jan 2016 05:28:41 - 1.63 +++ htdocs/projects/beginner.html 28 May 2016 20:26:37 - @@ -836,7 +836,7 @@ Implement a macro preprocessor for .md files. It should act like the macro processor for http://sourceware.org/cgen/";>CGEN, which also uses +href="https://sourceware.org/cgen/";>CGEN, which also uses RTL-ish definition files. You can start with conditional blocks and include files. Remember that we already have define_constants.
[wwwdocs] gcc-4.5/changes.html: signalling NaN -> signaling NaN
Jim changed this for the documentation (in gcc/doc) earlier this month. This mirrors his change for our web page. Committed. Gerald Index: htdocs/gcc-4.5/changes.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-4.5/changes.html,v retrieving revision 1.113 diff -u -r1.113 changes.html --- htdocs/gcc-4.5/changes.html 6 Dec 2014 16:29:22 - 1.113 +++ htdocs/gcc-4.5/changes.html 28 May 2016 20:13:51 - @@ -436,7 +436,7 @@ present a more intuitive view of components when used with appropriately-advanced versions of GDB. For more information, please consult the -more http://sourceware.org/gdb/wiki/STLSupport";>detailed +more https://sourceware.org/gdb/wiki/STLSupport";>detailed description. The default behavior for comparing typeinfo names has changed, @@ -458,10 +458,10 @@ in 4.4). The -finit-real= option now also supports the value -snan for signalling not-a-number; to be effective, +snan for signaling not-a-number; to be effective, one additionally needs to enable trapping (e.g. via -ffpe-trap=). Note: Compile-time optimizations can -turn a signalling NaN into a quiet one. +turn a signaling NaN into a quiet one. The new option -fcheck= has been added with the options bounds, array-temps,
Re: [PATCH][wwwdocs] Improve arm and aarch64-related info in readings.html
Hi Kyrill, On Thu, 19 May 2016, Kyrill Tkachov wrote: > I noticed that we have a readings.html page that has pointers to > documentation of various backends that GCC supports. The info on arm > seems a bit out of date and somewhat confusing, and there is no entry > for aarch64. This patch tries to address that. I see you have not applied this yet. In case you were waiting for any further approvals beyond James': (a) His is sufficient for doc and web pages around AArch64, and (b) I agree, too. :-) Gerald
[PATCH] match.pd: optimize unsigned mul overflow check
Hello, For unsigned A, B, 'A > -1 / B' is a nice predicate for checking whether 'A*B' overflows (or 'B && A > -1 / B' if B may be zero). Let's optimize it to an invocation of __builtin_mul_overflow to avoid the divide operation. The following patch implements that as a match.pd transformation. It looks like there's a similar thing going on for add/sub overflow check in tree-ssa-math-opts, but handling this in match.pd seems reasonable. (user code using the above test would probably also compute 'A*B' a few statements later; notably, today GCC cannot CSE plain 'A*B' to REALPART_EXPR of the builtin call on GIMPLE; on x86 it gets cleaned up on RTL) Thanks to Marc for helping get this in shape on the Bugzilla. Bootstrapped and regtested on x86_64, OK for trunk? gcc/ 2016-05-28 Alexander Monakov Marc Glisse PR tree-optimization/71289 * match.pd (-1 / B < A, A > -1 / B): New transformations. gcc/testsuite/ 2016-05-28 Alexander Monakov PR tree-optimization/71289 * gcc.dg/pr71289.c: New test. diff --git a/gcc/match.pd b/gcc/match.pd index 8d05e86..953c070 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2657,6 +2657,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && types_match (TREE_TYPE (@0), TREE_TYPE (@1))) (out (imagpart @2) { build_zero_cst (TREE_TYPE (@0)); } +/* For unsigned operands, A > -1 / B checks whether A * B would overflow. + Simplify it to __builtin_mul_overflow (A, B, ). */ +/* -1 / B < A */ +(for cmp (lt ge) + out (ne eq) + (simplify + (cmp (trunc_div:s integer_all_onesp @1) @0) + (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0))) + (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); } +(out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); }) + +/* A > -1 / B */ +(for cmp (gt le) + out (ne eq) + (simplify + (cmp @0 (trunc_div:s integer_all_onesp @1)) + (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0))) + (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); } +(out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); }) /* Simplification of math builtins. These rules must all be optimizations as well as IL simplifications. If there is a possibility that the new diff --git a/gcc/testsuite/gcc.dg/pr71289.c b/gcc/testsuite/gcc.dg/pr71289.c new file mode 100644 index 000..39837b9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr71289.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized-raw" } */ + +int f(unsigned a, unsigned b, unsigned *c) +{ + if (a > -1 / b) +return -1; + *c = a * b; + return 0; +} + +void g(unsigned long long a, unsigned long long b, unsigned long long *c) +{ + if (a <= -1 / b) +*c = a * b; +} + +/* { dg-final { scan-tree-dump-not "trunc_div_expr" "optimized" } } */
[PATCH,DOC] doc/install.texi: Use https for shop.fsf.org.
Committed to mainline; I'll possibly push this back to at least GCC 6 later. Gerald 2016-05-28 Gerald Pfeifer * doc/install.texi: Use https for shop.fsf.org. Index: doc/install.texi === --- doc/install.texi(revision 236852) +++ doc/install.texi(working copy) @@ -3161,7 +3161,7 @@ @samp{make pdf} in place of @samp{make dvi}, you can create documentation in the form of @file{.pdf} files; this requires @command{texi2pdf}, which is included with Texinfo version 4.8 and later. You can also -@uref{http://shop.fsf.org/,,buy printed manuals from the +@uref{https://shop.fsf.org/,,buy printed manuals from the Free Software Foundation}, though such manuals may not be for the most recent version of GCC@.
[v3 PATCH] Protect allocator-overloads of tuple-from-tuple constructors from cases that would create dangling references.
The fix to avoid binding dangling references to temporaries for tuple's constructors that take tuples of different type didn't include the fix for allocator overloads. That was just lazy, and I should feel ashamed. This patch fixes it, and takes us one step further to pass libc++'s testsuite for tuple. The added _NonNestedTuple checks could actually be folded into the recently-added _TMCT alias, but I'll do that as a separate cleanup patch. For now, this should do as an easy and straightforward fix. Tested on Linux-x64. 2016-05-28 Ville Voutilainen Protect allocator-overloads of tuple-from-tuple constructors from cases that would create dangling references. * include/std/tuple (tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&), tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&)): Add a check for _NonNestedTuple. * testsuite/20_util/tuple/cons/nested_tuple_construct.cc: Adjust. diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index ea88793..17c8204 100644 --- a/libstdc++-v3/include/std/tuple +++ b/libstdc++-v3/include/std/tuple @@ -769,11 +769,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in) : _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { } - template::template _ConstructibleTuple<_UElements...>() && _TMCT<_UElements...>::template -_ImplicitlyConvertibleTuple<_UElements...>(), +_ImplicitlyConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template +_NonNestedTuple&&>(), bool>::type=true> tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple<_UElements...>& __in) @@ -781,11 +784,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static_cast&>(__in)) { } - template::template _ConstructibleTuple<_UElements...>() && !_TMCT<_UElements...>::template -_ImplicitlyConvertibleTuple<_UElements...>(), +_ImplicitlyConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template +_NonNestedTuple&&>(), bool>::type=false> explicit tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple<_UElements...>& __in) @@ -793,11 +799,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static_cast&>(__in)) { } - template::template _MoveConstructibleTuple<_UElements...>() && _TMCT<_UElements...>::template -_ImplicitlyMoveConvertibleTuple<_UElements...>(), +_ImplicitlyMoveConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template +_NonNestedTuple&&>(), bool>::type=true> tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_UElements...>&& __in) @@ -805,11 +814,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } - template::template _MoveConstructibleTuple<_UElements...>() && !_TMCT<_UElements...>::template -_ImplicitlyMoveConvertibleTuple<_UElements...>(), +_ImplicitlyMoveConvertibleTuple<_UElements...>() + && _TNTC<_Dummy>::template +_NonNestedTuple&&>(), bool>::type=false> explicit tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_UElements...>&& __in) diff --git a/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc b/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc index 39a4f73..7f64239 100644 --- a/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc +++ b/libstdc++-v3/testsuite/20_util/tuple/cons/nested_tuple_construct.cc @@ -63,6 +63,32 @@ void f3() std::tuple> t3{std::move(t2)}; } +void f4() +{ + std::allocator a; + X v; + std::tuple t1{std::allocator_arg, a, v}; + std::tuple&&> t2{std::allocator_arg, a, std::move(t1)}; + std::tuple> t3{std::allocator_arg, a, std::move(t2)}; +} + +void f5() +{ + std::allocator a; + X v; + std::tuple t1{std::allocator_arg, a, std::move(v)}; + std::tuple&&> t2{std::allocator_arg, a, std::move(t1)}; + std::tuple> t3{std::allocator_arg, a, std::move(t2)}; +} + +void f6() +{ + std::allocator a; + std::tuple t1{std::allocator_arg, a, X{}}; + std::tuple&&> t2{std::allocator_arg, a, std::move(t1)}; + std::tuple> t3{std::allocator_arg, a, std::move(t2)}; +} + int main() { f(); @@ -74,4 +100,13 @@ int main() f3(); VERIFY(result == "DefMoveDtorMoveDtorDtor"); result = ""; + f4(); + VERIFY(result == "DefCopyMoveDtorDtorDtor"); + result = ""; + f5(); + VERIFY(result == "DefMoveMoveDtorDtorDtor"); + result = ""; + f6(); +
Use likely upper bound in ivopts
Hi, this patch updates ivopts to use likely upper bounds. Bootstrapped/regtested x86_64-linux and comitted. (I will update all the loop passes, but want to do it one by one so we have performance tracked.) Honza * tree-ssa-loop-ivopts.c (estimated_stmt_executions_int): Use likely_max_stmt_executions_int. Index: tree-ssa-loop-ivopts.c === --- tree-ssa-loop-ivopts.c (revision 236850) +++ tree-ssa-loop-ivopts.c (working copy) @@ -127,7 +127,7 @@ avg_loop_niter (struct loop *loop) HOST_WIDE_INT niter = estimated_stmt_executions_int (loop); if (niter == -1) { - niter = max_stmt_executions_int (loop); + niter = likely_max_stmt_executions_int (loop); if (niter == -1 || niter > AVG_LOOP_NITER (loop)) return AVG_LOOP_NITER (loop); }
Use likely upper bound in array prefetching
Hi, this patch makes array prefetching to use likely upper bound on number of iterations. This restores the behaviour on prefetch-5.c testcase. Honza * gcc.dg/tree-ssa/prefetch-5.c: Remove xfail. * tree-ssa-loop-prefetch.c (loop_prefetch_arrays): Use likely_max_stmt_executions_int. Index: testsuite/gcc.dg/tree-ssa/prefetch-5.c === --- testsuite/gcc.dg/tree-ssa/prefetch-5.c (revision 236815) +++ testsuite/gcc.dg/tree-ssa/prefetch-5.c (working copy) @@ -56,5 +56,5 @@ int loop5 (int n, struct tail5 *x) /* Until we are able to track likely upper bounds, we can't really work out that small trailing arrays should not be prefetched. */ -/* { dg-final { scan-tree-dump-times "Issued prefetch" 2 "aprefetch" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "Not prefetching" 1 "aprefetch" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "Issued prefetch" 2 "aprefetch" } } */ +/* { dg-final { scan-tree-dump-times "Not prefetching" 1 "aprefetch" } } */ Index: tree-ssa-loop-prefetch.c === --- tree-ssa-loop-prefetch.c(revision 236815) +++ tree-ssa-loop-prefetch.c(working copy) @@ -1848,7 +1848,7 @@ loop_prefetch_arrays (struct loop *loop) ahead = (PREFETCH_LATENCY + time - 1) / time; est_niter = estimated_stmt_executions_int (loop); if (est_niter == -1) -est_niter = max_stmt_executions_int (loop); +est_niter = likely_max_stmt_executions_int (loop); /* Prefetching is not likely to be profitable if the trip count to ahead ratio is too small. */
Fix branch predictor reporting
Hi, this patch moves call of report_predictor_hitrates after fake edges are removed because those affects post dominance and consequently the prediction placement. Bootstrapped/regtested x86_64-linux, comitted. Honza * profile.c (compute_branch_probabilities): Do not report hitrates here. (branch_prob): Report hitrates here. * predict.c (gimple_predict_edge): Do not assert profile status; fix formatting issues. Index: profile.c === --- profile.c (revision 236815) +++ profile.c (working copy) @@ -845,8 +845,6 @@ compute_branch_probabilities (unsigned c fputc ('\n', dump_file); fputc ('\n', dump_file); } - if (dump_file && (dump_flags & TDF_DETAILS)) -report_predictor_hitrates (); free_aux_for_blocks (); } @@ -1331,6 +1329,8 @@ branch_prob (void) values.release (); free_edge_list (el); coverage_end_function (lineno_checksum, cfg_checksum); + if (dump_file && (dump_flags & TDF_DETAILS)) +report_predictor_hitrates (); } /* Union find algorithm implementation for the basic blocks using Index: predict.c === --- predict.c (revision 236848) +++ predict.c (working copy) @@ -593,10 +593,10 @@ rtl_predict_edge (edge e, enum br_predic void gimple_predict_edge (edge e, enum br_predictor predictor, int probability) { - gcc_assert (profile_status_for_fn (cfun) != PROFILE_GUESSED); - if ((e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun) && EDGE_COUNT (e->src->succs) > - 1) - && flag_guess_branch_prob && optimize) + if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun) + && EDGE_COUNT (e->src->succs) > 1 + && flag_guess_branch_prob + && optimize) { struct edge_prediction *i = XNEW (struct edge_prediction); edge_prediction *&preds = bb_predictions->get_or_insert (e->src);
Re: Enable loop peeling at -O3
Hello, thanks for feedback. I updated the patch and also noticed that -fpeel-all-loops gives up when upper bound is known but it is large and when the max-peel-insns is too small to permit peeling max-peel-times. This patch also updates pr61743-2.c which are now peeled before we manage to propagate the proper loop bound. Bootstrapped/regtested x86_64-linux. OK? Honza * common.opt (flag_peel_all_loops): New option. * doc/invoke.texi: (-fpeel-loops): Update documentation. (-fpeel-all-loops): Document. * opts.c (default_options): Add OPT_fpeel_loops to -O3+. * toplev.c (process_options): flag_peel_all_loops implies flag_peel_loops. * tree-ssa-lop-ivcanon.c (try_peel_loop): Update comment; handle -fpeel-all-loops, use likely estimates. * gcc.dg/tree-ssa/peel1.c: New testcase. * gcc.dg/tree-ssa/peel2.c: New testcase. * gcc.dg/tree-ssa/pr61743-1.c: Pass -fno-peel-loops. * gcc.dg/tree-ssa/pr61743-2.c: Pass -fno-peel-loops. Index: common.opt === --- common.opt (revision 236815) +++ common.opt (working copy) @@ -1840,6 +1840,10 @@ fpeel-loops Common Report Var(flag_peel_loops) Optimization Perform loop peeling. +fpeel-all-loops +Common Report Var(flag_peel_all_loops) Optimization +Perform loop peeling of all loops. + fpeephole Common Report Var(flag_no_peephole,0) Optimization Enable machine specific peephole optimizations. Index: doc/invoke.texi === --- doc/invoke.texi (revision 236815) +++ doc/invoke.texi (working copy) @@ -375,7 +375,7 @@ Objective-C and Objective-C++ Dialects}. -fno-sched-interblock -fno-sched-spec -fno-signed-zeros @gol -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss @gol -fomit-frame-pointer -foptimize-sibling-calls @gol --fpartial-inlining -fpeel-loops -fpredictive-commoning @gol +-fpartial-inlining -fpeel-loops -fpeel-all-loops -fpredictive-commoning @gol -fprefetch-loop-arrays @gol -fprofile-correction @gol -fprofile-use -fprofile-use=@var{path} -fprofile-values @gol @@ -6338,7 +6338,8 @@ by @option{-O2} and also turns on the @o @option{-fgcse-after-reload}, @option{-ftree-loop-vectorize}, @option{-ftree-loop-distribute-patterns}, @option{-fsplit-paths} @option{-ftree-slp-vectorize}, @option{-fvect-cost-model}, -@option{-ftree-partial-pre} and @option{-fipa-cp-clone} options. +@option{-ftree-partial-pre}, @option{-fpeel-loops} +and @option{-fipa-cp-clone} options. @item -O0 @opindex O0 @@ -8593,7 +8594,7 @@ data about values of expressions in the With @option{-fbranch-probabilities}, it reads back the data gathered from profiling values of expressions for usage in optimizations. -Enabled with @option{-fprofile-generate} and @option{-fprofile-use}. +Enabled with @option{-fprofile-generate} and/or @option{-fprofile-use}. @item -fprofile-reorder-functions @opindex fprofile-reorder-functions @@ -8661,10 +8662,17 @@ the loop is entered. This usually makes @item -fpeel-loops @opindex fpeel-loops Peels loops for which there is enough information that they do not -roll much (from profile feedback). It also turns on complete loop peeling -(i.e.@: complete removal of loops with small constant number of iterations). - -Enabled with @option{-fprofile-use}. +roll much (from profile feedback or static analysis). It also turns on +complete loop peeling (i.e.@: complete removal of loops with small constant +number of iterations). + +Enabled with @option{-O3} and @option{-fprofile-use}. + +@item -fpeel-all-loops +@opindex fpeel-all-loops +Peel all loops, even if their number of iterations is uncertain when +the loop is entered. For loops with large number of iterations this leads +to wasted code size. @item -fmove-loop-invariants @opindex fmove-loop-invariants Index: opts.c === --- opts.c (revision 236815) +++ opts.c (working copy) @@ -535,6 +535,7 @@ static const struct default_options defa { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC }, { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 }, { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 }, +{ OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 }, /* -Ofast adds optimizations to -O3. */ { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 }, Index: testsuite/gcc.dg/tree-ssa/peel1.c === --- testsuite/gcc.dg/tree-ssa/peel1.c (revision 0) +++ testsuite/gcc.dg/tree-ssa/peel1.c (working copy) @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-cunroll-details" } */ +struct foo {int b; int a[3];} foo; +void add(struct foo *a,int l) +{ + int i; + for (i=0;ia[i]++; +} +/* { dg-final { scan-tree-dump "Loop 1 likely iterates at most 3 times." "cunroll"} } *
[PATCH] Update documentation for ARM architecture
From: Stefan BrĂ¼ns * use lexicographical ordering, as "gcc -march=foo" does * add armv6k, armv6z, arm6zk * remove ep9312, it is only valid for -mcpu * add armv6s-m and document it, as it is no official ARM name. Support for the OS extension/SVC is mandatory, non-supporting implementations are deprecated (ARMv6-M Architecture Reference Manual, B.2) --- gcc/doc/invoke.texi | 17 - 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9e92133..6942b83 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -14041,15 +14041,22 @@ name to determine what kind of instructions it can emit when generating assembly code. This option can be used in conjunction with or instead of the @option{-mcpu=} option. Permissible names are: @samp{armv2}, @samp{armv2a}, @samp{armv3}, @samp{armv3m}, @samp{armv4}, @samp{armv4t}, -@samp{armv5}, @samp{armv5t}, @samp{armv5e}, @samp{armv5te}, -@samp{armv6}, @samp{armv6j}, -@samp{armv6t2}, @samp{armv6z}, @samp{armv6kz}, @samp{armv6-m}, -@samp{armv7}, @samp{armv7-a}, @samp{armv7-r}, @samp{armv7-m}, @samp{armv7e-m}, +@samp{armv5}, @samp{armv5e}, @samp{armv5t}, @samp{armv5te}, +@samp{armv6}, @samp{armv6-m}, @samp{armv6j}, @samp{armv6k}, +@samp{armv6kz}, @samp{armv6s-m}, +@samp{armv6t2}, @samp{armv6z}, @samp{armv6zk}, +@samp{armv7}, @samp{armv7-a}, @samp{armv7-m}, @samp{armv7-r}, @samp{armv7e-m}, @samp{armv7ve}, @samp{armv8-a}, @samp{armv8-a+crc}, @samp{armv8.1-a}, -@samp{armv8.1-a+crc}, @samp{iwmmxt}, @samp{iwmmxt2}, @samp{ep9312}. +@samp{armv8.1-a+crc}, @samp{iwmmxt}, @samp{iwmmxt2}. Architecture revisions older than @option{armv4t} are deprecated. +@option{-march=armv6s-m} is the armv6-m architecture with support for +the (now mandatory) SVC instruction. + +@option{-march=armv6zk} is an alias for armv6kz, existing for backwards +compatibility. + @option{-march=armv7ve} is the armv7-a architecture with virtualization extensions. -- 2.8.2
Re: [PATCH] Clean up tests where a later dg-do completely overrides another.
On Wed, 18 May 2016, Jeff Law wrote: > FWIW, Fedora 24 uses dejagnu-1.6. Not sure about other distributions. openSUSE Tumbleweed is on 1.5.3, but I'm pretty sure we can get that updated. FreeBSD Ports are at 1.6. IMHO, go ahead. Gerald
Do not predict one edge by the same path based predictor multiple times
Hi, paths that predict control dependence edges which controls execution of some unlikely piece of code may end up putting multiple predictions at one edge (such that if one edge controls calls to multiple noreturn functions). These predictions can then combine into quite insanely small probabilities which is not really expected behaviour. This patch limits predict_paths_for_bb to drop at most one branch prediction on the edge (and also fixes potential nonlinearlity). Bootstrapped/regtested x86_64-linux, will commit it shortly. Honza * predict.c (edge_predicted_by_p): New function. (predict_paths_for_bb): Do not put multiple predictions of the same type on one edge. Index: predict.c === --- predict.c (revision 236815) +++ predict.c (working copy) @@ -478,6 +478,31 @@ gimple_predicted_by_p (const_basic_block return false; } +/* Return true if the one of outgoing edges is already predicted by + PREDICTOR for edge E predicted as TAKEN. */ + +bool +edge_predicted_by_p (edge e, enum br_predictor predictor, bool taken) +{ + struct edge_prediction *i; + basic_block bb = e->src; + edge_prediction **preds = bb_predictions->get (bb); + if (!preds) +return false; + + int probability = predictor_info[(int) predictor].hitrate; + + if (taken != TAKEN) +probability = REG_BR_PROB_BASE - probability; + + for (i = *preds; i; i = i->ep_next) +if (i->ep_predictor == predictor + && i->ep_edge == e + && i->ep_probability == probability) + return true; + return false; +} + /* Return true when the probability of edge is reliable. The profile guessing code is good at predicting branch outcome (ie. @@ -2415,7 +2440,10 @@ predict_paths_for_bb (basic_block cur, b regions that are only reachable by abnormal edges. We simply prevent visiting given BB twice. */ if (found) -predict_edge_def (e, pred, taken); + { + if (!edge_predicted_by_p (e, pred, taken)) +predict_edge_def (e, pred, taken); + } else if (bitmap_set_bit (visited, e->src->index)) predict_paths_for_bb (e->src, e->src, pred, taken, visited); }
libiberty: Don't needlessly clear xmemdup allocated memory
OK to apply? * xmemdup.c (xmemdup): Use xmalloc rather than xcalloc. diff --git a/libiberty/xmemdup.c b/libiberty/xmemdup.c index aa56f0b..4602afd 100644 --- a/libiberty/xmemdup.c +++ b/libiberty/xmemdup.c @@ -1,4 +1,4 @@ -/* xmemdup.c -- Duplicate a memory buffer, using xcalloc. +/* xmemdup.c -- Duplicate a memory buffer, using xmalloc. This trivial function is in the public domain. Jeff Garzik, September 1999. */ @@ -34,6 +34,8 @@ allocated, the remaining memory is zeroed. PTR xmemdup (const PTR input, size_t copy_size, size_t alloc_size) { - PTR output = xcalloc (1, alloc_size); + PTR output = xmalloc (alloc_size); + if (alloc_size > copy_size) +memset ((char *) output + copy_size, 0, alloc_size - copy_size); return (PTR) memcpy (output, input, copy_size); } -- Alan Modra Australia Development Lab, IBM
[wwwdocs,Java] /java -- sourceware.org now defaults to https
Commmitted. 2016-05-28 Gerald Pfeifer * done.html: Convert sourceware.org links to https. * index.html: Ditto. * news.html: Ditto. Index: done.html === RCS file: /cvs/gcc/wwwdocs/htdocs/java/done.html,v retrieving revision 1.54 diff -u -r1.54 done.html --- done.html 27 Jun 2015 21:51:17 - 1.54 +++ done.html 28 May 2016 13:06:34 - @@ -162,7 +162,7 @@ -http://sourceware.org/rhug/";>rhug +https://sourceware.org/rhug/";>rhug Anthony Green and friends have set up rhug, a collection of free software Java packages set up to build with gcj. Both sources and RPMs are available. Index: index.html === RCS file: /cvs/gcc/wwwdocs/htdocs/java/index.html,v retrieving revision 1.178 diff -u -r1.178 index.html --- index.html 9 Apr 2016 16:25:57 - 1.178 +++ index.html 28 May 2016 13:06:34 - @@ -115,7 +115,7 @@ on http://freecode.com/projects/libjit";>libjit and http://llvm.org/";>LLVM respectively. The source code for these JITs is available via the "gcj-jit" module of the http://sourceware.org/rhug/";>rhug repository. +href="https://sourceware.org/rhug/";>rhug repository. April 4, 2006 Index: news.html === RCS file: /cvs/gcc/wwwdocs/htdocs/java/news.html,v retrieving revision 1.19 diff -u -r1.19 news.html --- news.html 6 Jul 2014 00:16:47 - 1.19 +++ news.html 28 May 2016 13:06:34 - @@ -152,7 +152,7 @@ Gary Benson from Red Hat has released http://people.redhat.com/gbenson/naoko/";>Naoko: a subset -of the http://sourceware.org/rhug/";>rhug packages +of the https://sourceware.org/rhug/";>rhug packages that have been repackaged for eventual inclusion in Red Hat Linux. Naoko basically comprises binary RPMS of Ant, Tomcat, and their dependencies built with gcj. @@ -171,7 +171,7 @@ of http://www.eclipse.org/";>Eclipse, a free software IDE written in Java, that has been compiled with a modified gcj. You can find more information -http://sourceware.org/eclipse/";>here. We'll be +https://sourceware.org/eclipse/";>here. We'll be integrating the required gcj patches in the near future. @@ -425,7 +425,7 @@ February 8, 2001 Made use of Warren Levy's change to the -http://sourceware.org/mauve/";>Mauve test suite to handle +https://sourceware.org/mauve/";>Mauve test suite to handle regressions. Modifications have been made to mauve.exp to copy the newly created xfails file of known library failures from the source tree
Top level configure dependencies
Applying to gcc and src repos. * Makefile.tpl (configure): Depend on m4 files included. * Makefile.in: Regenerate. diff --git a/Makefile.tpl b/Makefile.tpl index 6be6c4e..19728d2 100644 --- a/Makefile.tpl +++ b/Makefile.tpl @@ -1932,7 +1932,10 @@ config.status: configure # Rebuilding configure. AUTOCONF = autoconf $(srcdir)/configure: @MAINT@ $(srcdir)/configure.ac $(srcdir)/config/acx.m4 \ - $(srcdir)/config/override.m4 $(srcdir)/config/proginstall.m4 + $(srcdir)/config/override.m4 $(srcdir)/config/proginstall.m4 \ + $(srcdir)/config/elf.m4 $(srcdir)/config/isl.m4 \ + $(srcdir)/libtool.m4 $(srcdir)/ltoptions.m4 $(srcdir)/ltsugar.m4 \ + $(srcdir)/ltversion.m4 $(srcdir)/lt~obsolete.m4 cd $(srcdir) && $(AUTOCONF) # -- -- Alan Modra Australia Development Lab, IBM
[wwwdocs] Fix reference in projets/cfg.html
Fix reference to "Accurate Static Branch Prediction by Value Range Propagation" in projects/cfg.html. (It appears citeseer.ist.psu.edu has gone useless, more or less, so there likely will be further fixes we'll need to make over time.) Committed. Gerald Index: cfg.html === RCS file: /cvs/gcc/wwwdocs/htdocs/projects/cfg.html,v retrieving revision 1.20 diff -u -r1.20 cfg.html --- cfg.html30 Jun 2014 22:07:35 - 1.20 +++ cfg.html28 May 2016 12:58:10 - @@ -471,7 +471,7 @@ [4] http://citeseer.ist.psu.edu/patterson95accurate.html";>Accurate +"http://www.lighterra.com/papers/valuerangeprop/Patterson1995-ValueRangeProp.pdf";>Accurate Static Branch Prediction by Value Range Propagation; Jason R. C. Patterson (jas...@fit.qut.edu.au), 1995
[wwwdocs] projects/cli.html -- remove broken link to ACOTES project
Applied. Gerald Index: htdocs/projects/cli.html === RCS file: /cvs/gcc/wwwdocs/htdocs/projects/cli.html,v retrieving revision 1.27 diff -u -r1.27 cli.html --- htdocs/projects/cli.html28 Jun 2015 14:57:32 - 1.27 +++ htdocs/projects/cli.html28 May 2016 12:52:32 - @@ -101,7 +101,7 @@ STMicroelectronics started this project in 2006, -as part of the European funded project http://www.hitech-projects.com/euprojects/ACOTES/";>ACOTES. +as part of the European funded project ACOTES. In 2007 to explore the potential of .NET as a deployment file format, in
Re: Record likely upper bounds for loops
> Hi, > > On Fri, 27 May 2016, Jan Hubicka wrote: > > Thanks, updatted and comitted. > > This checkin seems to regress gcc.c-torture/execute/20050826-2.c at -Os: > > gcc/xgcc -Bgcc/ ../gcc/gcc/testsuite/gcc.c-torture/execute/20050826-2.c -Os \ > -o ./20050826-2.exe > > ./20050826-2.exe > Aborted > > (the previous revision is fine) Sorry, I amanged to accidentally commit the following change: Index: tree-ssa-loop-niter.c === --- tree-ssa-loop-niter.c (revision 236816) +++ tree-ssa-loop-niter.c (working copy) @@ -2289,11 +2289,7 @@ number_of_iterations_exit (struct loop * /* If NITER has simplified into a constant, update MAX. */ if (TREE_CODE (niter->niter) == INTEGER_CST) -{ - niter->max = wi::to_widest (niter->niter); - record_niter_bound (loop, niter->max, loop_only_exit_p (loop, exit), - true); -} +niter->max = wi::to_widest (niter->niter); if (integer_onep (niter->assumptions)) return true; I will revert it after re-testing. Honza