On Tue, Jul 18, 2017 at 9:31 AM, Richard Biener <richard.guent...@gmail.com> wrote: > On Tue, Jul 18, 2017 at 10:00 AM, Bin Cheng <bin.ch...@arm.com> wrote: >> Hi, >> I removed unsafe loop optimization on TREE level last year, so GCC doesn't >> do unsafe >> loop optimizations on TREE now. All "unsafe loop optimizations" warnings >> reported by >> TREE optimizers are simply missed optimizations. This patch turns such >> warning into >> missed optimization messages. I didn't change when this will be dumped, for >> now it is >> when called from ivopts. >> Bootstrap and test on x86_64 and AArch64. Is it OK? > > Ok but can you change the testcase to not scan the ivopts dump but use > -fopt-info-loop-missed? > You should be able to match the output with dg-message. Thanks for reviewing. New patch with test case updated accordingly. Is it OK?
Thanks, bin > > Thanks, > Richard. > >> Thanks, >> bin >> 2017-07-13 Bin Cheng <bin.ch...@arm.com> >> >> PR target/81408 >> * tree-ssa-loop-niter.c (number_of_iterations_exit): Dump missed >> optimization for loop niter analysis. >> >> gcc/testsuite/ChangeLog >> 2017-07-13 Bin Cheng <bin.ch...@arm.com> >> >> PR target/81408 >> * g++.dg/tree-ssa/pr81408.C: New. >> * gcc.dg/tree-ssa/pr19210-1.c: Check dump message rather than >> warning.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr81408.C b/gcc/testsuite/g++.dg/tree-ssa/pr81408.C new file mode 100644 index 0000000..f94544b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr81408.C @@ -0,0 +1,92 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -std=gnu++11 -fopt-info-loop-missed -Wunsafe-loop-optimizations" } */ + +namespace a { +void b () __attribute__ ((__noreturn__)); +template <typename> struct d; +template <typename e> struct d<e *> +{ + typedef e f; +}; +struct g +{ + template <typename h> using i = h *; +}; +} +using a::d; +template <typename j, typename> class k +{ + j l; + +public: + typename d<j>::f operator* () {} + void operator++ () { ++l; } + j + aa () + { + return l; + } +}; +template <typename m, typename n, typename ab> +bool +operator!= (k<m, ab> o, k<n, ab> p2) +{ + return o.aa () != p2.aa (); +} +struct p; +namespace a { +struct F +{ + struct q + { + using ai = g::i<p>; + }; + using r = q::ai; +}; +class H +{ +public: + k<F::r, int> begin (); + k<F::r, int> end (); +}; +int s; +class I +{ +public: + void + aq (char) + { + if (s) + b (); + } +}; +class u : public I +{ +public: + void + operator<< (u o (u)) + { + o (*this); + } + u operator<< (void *); +}; +template <typename at, typename au> +at +av (au o) +{ + o.aq ('\n'); +} +u ax; +} +struct p +{ + char *ay; +}; +a::H t; +void +ShowHelpListCommands () +{ + for (auto c : t) /* { dg-message "note: missed loop optimization: niters analysis .*" } */ + a::ax << c.ay << a::av; +} + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr19210-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr19210-1.c index 3c8ee06..0fa5600 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr19210-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr19210-1.c @@ -1,15 +1,15 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -Wunsafe-loop-optimizations" } */ +/* { dg-options "-O2 -fopt-info-loop-missed -Wunsafe-loop-optimizations" } */ extern void g(void); void f (unsigned n) { unsigned k; - for(k = 0;k <= n;k++) /* { dg-warning "missed loop optimization.*overflow" } */ + for(k = 0;k <= n;k++) /* { dg-message "note: missed loop optimization: niters analysis .*" } */ g(); - for(k = 0;k <= n;k += 4) /* { dg-warning "missed loop optimization.*overflow" } */ + for(k = 0;k <= n;k += 4) /* { dg-message "note: missed loop optimization: niters analysis .*" } */ g(); /* We used to get warning for this loop. However, since then # of iterations @@ -21,9 +21,9 @@ f (unsigned n) g(); /* So we need the following loop, instead. */ - for(k = 4;k <= n;k += 5) /* { dg-warning "missed loop optimization.*overflow" } */ + for(k = 4;k <= n;k += 5) /* { dg-message "note: missed loop optimization: niters analysis .*" } */ g(); - for(k = 15;k >= n;k--) /* { dg-warning "missed loop optimization.*overflow" } */ + for(k = 15;k >= n;k--) /* { dg-message "note: missed loop optimization: niters analysis .*" } */ g(); } diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index 5a7cab5..1421002 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -2378,9 +2378,9 @@ number_of_iterations_exit (struct loop *loop, edge exit, return true; if (warn) - warning_at (gimple_location_safe (stmt), - OPT_Wunsafe_loop_optimizations, - "missed loop optimization, the loop counter may overflow"); + dump_printf_loc (MSG_MISSED_OPTIMIZATION, gimple_location_safe (stmt), + "missed loop optimization: niters analysis ends up " + "with assumptions.\n"); return false; }