103 lines
3.9 KiB
Markdown
103 lines
3.9 KiB
Markdown
# Bugpoint Redesign
|
||
Author: Diego Treviño (diegotf@google.com)
|
||
|
||
Date: 2019-06-05
|
||
|
||
Status: Draft
|
||
|
||
|
||
## Introduction
|
||
As use of bugpoint has grown several areas of improvement have been identified
|
||
through years of use: confusing to use, slow, it doesn’t always produce high
|
||
quality test cases, etc. This document proposes a new approach with a narrower
|
||
focus: minimization of IR test cases.
|
||
|
||
|
||
## Proposed New Design
|
||
|
||
|
||
### Narrow focus: test-case reduction
|
||
The main focus will be a code reduction strategy to obtain much smaller test
|
||
cases that still have the same property as the original one. This will be done
|
||
via classic delta debugging and by adding some IR-specific reductions (e.g.
|
||
replacing globals, removing unused instructions, etc), similar to what
|
||
already exists, but with more in-depth minimization.
|
||
|
||
|
||
Granted, if the community differs on this proposal, the legacy code could still
|
||
be present in the tool, but with the caveat of still being documented and
|
||
designed towards delta reduction.
|
||
|
||
|
||
### Command-Line Options
|
||
We are proposing to reduce the plethora of bugpoint’s options to just two: an
|
||
interesting-ness test and the arguments for said test, similar to other delta
|
||
reduction tools such as CReduce, Delta, and Lithium; the tool should feel less
|
||
cluttered, and there should also be no uncertainty about how to operate it.
|
||
|
||
|
||
The interesting-ness test that’s going to be run to reduce the code is given
|
||
by name:
|
||
`--test=<test_name>`
|
||
If a `--test` option is not given, the program exits; this option is similar
|
||
to bugpoint’s current `-compile-custom` option, which lets the user run a
|
||
custom script.
|
||
|
||
|
||
The interesting-ness test would be defined as a script that returns 0 when the
|
||
IR achieves a user-defined behaviour (e.g. failure to compile on clang) and a
|
||
nonzero value when otherwise. Leaving the user the freedom to determine what is
|
||
and isn’t interesting to the tool, and thus, streamlining the process of
|
||
reducing a test-case.
|
||
|
||
|
||
If the test accepts any arguments (excluding the input ll/bc file), they are
|
||
given via the following flag:
|
||
`--test_args=<test_arguments>`
|
||
If unspecified, the test is run as given. It’s worth noting that the input file
|
||
would be passed as a parameter to the test, similar how `-compile-custom`
|
||
currently operates.
|
||
|
||
|
||
### Implementation
|
||
The tool would behave similar to CReduce’s functionality in that it would have a
|
||
list of passes that try to minimize the given test-case. We should be able to
|
||
modularize the tool’s behavior, as well as making it easier to maintain and
|
||
expand.
|
||
|
||
|
||
The first version of this redesign would try to:
|
||
|
||
|
||
* Discard functions, instructions and metadata that don’t influence the
|
||
interesting-ness test
|
||
* Remove unused parameters from functions
|
||
* Eliminate unvisited conditional paths
|
||
* Rename variables to more regular ones (such as “a”, “b”, “c”, etc.)
|
||
|
||
|
||
Once these passes are implemented, more meaningful reductions (such as type
|
||
reduction) would be added to the tool, to even further reduce IR.
|
||
|
||
|
||
## Background on historical bugpoint issues
|
||
|
||
|
||
### Root Cause Analysis
|
||
Presently, bugpoint takes a long time to find the source problem in a given IR
|
||
file, mainly due to the fact that it tries to debug the input by running
|
||
various strategies to classify the bug, which in turn run multiple optimizer
|
||
and compilation passes over the input, taking up a lot of time. Furthermore,
|
||
when the IR crashes, it tries to reduce it by performing some sub-optimal
|
||
passes (e.g. a lot of unreachable blocks), and sometimes even fails to minimize
|
||
at all.
|
||
|
||
|
||
### "Quirky" Interface
|
||
Bugpoint’s current interface overwhelms and confuses the user, the help screen
|
||
alone ends up confusing rather providing guidance. And, not only are there
|
||
numerous features and options, but some of them also work in unexpected ways
|
||
and most of the time the user ends up using a custom script. Pruning and
|
||
simplifying the interface will be worth considering in order to make the tool
|
||
more useful in the general case and easier to maintain.
|