diff options
author | Chris Lattner <sabre@nondot.org> | 2003-04-24 20:16:29 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-04-24 20:16:29 +0000 |
commit | 126840f49e8d49156a342e836d4b2adca46dc3ba (patch) | |
tree | 2f1ecfaa376760827d99d436bd9b4c33d1c9560f /tools/bugpoint/Miscompilation.cpp | |
parent | a172846d3a9f28e5db781e05e747a57854177868 (diff) | |
download | llvm-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.cpp | 74 |
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: |