summaryrefslogtreecommitdiff
path: root/tools/bugpoint/Miscompilation.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-04-24 20:16:29 +0000
committerChris Lattner <sabre@nondot.org>2003-04-24 20:16:29 +0000
commit126840f49e8d49156a342e836d4b2adca46dc3ba (patch)
tree2f1ecfaa376760827d99d436bd9b4c33d1c9560f /tools/bugpoint/Miscompilation.cpp
parenta172846d3a9f28e5db781e05e747a57854177868 (diff)
downloadllvm-126840f49e8d49156a342e836d4b2adca46dc3ba.tar.gz
llvm-126840f49e8d49156a342e836d4b2adca46dc3ba.tar.bz2
llvm-126840f49e8d49156a342e836d4b2adca46dc3ba.tar.xz
Move the ListReducer Class into it's own header file instead of living in Miscompilation.cpp
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5907 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/bugpoint/Miscompilation.cpp')
-rw-r--r--tools/bugpoint/Miscompilation.cpp74
1 files changed, 1 insertions, 73 deletions
diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp
index 4960b8205d..89854f52c3 100644
--- a/tools/bugpoint/Miscompilation.cpp
+++ b/tools/bugpoint/Miscompilation.cpp
@@ -6,6 +6,7 @@
#include "BugDriver.h"
#include "SystemUtils.h"
+#include "ListReducer.h"
#include "llvm/Pass.h"
#include "llvm/Module.h"
#include "llvm/Transforms/Utils/Cloning.h"
@@ -26,79 +27,6 @@ namespace {
"(for miscompilation detection)"));
}
-template<typename ElTy>
-struct ListReducer {
- enum TestResult {
- NoFailure, // No failure of the predicate was detected
- KeepSuffix, // The suffix alone satisfies the predicate
- KeepPrefix, // The prefix alone satisfies the predicate
- };
-
- // doTest - This virtual function should be overriden by subclasses to
- // implement the test desired. The testcase is only required to test to see
- // if the Kept list still satisfies the property, but if it is going to check
- // the prefix anyway, it can.
- //
- virtual TestResult doTest(const std::vector<ElTy> &Prefix,
- const std::vector<ElTy> &Kept) = 0;
-
- // reduceList - This function attempts to reduce the length of the specified
- // list while still maintaining the "test" property. This is the core of the
- // "work" that bugpoint does.
- //
- void reduceList(std::vector<ElTy> &TheList) {
- unsigned MidTop = TheList.size();
- while (MidTop > 1) {
- unsigned Mid = MidTop / 2;
- std::vector<ElTy> Prefix(TheList.begin()+Mid, TheList.end());
- std::vector<ElTy> Kept (TheList.begin(), TheList.begin()+Mid);
-
- switch (doTest(Prefix, Kept)) {
- case KeepSuffix:
- // The property still holds. We can just drop the prefix elements, and
- // shorten the list to the "kept" elements.
- TheList.swap(Kept);
- MidTop = TheList.size();
- break;
- case KeepPrefix:
- // The predicate still holds, shorten the list to the prefix elements.
- TheList.swap(Prefix);
- MidTop = TheList.size();
- break;
- case NoFailure:
- // Otherwise the property doesn't hold. Some of the elements we removed
- // must be neccesary to maintain the property.
- MidTop = Mid;
- break;
- }
- }
-
- // Okay, we trimmed as much off the top and the bottom of the list as we
- // could. If there is more two elements in the list, try deleting interior
- // elements and testing that.
- //
- if (TheList.size() > 2) {
- bool Changed = true;
- std::vector<ElTy> EmptyList;
- while (Changed) {
- Changed = false;
- std::vector<ElTy> TrimmedList;
- for (unsigned i = 1; i < TheList.size()-1; ++i) { // Check interior elts
- std::vector<ElTy> TestList(TheList);
- TestList.erase(TestList.begin()+i);
-
- if (doTest(EmptyList, TestList) == KeepSuffix) {
- // We can trim down the list!
- TheList.swap(TestList);
- --i; // Don't skip an element of the list
- Changed = true;
- }
- }
- }
- }
- }
-};
-
class ReduceMiscompilingPasses : public ListReducer<const PassInfo*> {
BugDriver &BD;
public: