Hi, On Thu, May 28 2020, Martin Liška wrote: > Hello. > > I've spent quite some time working of a super-parallel reduction tool > and I would like to promote it ;) Moreover, delta website is down and > it should be replaced: [1]. > > There's updated wording of the following WIKI page: > https://gcc.gnu.org/wiki/A_guide_to_testcase_reduction > > For all delta lovers who don't like C-Vise (or C-Reduce), I recommend > cvise-delta tool. It works the same as delta, but in a super-parallel way. > > The tool is available on openSUSE and Gentoo Linux. Thanks to Matthias, > the tool will be available soon on Ubuntu and Debian. The RedHat port > is work-in-progress. > > Thoughts?
I don't think you need to seek approval to edit wiki pages and putting c-vise instructions at the top of that page is definitely the right thing to do. On the other hand, I would not remove the delta and multidelta sections but rather move them to the bottom of the page. The instructions may still be useful on various ancient and non-Linux systems. Thanks, Martin > Martin > > [1] http://delta.tigris.org/ > From 4f9bb31b435d0e60ea7cdccd575aa590c943f516 Mon Sep 17 00:00:00 2001 > From: Martin Liska <mli...@suse.cz> > Date: Thu, 28 May 2020 12:54:21 +0200 > Subject: [PATCH] Replace usage of delta (and multidelta) with C-Vise and > C-Reduce. > > --- > guide_to_test_case.txt | 110 ++++++++--------------------------------- > 1 file changed, 20 insertions(+), 90 deletions(-) > > diff --git a/guide_to_test_case.txt b/guide_to_test_case.txt > index 7926b28..cd66c15 100644 > --- a/guide_to_test_case.txt > +++ b/guide_to_test_case.txt > @@ -5,9 +5,7 @@ > Our [[https://gcc.gnu.org/bugs.html|bug reporting instructions]] ask that a > bug report include the preprocessed version of the file that triggers the > bug. There are several [[https://gcc.gnu.org/bugs/minimize.html|methods to > minimise a testcase]]. > > This page ought to serve as an introduction to automatic testcase reduction > using > -the [[http://delta.tigris.org/|Delta]] or > [[http://embed.cs.utah.edu/creduce/|C-Reduce]] tools. > - > -For '''Fortran''' there is a > [[https://gcc.gnu.org/ml/gcc/2009-10/msg00618.html|patched version of Delta]] > which takes `subroutine`/`do`/`if` boundaries into account. > +[[https://github.com/marxin/cvise|C-Vise]] tools or > [[http://embed.cs.utah.edu/creduce/|C-Reduce]] tools. > > == Simple ICE reduction == > > @@ -23,19 +21,15 @@ For '''Fortran''' there is a > [[https://gcc.gnu.org/ml/gcc/2009-10/msg00618.html| > > mv testcase.x testcase.i > }}} > > - The Delta tool requires us to create a script that exits with status zero in > + The C-Vise (or C-Reduce) tool requires us to create a script that exits > with status zero in > case of the intermediate reduced testcase still is a testcase for what we > got > it in the first place (the same ICE is produced). A sample script may look > - like (the testcase filename is passed as argument to the script) > + like > > > {{{ > #!/bin/sh > - gcc -c -O -Wfatal-errors $1 2>&1 | grep 'internal compiler error: in > typeck.c:2534' > - if ! test $? = 0; then > - exit 1 > - fi > - exit 0 > + gcc -c -O -Wfatal-errors testcase.i 2>&1 | grep 'internal compiler error: > in typeck.c:2534' > }}} > > Note the {{{-Wfatal-errors}}} option can greatly speed up reducing large > testcases, > @@ -46,92 +40,35 @@ For '''Fortran''' there is a > [[https://gcc.gnu.org/ml/gcc/2009-10/msg00618.html| > You should be able to verify your script by invoking it with the unreduced > testcase. > Try if it has zero exit code. > > - Now we can invoke Delta to have it reduce the testcase using the script we > just > + Now we can invoke C-Vise (or C-Reduce) to have it reduce the testcase using > the script we just > wrote > > - > {{{ > - > ~/bin/delta -test=check.sh -suffix=.i -cp_minimal=testcase-min.i > testcase.i > + > cvise check.sh testcase.i > }}} > > This will reduce the testcase until no single line can be removed from it > without > the check.sh script failing to identify it as a valid testcase. > > -== Using topformflat == > - > - The way delta reduces a testcase by removing complete lines often conflicts > with > - the syntactic structure of a C/C++ testcase. To make testcase reduction > faster > - and more accurate there exists the topformflat tool in the Delta > distribution > - that puts syntactically related tokens on one line, thereby making it > possible > - to, f.i. restrict reduction to whole-function removal in a first step. > Basically > - you can control the nesting level up to which tokens are put to separate > lines > - where a level of zero is all toplevel constructs onto a line on their own, > level > - one would be each statement of a toplevel function on a separate line. > - > - Reducing a big C++ testcase one usually starts with level zero, increasing > it > - until Delta no longer can reduce the testcase further (due to the > line-oriented > - reduction it may be worthwhile to start over with level zero again and > iterate > - until there's no further reduction). An improved topformflat was posted at > - [[https://gcc.gnu.org/ml/gcc-patches/2005-08/msg01503.html]] where you can > additionally > - specify if you want to ignore namespace and extern "C" as a nesting > construct by > - specifying a second command line argument to topformflat. > - > - > -{{{ > - > ~/bin/topformflat 0 x < testcase.i > testcase.0x.i > -}}} > - > - > -== Using multidelta == > - > -All the above can be simplified by using the '''multidelta''' tool that > comes with the [[http://delta.tigris.org/|Delta distribution]]. The only > differences is that the script should be able to be called without > parameters. In the above example, the new script would be: > - > -{{{ > - #!/bin/bash > - TESTCASE=${1:-testcase.i} > - gcc -c -O -Wfatal-errors -w $TESTCASE 2>&1 | grep -q 'internal compiler > error: in typeck.c:2534' > - if ! test $? = 0; then > - exit 1 > - fi > - exit 0 > -}}} > - > The fastest is this script, the fastest the reduction will be: > > * Avoid optimizing {{{-O0}}} if it is a bug in the front-ends. > * If the bug is not triggered by a warning, disable all warnings {{{-w}}}. > * If the bug is an ICE that also happens with {{{-fpermissive}}}, then use > it. > - * If the bug is not in the preprocessor, use {{{-fpreprocessed}}}, > otherwhise use {{{-E}}}. > + * If the bug is not in the preprocessor, use {{{-fpreprocessed}}}, > otherwhise use {{{-E}}}. > * Use {{{-S}}} to avoid assembling. > * {{{-o /dev/null}}} if you do not need to analyze the output files. > * It may be slightly faster to invoke {{{cc1}}} and {{{cc1plus}}} directly > if the bug is not in the driver. > * For grepping, it is faster to not use regular expressions and invoke > {{{fgrep}}} directly. It is also faster to use the option "--quiet". > > > -Then, you may run multidelta with the command: > - > -{{{ > -multidelta -level=2 ./check.sh testcase.i &> /dev/null > -}}} > - > -Where {{{-level=}}} is the level of topformflat (see above). Check the > progress in the files {{{log}}} and {{{multidelta.log}}}. Multidelta modifies > the input file, but it creates a backup {{{.bak}}} file). The last successful > reduction is always stored in {{{testcase.i.ok}}}. > - > -== Using C-Reduce == > +== Using C-Vise and C-Reduce == > > -Instead of using delta or multidelta it is also possible to run > '''C-Reduce''' on your > -testcase. This reducer specifically targets C and C++ code and makes > +C-Vise and C-Reduce provide much faster reduction than the original delta > tool. > +This reducer specifically targets C and C++ code and makes > coordinated changes across the whole program: removing an array dimension, > -removing a function argument, reordering function calls, etc. It will first > automatically > -run a few passes that are identical to multidelta, so there is no need to run > -delta or mulitdelta first. Creduce runs in parallel by default if multiple > cores are available. > - > -C-Reduce can be found here: [[http://embed.cs.utah.edu/creduce/]] > - > -You may run C-Reduce with the same script that multidelta uses above: > - > -{{{ > -creduce check.sh testcase.i > -}}} > +removing a function argument, reordering function calls, etc. > +C-Vise runs in parallel by default if multiple cores are available. > > == Reducing "works with -O, doesn't work with -O2" type bugs == > > @@ -172,17 +109,14 @@ creduce check.sh testcase.i > > If you need to reduce testcases for LTO bugs that happen at link stage you > have the problem > that many object files (and thus source files) can be involved. If the bug > is an internal > - compiler error you can bisect the files needed to trigger the bug using > delta. From the > - lto1 invocation command extract the list-of-objects file (@/tmp/ccXXXXX) > [use "-v -Wl,-debug" to find that line]; change spaces to newlines in there > and prepend the current working directory name. Then use delta > - on that file with a check script similar to > + compiler error you can bisect the files needed to trigger the bug using > cvise-delta > + (provided by C-Vise package). From the lto1 invocation command extract the > list-of-objects file (@/tmp/ccXXXXX) > + [use "-v -Wl,-debug" to find that line]; change spaces to newlines in there > and prepend the current working directory name. > + Then use C-Vise (or C-Reduce) on that file with a check script similar to > > {{{ > #!/bin/sh > - > /path/to/lto1 -o /dev/null @$1 rest-of-your-options 2>&1 | grep '...the > ICE...' > - if ! test $? = 0; then > - exit 1 > - fi > }}} > > Now generate preprocessed source for the files required to build the > remaining object files. > @@ -192,19 +126,19 @@ creduce check.sh testcase.i > gcc -r -nostdlib preprocessed-inputs rest-of-your-options > }}} > > - And the preprocessed files can now be individually reduced with delta. Be > careful with > + And the preprocessed files can now be individually reduced with C-Vise. > Be careful with > creating invalid testcases here though. Safe reduction can be done on > topflatform level 0 > and level 0 with ignoring namespaces. This is to avoid differences in > type layout for > same types in different files. > > - <<BR>>Alternatively creduce multi-file reduction may be used: > + <<BR>>Alternatively C-Vise multi-file reduction may be used: > {{{ > - creduce ./check.sh file1.ii file2.ii file3.ii ... > + cvise ./check.sh file1.ii file2.ii file3.ii ... > }}} > > == Further hints == > > - Sometimes it may be advisable to preserve parts of the testcase completely > to make delta > + Sometimes it may be advisable to preserve parts of the testcase completely > to make C-Vise (or C-Reduce) > not reduce the testcase to nonsense still passing your script. This is > also useful if > you just want the smallest possible self-contained source for a function to > ease analyzing > whatever you are interested in. Split your testcase into two parts, one to > be reduced and > @@ -216,10 +150,6 @@ creduce check.sh testcase.i > #!/bin/sh > cat $1 ../../tail.i > x.i > gcc -S x.i -Wfatal-errors > - if ! test "$?" = "0"; then > - exit 1 > - fi > - exit 0 > }}} > > You can even check for the same asm created in the above scheme, but you > need to carefully > -- > 2.26.2