diff mbox

[PR81408] Turn TREE level unsafe loop optimizations warning to missed optimization message

Message ID DB5PR0801MB274259DDD82F89F89301BD9FE7A10@DB5PR0801MB2742.eurprd08.prod.outlook.com
State New
Headers show

Commit Message

Bin Cheng July 18, 2017, 8 a.m. UTC
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?

Thanks,
bin
2017-07-13  Bin Cheng  <bin.cheng@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.cheng@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.

Comments

Richard Biener July 18, 2017, 8:31 a.m. UTC | #1
On Tue, Jul 18, 2017 at 10:00 AM, Bin Cheng <Bin.Cheng@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,
Richard.

> Thanks,
> bin
> 2017-07-13  Bin Cheng  <bin.cheng@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.cheng@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 mbox

Patch

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..354d362
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr81408.C
@@ -0,0 +1,93 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=gnu++11 -fdump-tree-ivopts-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)
+    a::ax << c.ay << a::av;
+}
+
+/* { dg-final { scan-tree-dump "note: missed loop optimization: niters analysis ends up with assumptions." "ivopts" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr19210-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr19210-1.c
index 3c8ee06..3c18470 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 -fdump-tree-ivopts-details -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++) /* missed optimization for this loop.  */
     g();
 
-  for(k = 0;k <= n;k += 4) /* { dg-warning "missed loop optimization.*overflow" } */
+  for(k = 0;k <= n;k += 4) /* missed optimization for this loop.  */
     g();
 
   /* We used to get warning for this loop.  However, since then # of iterations
@@ -21,9 +21,14 @@  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) /* missed optimization for this loop.  */
     g();
   
-  for(k = 15;k >= n;k--) /* { dg-warning "missed loop optimization.*overflow" } */
+  for(k = 15;k >= n;k--) /* missed optimization for this loop.  */
     g();
 }
+
+/* { dg-final { scan-tree-dump "pr19210-1.c:9:.*: missed loop optimization: niters analysis ends up with assumptions." "ivopts" } } */
+/* { dg-final { scan-tree-dump "pr19210-1.c:12:.*: missed loop optimization: niters analysis ends up with assumptions." "ivopts" } } */
+/* { dg-final { scan-tree-dump "pr19210-1.c:24:.*: missed loop optimization: niters analysis ends up with assumptions." "ivopts" } } */
+/* { dg-final { scan-tree-dump "pr19210-1.c:27:.*: missed loop optimization: niters analysis ends up with assumptions." "ivopts" } } */
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;
 }