From: Chris Lattner Date: Thu, 24 Apr 2003 20:16:29 +0000 (+0000) Subject: Move the ListReducer Class into it's own header file instead of living in Miscompilat... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=126840f49e8d49156a342e836d4b2adca46dc3ba;p=oota-llvm.git 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 --- diff --git a/tools/bugpoint/ListReducer.h b/tools/bugpoint/ListReducer.h new file mode 100644 index 00000000000..1751c77b185 --- /dev/null +++ b/tools/bugpoint/ListReducer.h @@ -0,0 +1,86 @@ +//===- ListReducer.h - Trim down list while retaining property --*- C++ -*-===// +// +// This class is to be used as a base class for operations that want to zero in +// on a subset of the input which still causes the bug we are tracking. +// +//===----------------------------------------------------------------------===// + +#ifndef BUGPOINT_LIST_REDUCER_H +#define BUGPOINT_LIST_REDUCER_H + +#include + +template +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 &Prefix, + const std::vector &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 &TheList) { + unsigned MidTop = TheList.size(); + while (MidTop > 1) { + unsigned Mid = MidTop / 2; + std::vector Prefix(TheList.begin()+Mid, TheList.end()); + std::vector 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 EmptyList; + while (Changed) { + Changed = false; + std::vector TrimmedList; + for (unsigned i = 1; i < TheList.size()-1; ++i) { // Check interior elts + std::vector 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; + } + } + } + } + } +}; + +#endif diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp index 4960b8205de..89854f52c3f 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 -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 &Prefix, - const std::vector &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 &TheList) { - unsigned MidTop = TheList.size(); - while (MidTop > 1) { - unsigned Mid = MidTop / 2; - std::vector Prefix(TheList.begin()+Mid, TheList.end()); - std::vector 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 EmptyList; - while (Changed) { - Changed = false; - std::vector TrimmedList; - for (unsigned i = 1; i < TheList.size()-1; ++i) { // Check interior elts - std::vector 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 { BugDriver &BD; public: