dumpfile.c: use prefixes other than 'note: ' for MSG_{OPTIMIZED_LOCATIONS|MISSED_OPTIMIZATION}

As noted at Cauldron, dumpfile.c currently emits "note: " for all kinds
of dump message, so that (after filtering) there's no distinction between
MSG_OPTIMIZED_LOCATIONS vs MSG_NOTE vs MSG_MISSED_OPTIMIZATION in the
textual output.

This patch changes dumpfile.c so that the "note: " varies to show
which MSG_* was used, with the string prefix matching that used for
filtering in -fopt-info, hence e.g.
  directive_unroll_3.f90:24:0: optimized: loop unrolled 7 times
and:
  pr19210-1.c:24:3: missed: missed loop optimization: niters analysis ends up with assumptions.

The patch adds "dg-optimized" and "dg-missed" directives for use
in the testsuite for matching these (with -fopt-info on stderr; they
don't help for dumpfile output).

The patch also converts the various problem-reporting dump messages
in coverage.c:get_coverage_counts to use MSG_MISSED_OPTIMIZATION
rather than MSG_OPTIMIZED_LOCATIONS, as the docs call out "optimized"
as
  "information when an optimization is successfully applied",
whereas "missed" is for
  "information about missed optimizations",
and problems with profile data seem to me to fall much more into the
latter category than the former.  Doing so requires converting a few
tests from using "-fopt-info" (which is implicitly
"-fopt-info-optimized-optall") to getting the "missed" optimizations.
Changing them to "-fopt-info-missed" added lots of noise from the
vectorizer, so I changed these tests to use "-fopt-info-missed-ipa".

gcc/ChangeLog:
	* coverage.c (get_coverage_counts): Convert problem-reporting dump
	messages from MSG_OPTIMIZED_LOCATIONS to MSG_MISSED_OPTIMIZATION.
	* dumpfile.c (kind_as_string): New function.
	(dump_loc): Rather than a hardcoded prefix of "note: ", use
	kind_as_string to vary the prefix based on dump_kind.
	(selftest::test_capture_of_dump_calls): Update for above.

gcc/testsuite/ChangeLog:
	* c-c++-common/unroll-1.c: Update expected output from "note" to
	"optimized".
	* c-c++-common/unroll-2.c: Likewise.
	* c-c++-common/unroll-3.c: Likewise.
	* g++.dg/tree-ssa/dom-invalid.C: Update expected output from
	dg-message to dg-missed.  Convert param from -fopt-info to
	-fopt-info-missed-ipa.
	* g++.dg/tree-ssa/pr81408.C: Update expected output from
	dg-message to dg-missed.
	* g++.dg/vect/slp-pr56812.cc: Update expected output from
	dg-message to dg-optimized.
	* gcc.dg/pr26570.c: Update expected output from dg-message to
	dg-missed.  Convert param from -fopt-info to
	-fopt-info-missed-ipa.
	* gcc.dg/pr32773.c: Likewise.
	* gcc.dg/tree-ssa/pr19210-1.c: Update expected output from
	dg-message to dg-missed.
	* gcc.dg/unroll-2.c: Update expected output from dg-message to
	dg-optimized.
	* gcc.dg/vect/nodump-vect-opt-info-1.c: Likewise.  Convert param
	from -fopt-info to -fopt-info-vec.
	* gfortran.dg/directive_unroll_1.f90: Update expected output from
	"note" to "optimized".
	* gfortran.dg/directive_unroll_2.f90: Likewise.
	* gfortran.dg/directive_unroll_3.f90: Likewise.
	* gnat.dg/unroll4.adb: Likewise.
	* lib/gcc-dg.exp (dg-optimized): New procedure.
	(dg-missed): New procedure.

From-SVN: r264697
This commit is contained in:
David Malcolm 2018-09-28 17:40:04 +00:00 committed by David Malcolm
parent 5718d9d95f
commit ed2d9d3720
20 changed files with 136 additions and 53 deletions

View File

@ -1,3 +1,12 @@
2018-09-28 David Malcolm <dmalcolm@redhat.com>
* coverage.c (get_coverage_counts): Convert problem-reporting dump
messages from MSG_OPTIMIZED_LOCATIONS to MSG_MISSED_OPTIMIZATION.
* dumpfile.c (kind_as_string): New function.
(dump_loc): Rather than a hardcoded prefix of "note: ", use
kind_as_string to vary the prefix based on dump_kind.
(selftest::test_capture_of_dump_calls): Update for above.
2018-09-28 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.h (SSE_REGNO): Fix check for FIRST_REX_SSE_REG.

View File

@ -313,7 +313,7 @@ get_coverage_counts (unsigned counter, unsigned cfg_checksum,
{
dump_user_location_t loc
= dump_user_location_t::from_location_t (input_location);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
"file %s not found, %s\n", da_file_name,
(flag_guess_branch_prob
? "execution counts estimated"
@ -359,7 +359,7 @@ get_coverage_counts (unsigned counter, unsigned cfg_checksum,
{
dump_user_location_t loc
= dump_user_location_t::from_location_t (input_location);
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
"use -Wno-error=coverage-mismatch to tolerate "
"the mismatch but performance may drop if the "
"function is hot\n");
@ -367,14 +367,14 @@ get_coverage_counts (unsigned counter, unsigned cfg_checksum,
if (!seen_error ()
&& !warned++)
{
dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
"coverage mismatch ignored\n");
dump_printf (MSG_OPTIMIZED_LOCATIONS,
dump_printf (MSG_MISSED_OPTIMIZATION,
flag_guess_branch_prob
? G_("execution counts estimated\n")
: G_("execution counts assumed to be zero\n"));
if (!flag_guess_branch_prob)
dump_printf (MSG_OPTIMIZED_LOCATIONS,
dump_printf (MSG_MISSED_OPTIMIZATION,
"this can result in poorly optimized code\n");
}
}

View File

@ -437,6 +437,27 @@ dump_user_location_t::from_function_decl (tree fndecl)
DECL_SOURCE_LOCATION (fndecl));
}
/* Extract the MSG_* component from DUMP_KIND and return a string for use
as a prefix to dump messages.
These match the strings in optinfo_verbosity_options and thus the
"OPTIONS" within "-fopt-info-OPTIONS". */
static const char *
kind_as_string (dump_flags_t dump_kind)
{
switch (dump_kind & MSG_ALL)
{
default:
gcc_unreachable ();
case MSG_OPTIMIZED_LOCATIONS:
return "optimized";
case MSG_MISSED_OPTIMIZATION:
return "missed";
case MSG_NOTE:
return "note";
}
}
/* Print source location on DFILE if enabled. */
static void
@ -445,13 +466,14 @@ dump_loc (dump_flags_t dump_kind, FILE *dfile, source_location loc)
if (dump_kind)
{
if (LOCATION_LOCUS (loc) > BUILTINS_LOCATION)
fprintf (dfile, "%s:%d:%d: note: ", LOCATION_FILE (loc),
fprintf (dfile, "%s:%d:%d: ", LOCATION_FILE (loc),
LOCATION_LINE (loc), LOCATION_COLUMN (loc));
else if (current_function_decl)
fprintf (dfile, "%s:%d:%d: note: ",
fprintf (dfile, "%s:%d:%d: ",
DECL_SOURCE_FILE (current_function_decl),
DECL_SOURCE_LINE (current_function_decl),
DECL_SOURCE_COLUMN (current_function_decl));
fprintf (dfile, "%s: ", kind_as_string (dump_kind));
/* Indentation based on scope depth. */
fprintf (dfile, "%*s", get_dump_scope_depth (), "");
}
@ -465,13 +487,14 @@ dump_loc (dump_flags_t dump_kind, pretty_printer *pp, source_location loc)
if (dump_kind)
{
if (LOCATION_LOCUS (loc) > BUILTINS_LOCATION)
pp_printf (pp, "%s:%d:%d: note: ", LOCATION_FILE (loc),
pp_printf (pp, "%s:%d:%d: ", LOCATION_FILE (loc),
LOCATION_LINE (loc), LOCATION_COLUMN (loc));
else if (current_function_decl)
pp_printf (pp, "%s:%d:%d: note: ",
pp_printf (pp, "%s:%d:%d: ",
DECL_SOURCE_FILE (current_function_decl),
DECL_SOURCE_LINE (current_function_decl),
DECL_SOURCE_COLUMN (current_function_decl));
pp_printf (pp, "%s: ", kind_as_string (dump_kind));
/* Indentation based on scope depth. */
for (unsigned i = 0; i < get_dump_scope_depth (); i++)
pp_character (pp, ' ');
@ -2325,7 +2348,7 @@ test_capture_of_dump_calls (const line_table_case &case_)
}
dump_printf_loc (MSG_NOTE, stmt, "msg 7\n");
ASSERT_DUMPED_TEXT_EQ (tmp, "test.txt:5:10: note: msg 4\n");
ASSERT_DUMPED_TEXT_EQ (tmp, "test.txt:5:10: optimized: msg 4\n");
}
}

View File

@ -1,3 +1,34 @@
2018-09-28 David Malcolm <dmalcolm@redhat.com>
* c-c++-common/unroll-1.c: Update expected output from "note" to
"optimized".
* c-c++-common/unroll-2.c: Likewise.
* c-c++-common/unroll-3.c: Likewise.
* g++.dg/tree-ssa/dom-invalid.C: Update expected output from
dg-message to dg-missed. Convert param from -fopt-info to
-fopt-info-missed-ipa.
* g++.dg/tree-ssa/pr81408.C: Update expected output from
dg-message to dg-missed.
* g++.dg/vect/slp-pr56812.cc: Update expected output from
dg-message to dg-optimized.
* gcc.dg/pr26570.c: Update expected output from dg-message to
dg-missed. Convert param from -fopt-info to
-fopt-info-missed-ipa.
* gcc.dg/pr32773.c: Likewise.
* gcc.dg/tree-ssa/pr19210-1.c: Update expected output from
dg-message to dg-missed.
* gcc.dg/unroll-2.c: Update expected output from dg-message to
dg-optimized.
* gcc.dg/vect/nodump-vect-opt-info-1.c: Likewise. Convert param
from -fopt-info to -fopt-info-vec.
* gfortran.dg/directive_unroll_1.f90: Update expected output from
"note" to "optimized".
* gfortran.dg/directive_unroll_2.f90: Likewise.
* gfortran.dg/directive_unroll_3.f90: Likewise.
* gnat.dg/unroll4.adb: Likewise.
* lib/gcc-dg.exp (dg-optimized): New procedure.
(dg-missed): New procedure.
2018-09-28 Joseph Myers <joseph@codesourcery.com>
PR c/87390

View File

@ -20,22 +20,22 @@ void test (void)
#pragma GCC unroll 8
for (unsigned long i = 1; i <= 15; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "21:.*: note: loop unrolled 7 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "21:.*: optimized: loop unrolled 7 times" "loop2_unroll" } } */
#pragma GCC unroll 8
for (unsigned long i = 1; i <= j; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "26:.*: note: loop unrolled 7 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "26:.*: optimized: loop unrolled 7 times" "loop2_unroll" } } */
#pragma GCC unroll 7
for (unsigned long i = 1; i <= j; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "31:.*: note: loop unrolled 3 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "31:.*: optimized: loop unrolled 3 times" "loop2_unroll" } } */
unsigned long i = 0;
#pragma GCC unroll 3
do {
bar(i);
} while (++i < 9);
/* { dg-final { scan-rtl-dump "3\[79\]:.*: note: loop unrolled 2 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "3\[79\]:.*: optimized: loop unrolled 2 times" "loop2_unroll" } } */
}

View File

@ -20,22 +20,22 @@ void test (void)
#pragma GCC unroll 8
for (unsigned long i = 1; i <= 15; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "21:.*: note: loop unrolled 7 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "21:.*: optimized: loop unrolled 7 times" "loop2_unroll" } } */
#pragma GCC unroll 8
for (unsigned long i = 1; i <= j; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "26:.*: note: loop unrolled 7 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "26:.*: optimized: loop unrolled 7 times" "loop2_unroll" } } */
#pragma GCC unroll 7
for (unsigned long i = 1; i <= j; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "31:.*: note: loop unrolled 3 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "31:.*: optimized: loop unrolled 3 times" "loop2_unroll" } } */
unsigned long i = 0;
#pragma GCC unroll 3
do {
bar(i);
} while (++i < 9);
/* { dg-final { scan-rtl-dump "3\[79\]:.*: note: loop unrolled 2 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "3\[79\]:.*: optimized: loop unrolled 2 times" "loop2_unroll" } } */
}

View File

@ -10,32 +10,32 @@ void test (void)
#pragma GCC unroll 8
for (unsigned long i = 1; i <= 8; ++i)
bar(i);
/* { dg-final { scan-rtl-dump-not "11:.*: note: loop unrolled" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump-not "11:.*: optimized: loop unrolled" "loop2_unroll" } } */
#pragma GCC unroll 8
for (unsigned long i = 1; i <= 7; ++i)
bar(i);
/* { dg-final { scan-rtl-dump-not "16:.*: note: loop unrolled" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump-not "16:.*: optimized: loop unrolled" "loop2_unroll" } } */
#pragma GCC unroll 8
for (unsigned long i = 1; i <= 15; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "21:.*: note: loop unrolled 7 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "21:.*: optimized: loop unrolled 7 times" "loop2_unroll" } } */
#pragma GCC unroll 8
for (unsigned long i = 1; i <= j; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "26:.*: note: loop unrolled 7 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "26:.*: optimized: loop unrolled 7 times" "loop2_unroll" } } */
#pragma GCC unroll 7
for (unsigned long i = 1; i <= j; ++i)
bar(i);
/* { dg-final { scan-rtl-dump "31:.*: note: loop unrolled 3 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "31:.*: optimized: loop unrolled 3 times" "loop2_unroll" } } */
unsigned long i = 0;
#pragma GCC unroll 3
do {
bar(i);
} while (++i < 9);
/* { dg-final { scan-rtl-dump "3\[79\]:.*: note: loop unrolled 2 times" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump "3\[79\]:.*: optimized: loop unrolled 2 times" "loop2_unroll" } } */
}

View File

@ -1,7 +1,7 @@
// PR tree-optimization/39557
// invalid post-dom info leads to infinite loop
// { dg-do run }
// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fopt-info -fno-rtti -Wno-missing-profile" }
// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fopt-info-missed-ipa -fno-rtti -Wno-missing-profile" }
struct C
{
@ -49,4 +49,4 @@ main ()
{
E e;
e.bar ();
} // { dg-message "note: file" }
} // { dg-missed "file .* not found" }

View File

@ -86,7 +86,7 @@ a::H t;
void
ShowHelpListCommands ()
{
for (auto c : t) /* { dg-message "note: missed loop optimization: niters analysis .*" } */
for (auto c : t) /* { dg-missed "missed loop optimization: niters analysis .*" } */
a::ax << c.ay << a::av;
}

View File

@ -14,6 +14,6 @@ public:
void mydata::Set (float x)
{
/* We want to vectorize this either as loop or basic-block. */
for (int i=0; i<upper(); i++) /* { dg-message "note: \[^\n\]* vectorized" } */
for (int i=0; i<upper(); i++) /* { dg-optimized "\[^\n\]* vectorized" } */
data[i] = x;
}

View File

@ -1,8 +1,8 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fprofile-generate -fprofile-use -fopt-info -Wno-missing-profile" } */
/* { dg-options "-O2 -fprofile-generate -fprofile-use -fopt-info-missed-ipa -Wno-missing-profile" } */
/* { dg-require-profiling "-fprofile-generate" } */
unsigned test (unsigned a, unsigned b)
{
return a / b;
} /* { dg-message "note: \[^\n\]*execution counts estimated" } */
} /* { dg-missed "\[^\n\]*execution counts estimated" } */

View File

@ -1,9 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-O -fprofile-use -fopt-info -Wno-missing-profile" } */
/* { dg-options "-O -m4 -fprofile-use -fopt-info -Wno-missing-profile" { target sh-*-* } } */
/* { dg-options "-O -fprofile-use -fopt-info-missed-ipa -Wno-missing-profile" } */
/* { dg-options "-O -m4 -fprofile-use -fopt-info-missed-ipa -Wno-missing-profile" { target sh-*-* } } */
void foo (int *p)
{
if (p)
*p = 0;
} /* { dg-message "note: \[^\n\]*execution counts estimated" } */
} /* { dg-missed "\[^\n\]*execution counts estimated" } */

View File

@ -6,10 +6,10 @@ void
f (unsigned n)
{
unsigned k;
for(k = 0;k <= n;k++) /* { dg-message "note: missed loop optimization: niters analysis .*" } */
for(k = 0;k <= n;k++) /* { dg-missed "missed loop optimization: niters analysis .*" } */
g();
for(k = 0;k <= n;k += 4) /* { dg-message "note: missed loop optimization: niters analysis .*" } */
for(k = 0;k <= n;k += 4) /* { dg-missed "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-message "note: missed loop optimization: niters analysis .*" } */
for(k = 4;k <= n;k += 5) /* { dg-missed "missed loop optimization: niters analysis .*" } */
g();
for(k = 15;k >= n;k--) /* { dg-message "note: missed loop optimization: niters analysis .*" } */
for(k = 15;k >= n;k--) /* { dg-missed "missed loop optimization: niters analysis .*" } */
g();
}

View File

@ -15,7 +15,7 @@ int foo(void)
{
int i;
bar();
for (i = 0; i < 2; i++) /* { dg-message "note: loop with 2 iterations completely unrolled" } */
for (i = 0; i < 2; i++) /* { dg-optimized "loop with 2 iterations completely unrolled" } */
{
a[i]= b[i] + 1;
}
@ -25,7 +25,7 @@ int foo(void)
int foo2(void)
{
int i;
for (i = 0; i < 2; i++) /* { dg-message "note: loop with 2 iterations completely unrolled" } */
for (i = 0; i < 2; i++) /* { dg-optimized "loop with 2 iterations completely unrolled" } */
{
a[i]= b[i] + 1;
}

View File

@ -1,11 +1,11 @@
/* { dg-do compile { target vect_int } } */
/* { dg-additional-options "-std=c99 -fopt-info -O3" } */
/* { dg-additional-options "-std=c99 -fopt-info-vec -O3" } */
void
vadd (int *dst, int *op1, int *op2, int count)
{
/* { dg-message "loop vectorized" "" { target *-*-* } .+2 } */
/* { dg-message "loop versioned for vectorization because of possible aliasing" "" { target *-*-* } .+1 } */
/* { dg-optimized "loop vectorized" "" { target *-*-* } .+2 } */
/* { dg-optimized "loop versioned for vectorization because of possible aliasing" "" { target *-*-* } .+1 } */
for (int i = 0; i < count; ++i)
dst[i] = op1[i] + op2[i];
}

View File

@ -24,7 +24,7 @@ subroutine test2(a, n)
DO i=1, n, 1
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "24:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "24:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test2
subroutine test3(a, n)
@ -36,7 +36,7 @@ subroutine test3(a, n)
DO i=n, 1, -1
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "36:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "36:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test3
subroutine test4(a, n)
@ -48,5 +48,5 @@ subroutine test4(a, n)
DO i=1, n, 2
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "48:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "48:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test4

View File

@ -24,7 +24,7 @@ subroutine test2(a, n)
DO i=1, n, 1
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "24:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "24:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test2
subroutine test3(a, n)
@ -36,7 +36,7 @@ subroutine test3(a, n)
DO i=n, 1, -1
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "36:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "36:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test3
subroutine test4(a, n)
@ -48,5 +48,5 @@ subroutine test4(a, n)
DO i=1, n, 2
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "48:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "48:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test4

View File

@ -12,7 +12,7 @@ subroutine test1(a)
DO i=1, 8, 1
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump-not "12:.: note: loop unrolled" "loop2_unroll" } }
! { dg-final { scan-rtl-dump-not "12:.: optimized: loop unrolled" "loop2_unroll" } }
end subroutine test1
subroutine test2(a, n)
@ -24,7 +24,7 @@ subroutine test2(a, n)
DO i=1, n, 1
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "24:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "24:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test2
subroutine test3(a, n)
@ -36,7 +36,7 @@ subroutine test3(a, n)
DO i=n, 1, -1
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "36:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "36:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test3
subroutine test4(a, n)
@ -48,5 +48,5 @@ subroutine test4(a, n)
DO i=1, n, 2
call dummy(a(i))
ENDDO
! { dg-final { scan-rtl-dump "48:.: note: loop unrolled 7 times" "loop2_unroll" } }
! { dg-final { scan-rtl-dump "48:.: optimized: loop unrolled 7 times" "loop2_unroll" } }
end subroutine test4

View File

@ -23,4 +23,4 @@ package body Unroll4 is
end Unroll4;
-- { dg-final { scan-rtl-dump-times "note: loop unrolled 7 times" 2 "loop2_unroll" } }
-- { dg-final { scan-rtl-dump-times "optimized: loop unrolled 7 times" 2 "loop2_unroll" } }

View File

@ -1194,6 +1194,26 @@ proc dg-locus { args } {
verbose "process-message:\n${dg-messages}" 2
}
# Handle output from -fopt-info for MSG_OPTIMIZED_LOCATIONS:
# a successful optimization.
proc dg-optimized { args } {
# Make this variable available here and to the saved proc.
upvar dg-messages dg-messages
process-message saved-dg-error "optimized: " "$args"
}
# Handle output from -fopt-info for MSG_MISSED_OPTIMIZATION:
# a missed optimization.
proc dg-missed { args } {
# Make this variable available here and to the saved proc.
upvar dg-messages dg-messages
process-message saved-dg-error "missed: " "$args"
}
# Check the existence of a gdb in the path, and return true if there
# is one.
#