re PR middle-end/81408 (Lots of new -Wunsafe-loop-optimizations warnings with 7 compared to 6)

PR target/81408
	* tree-ssa-loop-niter.c (number_of_iterations_exit): Dump missed
	optimization for loop niter analysis.

	gcc/testsuite
	* g++.dg/tree-ssa/pr81408.C: New.
	* gcc.dg/tree-ssa/pr19210-1.c: Check dump message rather than warning.

From-SVN: r250304
This commit is contained in:
Bin Cheng 2017-07-18 11:40:38 +00:00 committed by Bin Cheng
parent f94f48ffac
commit 694dd0e408
5 changed files with 112 additions and 8 deletions

View file

@ -1,3 +1,9 @@
2017-07-18 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.
2017-07-18 Georg-Johann Lay <avr@gjlay.de>
PR target/81473

View file

@ -1,3 +1,9 @@
2017-07-18 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.
2017-07-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/80620

View file

@ -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;
}

View file

@ -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();
}

View file

@ -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;
}