diff mbox

Fix bootstrap on powerpc*-aix* (PR bootstrap/70704)

Message ID 20160425193029.GO26501@tucnak.zalov.cz
State New
Headers show

Commit Message

Jakub Jelinek April 25, 2016, 7:30 p.m. UTC
Hi!

As mentioned in the PR, some checking code, in particular the one
in C++ FE's build_non_dependent_expr, may affect code generation, as it can
instantiate templates that aren't instantiated otherwise, which affects
the various counters like cfun->funcdef_no, DECL_UID etc.

I'd like to commit the attached (shorter, safer) patch to gcc 6 branch,
which just disables this checking.

The larger, included patch, makes -fchecking a 3 state option, -fno-checking
aka -fchecking=0, no checking, -fchecking aka -fchecking=1 the previous
-fchecking except for the build_non_dependent_expr bits, and -fchecking=2
as checking that might affect code generation and tweaks the configury,
so that for non-release builds it defaults to this -fchecking=2, while for
release checking builds stage1 defaults to -fchecking=1 and stage2+
defaults to -fno-checking.

The shorter patch is currently being bootstrapped on powerpc-ibm-aix7.1.3.0,
the larger patch I've so far bootstrapped/regtested on x86_64-linux and
i686-linux on gcc-6 branch with implicit --enable-checking=release (where
stage1 performs yes but no extra checking), --disable-checking,
--enable-checking=yes,rtl and on the trunk so far bootstrapped and regtest
--pending with --enable-checking=yes,extra,rtl.  Will still check
also the implicit --enable-checking=yes,extra.

Ok for trunk (the included patch) and 6 branch (the attached patch)?

2016-04-25  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/70704
	* configure.ac (--enable-stage1-checking): For --disable-checking or
	implicit --enable-checking, make sure extra flag matches in between
	stage1 and later checking.
	* configure: Regenerated.
gcc/
	* configure.ac (--enable-checking): Document extra flag, for
	non-release builds default to --enable-checking=yes,extra.
	If misc checking and extra checking, define CHECKING_P to 2 instead
	of 1.
	* common.opt (fchecking=): Add.
	* doc/invoke.texi (-fchecking=): Document.
	* doc/install.texi: Document --enable-checking changes.
	* configure: Regenerated.
	* config.in: Regenerated.
gcc/cp/
	* pt.c (build_non_dependent_expr): Use flag_checking > 1 instead of
	just flag_checking.


	Jakub
2016-04-25  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/70704
	* pt.c (build_non_dependent_expr): Temporarily disable flag_checking
	guarded code.

--- gcc/cp/pt.c.jj1	2016-04-22 18:21:27.000000000 +0200
+++ gcc/cp/pt.c	2016-04-25 19:55:54.317166968 +0200
@@ -23623,8 +23623,9 @@ build_non_dependent_expr (tree expr)
 
   /* When checking, try to get a constant value for all non-dependent
      expressions in order to expose bugs in *_dependent_expression_p
-     and constexpr.  */
-  if (flag_checking && cxx_dialect >= cxx11
+     and constexpr.  This checking can change code generation, temporarily
+     disabled.  See PR70704.  */
+  if (0 && flag_checking && cxx_dialect >= cxx11
       /* Don't do this during nsdmi parsing as it can lead to
 	 unexpected recursive instantiations.  */
       && !parsing_nsdmi ())

Comments

Jason Merrill April 25, 2016, 7:41 p.m. UTC | #1
Looks good to me.

Jason

On Mon, Apr 25, 2016 at 3:30 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> As mentioned in the PR, some checking code, in particular the one
> in C++ FE's build_non_dependent_expr, may affect code generation, as it can
> instantiate templates that aren't instantiated otherwise, which affects
> the various counters like cfun->funcdef_no, DECL_UID etc.
>
> I'd like to commit the attached (shorter, safer) patch to gcc 6 branch,
> which just disables this checking.
>
> The larger, included patch, makes -fchecking a 3 state option, -fno-checking
> aka -fchecking=0, no checking, -fchecking aka -fchecking=1 the previous
> -fchecking except for the build_non_dependent_expr bits, and -fchecking=2
> as checking that might affect code generation and tweaks the configury,
> so that for non-release builds it defaults to this -fchecking=2, while for
> release checking builds stage1 defaults to -fchecking=1 and stage2+
> defaults to -fno-checking.
>
> The shorter patch is currently being bootstrapped on powerpc-ibm-aix7.1.3.0,
> the larger patch I've so far bootstrapped/regtested on x86_64-linux and
> i686-linux on gcc-6 branch with implicit --enable-checking=release (where
> stage1 performs yes but no extra checking), --disable-checking,
> --enable-checking=yes,rtl and on the trunk so far bootstrapped and regtest
> --pending with --enable-checking=yes,extra,rtl.  Will still check
> also the implicit --enable-checking=yes,extra.
>
> Ok for trunk (the included patch) and 6 branch (the attached patch)?
>
> 2016-04-25  Jakub Jelinek  <jakub@redhat.com>
>
>         PR bootstrap/70704
>         * configure.ac (--enable-stage1-checking): For --disable-checking or
>         implicit --enable-checking, make sure extra flag matches in between
>         stage1 and later checking.
>         * configure: Regenerated.
> gcc/
>         * configure.ac (--enable-checking): Document extra flag, for
>         non-release builds default to --enable-checking=yes,extra.
>         If misc checking and extra checking, define CHECKING_P to 2 instead
>         of 1.
>         * common.opt (fchecking=): Add.
>         * doc/invoke.texi (-fchecking=): Document.
>         * doc/install.texi: Document --enable-checking changes.
>         * configure: Regenerated.
>         * config.in: Regenerated.
> gcc/cp/
>         * pt.c (build_non_dependent_expr): Use flag_checking > 1 instead of
>         just flag_checking.
>
> --- configure.ac.jj     2016-03-17 23:58:35.000000000 +0100
> +++ configure.ac        2016-04-25 18:15:34.703842886 +0200
> @@ -3530,16 +3530,17 @@ AC_ARG_ENABLE(stage1-checking,
>    # For --disable-checking or implicit --enable-checking=release, avoid
>    # setting --enable-checking=gc in the default stage1 checking for LTO
>    # bootstraps.  See PR62077.
> -  stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types
>    case $BUILD_CONFIG in
>      *lto*)
> -      if test "x$enable_checking" = x && \
> -        test -d ${srcdir}/gcc && \
> -        test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
> -       stage1_checking=--enable-checking=yes,types
> -      fi;;
> -    *) stage1_checking=--enable-checking=yes,types;;
> +      stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types;;
> +    *)
> +      stage1_checking=--enable-checking=yes,types;;
>    esac
> +  if test "x$enable_checking" = x && \
> +     test -d ${srcdir}/gcc && \
> +     test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
> +    stage1_checking=yes,types,extra
> +  fi
>  else
>    stage1_checking=--enable-checking=$enable_checking,types
>  fi])
> --- gcc/configure.ac.jj 2016-01-27 19:47:35.000000000 +0100
> +++ gcc/configure.ac    2016-04-25 17:56:40.789041032 +0200
> @@ -516,12 +516,12 @@ AC_ARG_ENABLE(checking,
>                 [enable expensive run-time checks.  With LIST,
>                  enable only specific categories of checks.
>                  Categories are: yes,no,all,none,release.
> -                Flags are: assert,df,fold,gc,gcac,gimple,misc,
> +                Flags are: assert,df,extra,fold,gc,gcac,gimple,misc,
>                  rtlflag,rtl,runtime,tree,valgrind,types])],
>  [ac_checking_flags="${enableval}"],[
>  # Determine the default checks.
>  if test x$is_release = x ; then
> -  ac_checking_flags=yes
> +  ac_checking_flags=yes,extra
>  else
>    ac_checking_flags=release
>  fi])
> @@ -531,32 +531,33 @@ do
>         case $check in
>         # these set all the flags to specific states
>         yes)            ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking= ;
> -                       ac_fold_checking= ; ac_gc_checking=1 ;
> +                       ac_fold_checking= ; ac_gc_checking=1 ; ac_extra_checking= ;
>                         ac_gc_always_collect= ; ac_gimple_checking=1 ; ac_rtl_checking= ;
>                         ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
>                         ac_tree_checking=1 ; ac_valgrind_checking= ;
>                         ac_types_checking=1 ;;
>         no|none)        ac_assert_checking= ; ac_checking= ; ac_df_checking= ;
> -                       ac_fold_checking= ; ac_gc_checking= ;
> +                       ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
>                         ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
>                         ac_rtlflag_checking= ; ac_runtime_checking= ;
>                         ac_tree_checking= ; ac_valgrind_checking= ;
>                         ac_types_checking= ;;
>         all)            ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking=1 ;
> -                       ac_fold_checking=1 ; ac_gc_checking=1 ;
> +                       ac_fold_checking=1 ; ac_gc_checking=1 ; ac_extra_checking=1 ;
>                         ac_gc_always_collect=1 ; ac_gimple_checking=1 ; ac_rtl_checking=1 ;
>                         ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
>                         ac_tree_checking=1 ; ac_valgrind_checking= ;
>                         ac_types_checking=1 ;;
>         release)        ac_assert_checking=1 ; ac_checking= ; ac_df_checking= ;
> -                       ac_fold_checking= ; ac_gc_checking= ;
> +                       ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
>                         ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
>                         ac_rtlflag_checking= ; ac_runtime_checking=1 ;
>                         ac_tree_checking= ; ac_valgrind_checking= ;
>                         ac_types_checking= ;;
>         # these enable particular checks
>         assert)         ac_assert_checking=1 ;;
> -       df)             ac_df_checking=1 ;;
> +       df)             ac_df_checking=1 ;;
> +       extra)          ac_extra_checking=1 ;;
>         fold)           ac_fold_checking=1 ;;
>         gc)             ac_gc_checking=1 ;;
>         gcac)           ac_gc_always_collect=1 ;;
> @@ -575,9 +576,13 @@ IFS="$ac_save_IFS"
>
>  nocommon_flag=""
>  if test x$ac_checking != x ; then
> -  AC_DEFINE(CHECKING_P, 1,
> +  if test x$ac_extra_checking != x ; then
> +    ac_checking=2
> +  fi
> +  AC_DEFINE_UNQUOTED(CHECKING_P, $ac_checking,
>  [Define to 1 if you want more run-time sanity checks.  This one gets a grab
> -   bag of miscellaneous but relatively cheap checks.])
> +   bag of miscellaneous but relatively cheap checks.  Define to 2 if you want
> +   also extra run-time checking that might affect code generation.])
>    nocommon_flag=-fno-common
>  else
>    AC_DEFINE(CHECKING_P, 0)
> --- gcc/common.opt.jj   2016-03-17 16:54:46.000000000 +0100
> +++ gcc/common.opt      2016-04-25 17:46:20.112362251 +0200
> @@ -1029,6 +1029,10 @@ fchecking
>  Common Var(flag_checking) Init(CHECKING_P)
>  Perform internal consistency checkings.
>
> +fchecking=
> +Common Joined RejectNegative UInteger Var(flag_checking)
> +Perform internal consistency checkings.
> +
>  fcombine-stack-adjustments
>  Common Report Var(flag_combine_stack_adjustments) Optimization
>  Looks for opportunities to reduce stack adjustments and stack references.
> --- gcc/cp/pt.c.jj      2016-04-22 18:21:27.000000000 +0200
> +++ gcc/cp/pt.c 2016-04-25 17:43:05.478972266 +0200
> @@ -23623,8 +23623,10 @@ build_non_dependent_expr (tree expr)
>
>    /* When checking, try to get a constant value for all non-dependent
>       expressions in order to expose bugs in *_dependent_expression_p
> -     and constexpr.  */
> -  if (flag_checking && cxx_dialect >= cxx11
> +     and constexpr.  This can affect code generation, see PR70704, so
> +     only do this for -fchecking=2.  */
> +  if (flag_checking > 1
> +      && cxx_dialect >= cxx11
>        /* Don't do this during nsdmi parsing as it can lead to
>          unexpected recursive instantiations.  */
>        && !parsing_nsdmi ())
> --- gcc/doc/invoke.texi.jj      2016-04-22 18:21:28.000000000 +0200
> +++ gcc/doc/invoke.texi 2016-04-25 18:01:03.666517058 +0200
> @@ -501,7 +501,8 @@ Objective-C and Objective-C++ Dialects}.
>  @item Developer Options
>  @xref{Developer Options,,GCC Developer Options}.
>  @gccoptlist{-d@var{letters}  -dumpspecs  -dumpmachine  -dumpversion @gol
> --fchecking -fdbg-cnt-list -fdbg-cnt=@var{counter-value-list} @gol
> +-fchecking -fchecking=@var{n} -fdbg-cnt-list @gol
> +-fdbg-cnt=@var{counter-value-list} @gol
>  -fdisable-ipa-@var{pass_name} @gol
>  -fdisable-rtl-@var{pass_name} @gol
>  -fdisable-rtl-@var{pass-name}=@var{range-list} @gol
> @@ -12368,10 +12369,12 @@ Here are some examples showing uses of t
>  @end smallexample
>
>  @item -fchecking
> +@itemx -fchecking=@var{n}
>  @opindex fchecking
>  @opindex fno-checking
>  Enable internal consistency checking.  The default depends on
> -the compiler configuration.
> +the compiler configuration.  @option{-fchecking=2} enables further
> +internal consistency checking that might affect code generation.
>
>  @item -frandom-seed=@var{string}
>  @opindex frandom-seed
> --- gcc/doc/install.texi.jj     2016-04-22 18:21:28.000000000 +0200
> +++ gcc/doc/install.texi        2016-04-25 17:52:24.156481290 +0200
> @@ -1708,7 +1708,7 @@ When you specify this option, the compil
>  consistency checks of the requested complexity.  This does not change the
>  generated code, but adds error checking within the compiler.  This will
>  slow down the compiler and may only work properly if you are building
> -the compiler with GCC@.  This is @samp{yes} by default when building
> +the compiler with GCC@.  This is @samp{yes,extra} by default when building
>  from SVN or snapshots, but @samp{release} for releases.  The default
>  for building the stage1 compiler is @samp{yes}.  More control
>  over the checks may be had by specifying @var{list}.  The categories of
> @@ -1717,8 +1717,11 @@ checks available are @samp{yes} (most co
>  all), @samp{all} (all but @samp{valgrind}), @samp{release} (cheapest
>  checks @samp{assert,runtime}) or @samp{none} (same as @samp{no}).
>  Individual checks can be enabled with these flags @samp{assert},
> -@samp{df}, @samp{fold}, @samp{gc}, @samp{gcac} @samp{misc}, @samp{rtl},
> -@samp{rtlflag}, @samp{runtime}, @samp{tree}, and @samp{valgrind}.
> +@samp{df}, @samp{fold}, @samp{gc}, @samp{gcac}, @samp{misc}, @samp{rtl},
> +@samp{rtlflag}, @samp{runtime}, @samp{tree}, @samp{extra} and @samp{valgrind}.
> +@samp{extra} adds for @samp{misc} checking extra checks that might affect
> +code generation and should therefore not differ between stage1 and later
> +stages.
>
>  The @samp{valgrind} check requires the external @command{valgrind}
>  simulator, available from @uref{http://valgrind.org/}.  The
> --- configure.jj        2016-03-17 23:58:35.000000000 +0100
> +++ configure   2016-04-25 18:15:42.364740223 +0200
> @@ -14850,16 +14850,17 @@ else
>    # For --disable-checking or implicit --enable-checking=release, avoid
>    # setting --enable-checking=gc in the default stage1 checking for LTO
>    # bootstraps.  See PR62077.
> -  stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types
>    case $BUILD_CONFIG in
>      *lto*)
> -      if test "x$enable_checking" = x && \
> -        test -d ${srcdir}/gcc && \
> -        test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
> -       stage1_checking=--enable-checking=yes,types
> -      fi;;
> -    *) stage1_checking=--enable-checking=yes,types;;
> +      stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types;;
> +    *)
> +      stage1_checking=--enable-checking=yes,types;;
>    esac
> +  if test "x$enable_checking" = x && \
> +     test -d ${srcdir}/gcc && \
> +     test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
> +    stage1_checking=yes,types,extra
> +  fi
>  else
>    stage1_checking=--enable-checking=$enable_checking,types
>  fi
> --- gcc/configure.jj    2016-01-27 19:47:28.000000000 +0100
> +++ gcc/configure       2016-04-25 18:02:16.701537995 +0200
> @@ -1596,7 +1596,7 @@ Optional Features:
>                            enable expensive run-time checks. With LIST, enable
>                            only specific categories of checks. Categories are:
>                            yes,no,all,none,release. Flags are:
> -                          assert,df,fold,gc,gcac,gimple,misc,
> +                          assert,df,extra,fold,gc,gcac,gimple,misc,
>                            rtlflag,rtl,runtime,tree,valgrind,types
>    --enable-coverage[=LEVEL]
>                            enable compiler's code coverage collection. Use to
> @@ -7075,7 +7075,7 @@ else
>
>  # Determine the default checks.
>  if test x$is_release = x ; then
> -  ac_checking_flags=yes
> +  ac_checking_flags=yes,extra
>  else
>    ac_checking_flags=release
>  fi
> @@ -7087,32 +7087,33 @@ do
>         case $check in
>         # these set all the flags to specific states
>         yes)            ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking= ;
> -                       ac_fold_checking= ; ac_gc_checking=1 ;
> +                       ac_fold_checking= ; ac_gc_checking=1 ; ac_extra_checking= ;
>                         ac_gc_always_collect= ; ac_gimple_checking=1 ; ac_rtl_checking= ;
>                         ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
>                         ac_tree_checking=1 ; ac_valgrind_checking= ;
>                         ac_types_checking=1 ;;
>         no|none)        ac_assert_checking= ; ac_checking= ; ac_df_checking= ;
> -                       ac_fold_checking= ; ac_gc_checking= ;
> +                       ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
>                         ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
>                         ac_rtlflag_checking= ; ac_runtime_checking= ;
>                         ac_tree_checking= ; ac_valgrind_checking= ;
>                         ac_types_checking= ;;
>         all)            ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking=1 ;
> -                       ac_fold_checking=1 ; ac_gc_checking=1 ;
> +                       ac_fold_checking=1 ; ac_gc_checking=1 ; ac_extra_checking=1 ;
>                         ac_gc_always_collect=1 ; ac_gimple_checking=1 ; ac_rtl_checking=1 ;
>                         ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
>                         ac_tree_checking=1 ; ac_valgrind_checking= ;
>                         ac_types_checking=1 ;;
>         release)        ac_assert_checking=1 ; ac_checking= ; ac_df_checking= ;
> -                       ac_fold_checking= ; ac_gc_checking= ;
> +                       ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
>                         ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
>                         ac_rtlflag_checking= ; ac_runtime_checking=1 ;
>                         ac_tree_checking= ; ac_valgrind_checking= ;
>                         ac_types_checking= ;;
>         # these enable particular checks
>         assert)         ac_assert_checking=1 ;;
> -       df)             ac_df_checking=1 ;;
> +       df)             ac_df_checking=1 ;;
> +       extra)          ac_extra_checking=1 ;;
>         fold)           ac_fold_checking=1 ;;
>         gc)             ac_gc_checking=1 ;;
>         gcac)           ac_gc_always_collect=1 ;;
> @@ -7131,8 +7132,13 @@ IFS="$ac_save_IFS"
>
>  nocommon_flag=""
>  if test x$ac_checking != x ; then
> +  if test x$ac_extra_checking != x ; then
> +    ac_checking=2
> +  fi
>
> -$as_echo "#define CHECKING_P 1" >>confdefs.h
> +cat >>confdefs.h <<_ACEOF
> +#define CHECKING_P $ac_checking
> +_ACEOF
>
>    nocommon_flag=-fno-common
>  else
> @@ -18453,7 +18459,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 18456 "configure"
> +#line 18462 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> @@ -18559,7 +18565,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 18562 "configure"
> +#line 18568 "configure"
>  #include "confdefs.h"
>
>  #if HAVE_DLFCN_H
> --- gcc/config.in.jj    2016-01-26 20:50:26.000000000 +0100
> +++ gcc/config.in       2016-04-25 18:02:20.000000000 +0200
> @@ -31,7 +31,8 @@
>
>
>  /* Define to 1 if you want more run-time sanity checks. This one gets a grab
> -   bag of miscellaneous but relatively cheap checks. */
> +   bag of miscellaneous but relatively cheap checks. Define to 2 if you want
> +   also extra run-time checking that might affect code generation. */
>  #ifndef USED_FOR_TARGET
>  #undef CHECKING_P
>  #endif
>
>         Jakub
Andreas Schwab May 1, 2016, 9:05 a.m. UTC | #2
Jakub Jelinek <jakub@redhat.com> writes:

> +  if test "x$enable_checking" = x && \
> +     test -d ${srcdir}/gcc && \
> +     test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
> +    stage1_checking=yes,types,extra

s/=/=--enable-checking=/

Andreas.
diff mbox

Patch

--- configure.ac.jj	2016-03-17 23:58:35.000000000 +0100
+++ configure.ac	2016-04-25 18:15:34.703842886 +0200
@@ -3530,16 +3530,17 @@  AC_ARG_ENABLE(stage1-checking,
   # For --disable-checking or implicit --enable-checking=release, avoid
   # setting --enable-checking=gc in the default stage1 checking for LTO
   # bootstraps.  See PR62077.
-  stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types
   case $BUILD_CONFIG in
     *lto*)
-      if test "x$enable_checking" = x && \
-	 test -d ${srcdir}/gcc && \
-	 test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
-	stage1_checking=--enable-checking=yes,types
-      fi;;
-    *) stage1_checking=--enable-checking=yes,types;;
+      stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types;;
+    *)
+      stage1_checking=--enable-checking=yes,types;;
   esac
+  if test "x$enable_checking" = x && \
+     test -d ${srcdir}/gcc && \
+     test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
+    stage1_checking=yes,types,extra
+  fi
 else
   stage1_checking=--enable-checking=$enable_checking,types
 fi])
--- gcc/configure.ac.jj	2016-01-27 19:47:35.000000000 +0100
+++ gcc/configure.ac	2016-04-25 17:56:40.789041032 +0200
@@ -516,12 +516,12 @@  AC_ARG_ENABLE(checking,
 		[enable expensive run-time checks.  With LIST,
 		 enable only specific categories of checks.
 		 Categories are: yes,no,all,none,release.
-		 Flags are: assert,df,fold,gc,gcac,gimple,misc,
+		 Flags are: assert,df,extra,fold,gc,gcac,gimple,misc,
 		 rtlflag,rtl,runtime,tree,valgrind,types])],
 [ac_checking_flags="${enableval}"],[
 # Determine the default checks.
 if test x$is_release = x ; then
-  ac_checking_flags=yes
+  ac_checking_flags=yes,extra
 else
   ac_checking_flags=release
 fi])
@@ -531,32 +531,33 @@  do
 	case $check in
 	# these set all the flags to specific states
 	yes)		ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking= ;
-			ac_fold_checking= ; ac_gc_checking=1 ;
+			ac_fold_checking= ; ac_gc_checking=1 ; ac_extra_checking= ;
 			ac_gc_always_collect= ; ac_gimple_checking=1 ; ac_rtl_checking= ;
 			ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
 			ac_tree_checking=1 ; ac_valgrind_checking= ;
 			ac_types_checking=1 ;;
 	no|none)	ac_assert_checking= ; ac_checking= ; ac_df_checking= ;
-			ac_fold_checking= ; ac_gc_checking= ;
+			ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
 			ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
 			ac_rtlflag_checking= ; ac_runtime_checking= ;
 			ac_tree_checking= ; ac_valgrind_checking= ;
 			ac_types_checking= ;;
 	all)		ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking=1 ;
-			ac_fold_checking=1 ; ac_gc_checking=1 ;
+			ac_fold_checking=1 ; ac_gc_checking=1 ; ac_extra_checking=1 ;
 			ac_gc_always_collect=1 ; ac_gimple_checking=1 ; ac_rtl_checking=1 ;
 			ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
 			ac_tree_checking=1 ; ac_valgrind_checking= ;
 			ac_types_checking=1 ;;
 	release)	ac_assert_checking=1 ; ac_checking= ; ac_df_checking= ;
-			ac_fold_checking= ; ac_gc_checking= ;
+			ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
 			ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
 			ac_rtlflag_checking= ; ac_runtime_checking=1 ;
 			ac_tree_checking= ; ac_valgrind_checking= ;
 			ac_types_checking= ;;
 	# these enable particular checks
 	assert) 	ac_assert_checking=1 ;;
-	df)	 	ac_df_checking=1 ;;
+	df)		ac_df_checking=1 ;;
+	extra)		ac_extra_checking=1 ;;
 	fold)		ac_fold_checking=1 ;;
 	gc)		ac_gc_checking=1 ;;
 	gcac)		ac_gc_always_collect=1 ;;
@@ -575,9 +576,13 @@  IFS="$ac_save_IFS"
 
 nocommon_flag=""
 if test x$ac_checking != x ; then
-  AC_DEFINE(CHECKING_P, 1,
+  if test x$ac_extra_checking != x ; then
+    ac_checking=2
+  fi
+  AC_DEFINE_UNQUOTED(CHECKING_P, $ac_checking,
 [Define to 1 if you want more run-time sanity checks.  This one gets a grab
-   bag of miscellaneous but relatively cheap checks.])
+   bag of miscellaneous but relatively cheap checks.  Define to 2 if you want
+   also extra run-time checking that might affect code generation.])
   nocommon_flag=-fno-common
 else
   AC_DEFINE(CHECKING_P, 0)
--- gcc/common.opt.jj	2016-03-17 16:54:46.000000000 +0100
+++ gcc/common.opt	2016-04-25 17:46:20.112362251 +0200
@@ -1029,6 +1029,10 @@  fchecking
 Common Var(flag_checking) Init(CHECKING_P)
 Perform internal consistency checkings.
 
+fchecking=
+Common Joined RejectNegative UInteger Var(flag_checking)
+Perform internal consistency checkings.
+
 fcombine-stack-adjustments
 Common Report Var(flag_combine_stack_adjustments) Optimization
 Looks for opportunities to reduce stack adjustments and stack references.
--- gcc/cp/pt.c.jj	2016-04-22 18:21:27.000000000 +0200
+++ gcc/cp/pt.c	2016-04-25 17:43:05.478972266 +0200
@@ -23623,8 +23623,10 @@  build_non_dependent_expr (tree expr)
 
   /* When checking, try to get a constant value for all non-dependent
      expressions in order to expose bugs in *_dependent_expression_p
-     and constexpr.  */
-  if (flag_checking && cxx_dialect >= cxx11
+     and constexpr.  This can affect code generation, see PR70704, so
+     only do this for -fchecking=2.  */
+  if (flag_checking > 1
+      && cxx_dialect >= cxx11
       /* Don't do this during nsdmi parsing as it can lead to
 	 unexpected recursive instantiations.  */
       && !parsing_nsdmi ())
--- gcc/doc/invoke.texi.jj	2016-04-22 18:21:28.000000000 +0200
+++ gcc/doc/invoke.texi	2016-04-25 18:01:03.666517058 +0200
@@ -501,7 +501,8 @@  Objective-C and Objective-C++ Dialects}.
 @item Developer Options
 @xref{Developer Options,,GCC Developer Options}.
 @gccoptlist{-d@var{letters}  -dumpspecs  -dumpmachine  -dumpversion @gol
--fchecking -fdbg-cnt-list -fdbg-cnt=@var{counter-value-list} @gol
+-fchecking -fchecking=@var{n} -fdbg-cnt-list @gol
+-fdbg-cnt=@var{counter-value-list} @gol
 -fdisable-ipa-@var{pass_name} @gol
 -fdisable-rtl-@var{pass_name} @gol
 -fdisable-rtl-@var{pass-name}=@var{range-list} @gol
@@ -12368,10 +12369,12 @@  Here are some examples showing uses of t
 @end smallexample
 
 @item -fchecking
+@itemx -fchecking=@var{n}
 @opindex fchecking
 @opindex fno-checking
 Enable internal consistency checking.  The default depends on
-the compiler configuration.
+the compiler configuration.  @option{-fchecking=2} enables further
+internal consistency checking that might affect code generation.
 
 @item -frandom-seed=@var{string}
 @opindex frandom-seed
--- gcc/doc/install.texi.jj	2016-04-22 18:21:28.000000000 +0200
+++ gcc/doc/install.texi	2016-04-25 17:52:24.156481290 +0200
@@ -1708,7 +1708,7 @@  When you specify this option, the compil
 consistency checks of the requested complexity.  This does not change the
 generated code, but adds error checking within the compiler.  This will
 slow down the compiler and may only work properly if you are building
-the compiler with GCC@.  This is @samp{yes} by default when building
+the compiler with GCC@.  This is @samp{yes,extra} by default when building
 from SVN or snapshots, but @samp{release} for releases.  The default
 for building the stage1 compiler is @samp{yes}.  More control
 over the checks may be had by specifying @var{list}.  The categories of
@@ -1717,8 +1717,11 @@  checks available are @samp{yes} (most co
 all), @samp{all} (all but @samp{valgrind}), @samp{release} (cheapest
 checks @samp{assert,runtime}) or @samp{none} (same as @samp{no}).
 Individual checks can be enabled with these flags @samp{assert},
-@samp{df}, @samp{fold}, @samp{gc}, @samp{gcac} @samp{misc}, @samp{rtl},
-@samp{rtlflag}, @samp{runtime}, @samp{tree}, and @samp{valgrind}.
+@samp{df}, @samp{fold}, @samp{gc}, @samp{gcac}, @samp{misc}, @samp{rtl},
+@samp{rtlflag}, @samp{runtime}, @samp{tree}, @samp{extra} and @samp{valgrind}.
+@samp{extra} adds for @samp{misc} checking extra checks that might affect
+code generation and should therefore not differ between stage1 and later
+stages.
 
 The @samp{valgrind} check requires the external @command{valgrind}
 simulator, available from @uref{http://valgrind.org/}.  The
--- configure.jj	2016-03-17 23:58:35.000000000 +0100
+++ configure	2016-04-25 18:15:42.364740223 +0200
@@ -14850,16 +14850,17 @@  else
   # For --disable-checking or implicit --enable-checking=release, avoid
   # setting --enable-checking=gc in the default stage1 checking for LTO
   # bootstraps.  See PR62077.
-  stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types
   case $BUILD_CONFIG in
     *lto*)
-      if test "x$enable_checking" = x && \
-	 test -d ${srcdir}/gcc && \
-	 test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
-	stage1_checking=--enable-checking=yes,types
-      fi;;
-    *) stage1_checking=--enable-checking=yes,types;;
+      stage1_checking=--enable-checking=release,misc,gimple,rtlflag,tree,types;;
+    *)
+      stage1_checking=--enable-checking=yes,types;;
   esac
+  if test "x$enable_checking" = x && \
+     test -d ${srcdir}/gcc && \
+     test x"`cat ${srcdir}/gcc/DEV-PHASE`" = xexperimental; then
+    stage1_checking=yes,types,extra
+  fi
 else
   stage1_checking=--enable-checking=$enable_checking,types
 fi
--- gcc/configure.jj	2016-01-27 19:47:28.000000000 +0100
+++ gcc/configure	2016-04-25 18:02:16.701537995 +0200
@@ -1596,7 +1596,7 @@  Optional Features:
                           enable expensive run-time checks. With LIST, enable
                           only specific categories of checks. Categories are:
                           yes,no,all,none,release. Flags are:
-                          assert,df,fold,gc,gcac,gimple,misc,
+                          assert,df,extra,fold,gc,gcac,gimple,misc,
                           rtlflag,rtl,runtime,tree,valgrind,types
   --enable-coverage[=LEVEL]
                           enable compiler's code coverage collection. Use to
@@ -7075,7 +7075,7 @@  else
 
 # Determine the default checks.
 if test x$is_release = x ; then
-  ac_checking_flags=yes
+  ac_checking_flags=yes,extra
 else
   ac_checking_flags=release
 fi
@@ -7087,32 +7087,33 @@  do
 	case $check in
 	# these set all the flags to specific states
 	yes)		ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking= ;
-			ac_fold_checking= ; ac_gc_checking=1 ;
+			ac_fold_checking= ; ac_gc_checking=1 ; ac_extra_checking= ;
 			ac_gc_always_collect= ; ac_gimple_checking=1 ; ac_rtl_checking= ;
 			ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
 			ac_tree_checking=1 ; ac_valgrind_checking= ;
 			ac_types_checking=1 ;;
 	no|none)	ac_assert_checking= ; ac_checking= ; ac_df_checking= ;
-			ac_fold_checking= ; ac_gc_checking= ;
+			ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
 			ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
 			ac_rtlflag_checking= ; ac_runtime_checking= ;
 			ac_tree_checking= ; ac_valgrind_checking= ;
 			ac_types_checking= ;;
 	all)		ac_assert_checking=1 ; ac_checking=1 ; ac_df_checking=1 ;
-			ac_fold_checking=1 ; ac_gc_checking=1 ;
+			ac_fold_checking=1 ; ac_gc_checking=1 ; ac_extra_checking=1 ;
 			ac_gc_always_collect=1 ; ac_gimple_checking=1 ; ac_rtl_checking=1 ;
 			ac_rtlflag_checking=1 ; ac_runtime_checking=1 ;
 			ac_tree_checking=1 ; ac_valgrind_checking= ;
 			ac_types_checking=1 ;;
 	release)	ac_assert_checking=1 ; ac_checking= ; ac_df_checking= ;
-			ac_fold_checking= ; ac_gc_checking= ;
+			ac_fold_checking= ; ac_gc_checking= ; ac_extra_checking= ;
 			ac_gc_always_collect= ; ac_gimple_checking= ; ac_rtl_checking= ;
 			ac_rtlflag_checking= ; ac_runtime_checking=1 ;
 			ac_tree_checking= ; ac_valgrind_checking= ;
 			ac_types_checking= ;;
 	# these enable particular checks
 	assert) 	ac_assert_checking=1 ;;
-	df)	 	ac_df_checking=1 ;;
+	df)		ac_df_checking=1 ;;
+	extra)		ac_extra_checking=1 ;;
 	fold)		ac_fold_checking=1 ;;
 	gc)		ac_gc_checking=1 ;;
 	gcac)		ac_gc_always_collect=1 ;;
@@ -7131,8 +7132,13 @@  IFS="$ac_save_IFS"
 
 nocommon_flag=""
 if test x$ac_checking != x ; then
+  if test x$ac_extra_checking != x ; then
+    ac_checking=2
+  fi
 
-$as_echo "#define CHECKING_P 1" >>confdefs.h
+cat >>confdefs.h <<_ACEOF
+#define CHECKING_P $ac_checking
+_ACEOF
 
   nocommon_flag=-fno-common
 else
@@ -18453,7 +18459,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18456 "configure"
+#line 18462 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -18559,7 +18565,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18562 "configure"
+#line 18568 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
--- gcc/config.in.jj	2016-01-26 20:50:26.000000000 +0100
+++ gcc/config.in	2016-04-25 18:02:20.000000000 +0200
@@ -31,7 +31,8 @@ 
 
 
 /* Define to 1 if you want more run-time sanity checks. This one gets a grab
-   bag of miscellaneous but relatively cheap checks. */
+   bag of miscellaneous but relatively cheap checks. Define to 2 if you want
+   also extra run-time checking that might affect code generation. */
 #ifndef USED_FOR_TARGET
 #undef CHECKING_P
 #endif