[llvm-commits] CVS: llvm/tools/bugpoint/ListReducer.h Miscompilation.cpp
Chris Lattner
lattner at cs.uiuc.edu
Thu Apr 24 15:17:03 PDT 2003
Changes in directory llvm/tools/bugpoint:
ListReducer.h added (r1.1)
Miscompilation.cpp updated: 1.4 -> 1.5
---
Log message:
Move the ListReducer Class into it's own header file instead of living in Miscompilation.cpp
---
Diffs of the changes:
Index: llvm/tools/bugpoint/ListReducer.h
diff -c /dev/null llvm/tools/bugpoint/ListReducer.h:1.1
*** /dev/null Thu Apr 24 15:16:44 2003
--- llvm/tools/bugpoint/ListReducer.h Thu Apr 24 15:16:29 2003
***************
*** 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 <vector>
+
+ 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;
+ }
+ }
+ }
+ }
+ }
+ };
+
+ #endif
Index: llvm/tools/bugpoint/Miscompilation.cpp
diff -u llvm/tools/bugpoint/Miscompilation.cpp:1.4 llvm/tools/bugpoint/Miscompilation.cpp:1.5
--- llvm/tools/bugpoint/Miscompilation.cpp:1.4 Thu Apr 24 14:32:42 2003
+++ llvm/tools/bugpoint/Miscompilation.cpp Thu Apr 24 15:16:29 2003
@@ -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"
@@ -25,79 +26,6 @@
Output("output", cl::desc("Specify a reference program output "
"(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;
More information about the llvm-commits
mailing list