forked from OSchip/llvm-project
Revert "A new hidden option exec-on-ir-change=exe that calls exe each time IR changes"
This reverts commit dff0e8b4ff
.
Failing build: https://lab.llvm.org/buildbot/#/builders/42/builds/2800
This commit is contained in:
parent
427f6e11e6
commit
864ca42483
|
@ -269,32 +269,6 @@ protected:
|
|||
Any) override;
|
||||
};
|
||||
|
||||
class IRChangedTester : public IRChangedPrinter {
|
||||
public:
|
||||
IRChangedTester() : IRChangedPrinter(true) {}
|
||||
~IRChangedTester() override;
|
||||
void registerCallbacks(PassInstrumentationCallbacks &PIC);
|
||||
|
||||
protected:
|
||||
void handleIR(const std::string &IR, StringRef PassID);
|
||||
|
||||
// Check initial IR
|
||||
void handleInitialIR(Any IR) override;
|
||||
// Do nothing.
|
||||
void omitAfter(StringRef PassID, std::string &Name) override;
|
||||
// Do nothing.
|
||||
void handleInvalidated(StringRef PassID) override;
|
||||
// Do nothing.
|
||||
void handleFiltered(StringRef PassID, std::string &Name) override;
|
||||
// Do nothing.
|
||||
void handleIgnored(StringRef PassID, std::string &Name) override;
|
||||
|
||||
// Call test as interesting IR has changed.
|
||||
void handleAfter(StringRef PassID, std::string &Name,
|
||||
const std::string &Before, const std::string &After,
|
||||
Any) override;
|
||||
};
|
||||
|
||||
// Information that needs to be saved for a basic block in order to compare
|
||||
// before and after the pass to determine if it was changed by a pass.
|
||||
template <typename T> class BlockDataT {
|
||||
|
@ -530,7 +504,6 @@ class StandardInstrumentations {
|
|||
PseudoProbeVerifier PseudoProbeVerification;
|
||||
InLineChangePrinter PrintChangedDiff;
|
||||
DotCfgChangeReporter WebsiteChangeReporter;
|
||||
IRChangedTester ChangeTester;
|
||||
VerifyInstrumentation Verify;
|
||||
|
||||
bool VerifyEach;
|
||||
|
|
|
@ -164,61 +164,8 @@ static cl::opt<std::string> DotCfgDir(
|
|||
cl::desc("Generate dot files into specified directory for changed IRs"),
|
||||
cl::Hidden, cl::init("./"));
|
||||
|
||||
// An option for specifying an executable that will be called with the IR
|
||||
// everytime it changes in the opt pipeline. It will also be called on
|
||||
// the initial IR as it enters the pipeline. The executable will be passed
|
||||
// the name of a temporary file containing the IR and the PassID. This may
|
||||
// be used, for example, to call llc on the IR and run a test to determine
|
||||
// which pass makes a change that changes the functioning of the IR.
|
||||
// The usual modifier options work as expected.
|
||||
static cl::opt<std::string>
|
||||
TestChanged("exec-on-ir-change", cl::Hidden, cl::init(""),
|
||||
cl::desc("exe called with module IR after each pass that "
|
||||
"changes it"));
|
||||
|
||||
namespace {
|
||||
|
||||
// Ensure temporary files exist, creating or re-using them. \p FD contains
|
||||
// file descriptors (-1 indicates that the file should be created) and
|
||||
// \p SR contains the corresponding initial content. \p FileName will have
|
||||
// the filenames filled in when creating files. Return any error message
|
||||
// or "" if none.
|
||||
std::string prepareTempFiles(SmallVector<int> &FD, ArrayRef<StringRef> SR,
|
||||
SmallVector<std::string> &FileName) {
|
||||
assert(FD.size() >= SR.size() && FileName.size() == FD.size() &&
|
||||
"Unexpected array sizes");
|
||||
for (unsigned I = 0; I < FD.size(); ++I) {
|
||||
if (FD[I] == -1) {
|
||||
SmallVector<char, 200> SV;
|
||||
std::error_code EC =
|
||||
sys::fs::createTemporaryFile("tmpdiff", "txt", FD[I], SV);
|
||||
if (EC)
|
||||
return "Unable to create temporary file.";
|
||||
FileName[I] = Twine(SV).str();
|
||||
}
|
||||
// Only the first M files have initial content.
|
||||
if (I < SR.size()) {
|
||||
std::error_code EC = sys::fs::openFileForWrite(FileName[I], FD[I]);
|
||||
if (EC)
|
||||
return "Unable to open temporary file for writing.";
|
||||
raw_fd_ostream OutStream(FD[I], /*shouldClose=*/true);
|
||||
if (FD[I] == -1)
|
||||
return "Error opening file for writing.";
|
||||
OutStream << SR[I];
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string cleanUpTempFiles(ArrayRef<std::string> FileName) {
|
||||
for (unsigned I = 0; I < FileName.size(); ++I) {
|
||||
std::error_code EC = sys::fs::remove(FileName[I]);
|
||||
if (EC)
|
||||
return "Unable to remove temporary file.";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
// Perform a system based diff between \p Before and \p After, using
|
||||
// \p OldLineFormat, \p NewLineFormat, and \p UnchangedLineFormat
|
||||
// to control the formatting of the output. Return an error message
|
||||
|
@ -226,14 +173,34 @@ std::string cleanUpTempFiles(ArrayRef<std::string> FileName) {
|
|||
std::string doSystemDiff(StringRef Before, StringRef After,
|
||||
StringRef OldLineFormat, StringRef NewLineFormat,
|
||||
StringRef UnchangedLineFormat) {
|
||||
StringRef SR[2]{Before, After};
|
||||
// Store the 2 bodies into temporary files and call diff on them
|
||||
// to get the body of the node.
|
||||
static SmallVector<int> FD{-1, -1, -1};
|
||||
SmallVector<StringRef> SR{Before, After};
|
||||
static SmallVector<std::string> FileName{"", "", ""};
|
||||
std::string Err = prepareTempFiles(FD, SR, FileName);
|
||||
if (Err != "")
|
||||
return Err;
|
||||
const unsigned NumFiles = 3;
|
||||
static std::string FileName[NumFiles];
|
||||
static int FD[NumFiles]{-1, -1, -1};
|
||||
for (unsigned I = 0; I < NumFiles; ++I) {
|
||||
if (FD[I] == -1) {
|
||||
SmallVector<char, 200> SV;
|
||||
std::error_code EC =
|
||||
sys::fs::createTemporaryFile("tmpdiff", "txt", FD[I], SV);
|
||||
if (EC)
|
||||
return "Unable to create temporary file.";
|
||||
FileName[I] = Twine(SV).str();
|
||||
}
|
||||
// The third file is used as the result of the diff.
|
||||
if (I == NumFiles - 1)
|
||||
break;
|
||||
|
||||
std::error_code EC = sys::fs::openFileForWrite(FileName[I], FD[I]);
|
||||
if (EC)
|
||||
return "Unable to open temporary file for writing.";
|
||||
|
||||
raw_fd_ostream OutStream(FD[I], /*shouldClose=*/true);
|
||||
if (FD[I] == -1)
|
||||
return "Error opening file for writing.";
|
||||
OutStream << SR[I];
|
||||
}
|
||||
|
||||
static ErrorOr<std::string> DiffExe = sys::findProgramByName(DiffBinary);
|
||||
if (!DiffExe)
|
||||
|
@ -257,10 +224,12 @@ std::string doSystemDiff(StringRef Before, StringRef After,
|
|||
else
|
||||
return "Unable to read result.";
|
||||
|
||||
Err = cleanUpTempFiles(FileName);
|
||||
if (Err != "")
|
||||
return Err;
|
||||
|
||||
// Clean up.
|
||||
for (const std::string &I : FileName) {
|
||||
std::error_code EC = sys::fs::remove(I);
|
||||
if (EC)
|
||||
return "Unable to remove temporary file.";
|
||||
}
|
||||
return Diff;
|
||||
}
|
||||
|
||||
|
@ -651,59 +620,6 @@ void IRChangedPrinter::handleAfter(StringRef PassID, std::string &Name,
|
|||
Out << "*** IR Dump After " << PassID << " on " << Name << " ***\n" << After;
|
||||
}
|
||||
|
||||
IRChangedTester::~IRChangedTester() {}
|
||||
|
||||
void IRChangedTester::registerCallbacks(PassInstrumentationCallbacks &PIC) {
|
||||
if (TestChanged != "")
|
||||
TextChangeReporter<std::string>::registerRequiredCallbacks(PIC);
|
||||
}
|
||||
|
||||
void IRChangedTester::handleIR(const std::string &S, StringRef PassID) {
|
||||
// Store the body into a temporary file
|
||||
static SmallVector<int> FD{-1};
|
||||
SmallVector<StringRef> SR{S};
|
||||
static SmallVector<std::string> FileName{""};
|
||||
std::string Err = prepareTempFiles(FD, SR, FileName);
|
||||
if (Err != "") {
|
||||
dbgs() << Err;
|
||||
return;
|
||||
}
|
||||
static ErrorOr<std::string> Exe = sys::findProgramByName(TestChanged);
|
||||
if (!Exe) {
|
||||
dbgs() << "Unable to find test-changed executable.";
|
||||
return;
|
||||
}
|
||||
|
||||
StringRef Args[] = {TestChanged, FileName[0], PassID};
|
||||
int Result = sys::ExecuteAndWait(*Exe, Args);
|
||||
if (Result < 0) {
|
||||
dbgs() << "Error executing test-changed executable.";
|
||||
return;
|
||||
}
|
||||
|
||||
Err = cleanUpTempFiles(FileName);
|
||||
if (Err != "")
|
||||
dbgs() << Err;
|
||||
}
|
||||
|
||||
void IRChangedTester::handleInitialIR(Any IR) {
|
||||
// Always test the initial module.
|
||||
// Unwrap and print directly to avoid filtering problems in general routines.
|
||||
std::string S;
|
||||
generateIRRepresentation(IR, "Initial IR", S);
|
||||
handleIR(S, "Initial IR");
|
||||
}
|
||||
|
||||
void IRChangedTester::omitAfter(StringRef PassID, std::string &Name) {}
|
||||
void IRChangedTester::handleInvalidated(StringRef PassID) {}
|
||||
void IRChangedTester::handleFiltered(StringRef PassID, std::string &Name) {}
|
||||
void IRChangedTester::handleIgnored(StringRef PassID, std::string &Name) {}
|
||||
void IRChangedTester::handleAfter(StringRef PassID, std::string &Name,
|
||||
const std::string &Before,
|
||||
const std::string &After, Any) {
|
||||
handleIR(After, PassID);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void OrderedChangedData<T>::report(
|
||||
const OrderedChangedData &Before, const OrderedChangedData &After,
|
||||
|
@ -2216,7 +2132,6 @@ void StandardInstrumentations::registerCallbacks(
|
|||
Verify.registerCallbacks(PIC);
|
||||
PrintChangedDiff.registerCallbacks(PIC);
|
||||
WebsiteChangeReporter.registerCallbacks(PIC);
|
||||
ChangeTester.registerCallbacks(PIC);
|
||||
}
|
||||
|
||||
template class ChangeReporter<std::string>;
|
||||
|
|
|
@ -1,103 +0,0 @@
|
|||
; Simple checks of -exec-on-ir-change=cat functionality
|
||||
;
|
||||
; Simple functionality check.
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes=instsimplify 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-SIMPLE
|
||||
;
|
||||
; Check that only the passes that change the IR are printed and that the
|
||||
; others (including g) are filtered out.
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes=instsimplify -filter-print-funcs=f 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-FUNC-FILTER
|
||||
;
|
||||
; Check that the reporting of IRs respects -print-module-scope
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes=instsimplify -print-module-scope 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-PRINT-MOD-SCOPE
|
||||
;
|
||||
; Check that the reporting of IRs respects -print-module-scope
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes=instsimplify -filter-print-funcs=f -print-module-scope 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-FUNC-FILTER-MOD-SCOPE
|
||||
;
|
||||
; Check that reporting of multiple functions happens
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes=instsimplify -filter-print-funcs="f,g" 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-FILTER-MULT-FUNC
|
||||
;
|
||||
; Check that the reporting of IRs respects -filter-passes
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes="instsimplify,no-op-function" -filter-passes="NoOpFunctionPass" 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-FILTER-PASSES
|
||||
;
|
||||
; Check that the reporting of IRs respects -filter-passes with multiple passes
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes="instsimplify,no-op-function" -filter-passes="NoOpFunctionPass,InstSimplifyPass" 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-FILTER-MULT-PASSES
|
||||
;
|
||||
; Check that the reporting of IRs respects both -filter-passes and -filter-print-funcs
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes="instsimplify,no-op-function" -filter-passes="NoOpFunctionPass,InstSimplifyPass" -filter-print-funcs=f 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-FILTER-FUNC-PASSES
|
||||
;
|
||||
; Check that the reporting of IRs respects -filter-passes, -filter-print-funcs and -print-module-scope
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes="instsimplify,no-op-function" -filter-passes="NoOpFunctionPass,InstSimplifyPass" -filter-print-funcs=f -print-module-scope 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-FILTER-FUNC-PASSES-MOD-SCOPE
|
||||
;
|
||||
; Check that repeated passes that change the IR are printed and that the
|
||||
; others (including g) are filtered out. Note that the second time
|
||||
; instsimplify is run on f, it does not change the IR
|
||||
; RUN: opt -S -exec-on-ir-change=cat -passes="instsimplify,instsimplify" -filter-print-funcs=f 2>&1 -o /dev/null < %s | FileCheck %s --check-prefix=CHECK-MULT-PASSES-FILTER-FUNC
|
||||
;
|
||||
|
||||
define i32 @g() {
|
||||
entry:
|
||||
%a = add i32 2, 3
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f() {
|
||||
entry:
|
||||
%a = add i32 2, 3
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
; CHECK-SIMPLE: ; ModuleID = {{.+}}
|
||||
; CHECK-SIMPLE: cat:{{.*}}Initial IR
|
||||
; CHECK-SIMPLE: define i32 @g()
|
||||
; CHECK-SIMPLE: cat:{{.*}}InstSimplifyPass
|
||||
; CHECK-SIMPLE: define i32 @f()
|
||||
; CHECK-SIMPLE: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-FUNC-FILTER: define i32 @f()
|
||||
; CHECK-FUNC-FILTER: cat:{{.*}}Initial IR
|
||||
; CHECK-FUNC-FILTER: define i32 @f()
|
||||
; CHECK-FUNC-FILTER: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-PRINT-MOD-SCOPE: ModuleID = {{.+}}
|
||||
; CHECK-PRINT-MOD-SCOPE: cat:{{.*}}Initial IR
|
||||
; CHECK-PRINT-MOD-SCOPE: ModuleID = {{.+}}
|
||||
; CHECK-PRINT-MOD-SCOPE: cat:{{.*}}InstSimplifyPass
|
||||
; CHECK-PRINT-MOD-SCOPE: ModuleID = {{.+}}
|
||||
; CHECK-PRINT-MOD-SCOPE: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-FUNC-FILTER-MOD-SCOPE: ; ModuleID = {{.+}}
|
||||
; CHECK-FUNC-FILTER-MOD-SCOPE: cat:{{.*}}Initial IR
|
||||
; CHECK-FUNC-FILTER-MOD-SCOPE: ModuleID = {{.+}}
|
||||
; CHECK-FUNC-FILTER-MOD-SCOPE: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-FILTER-MULT-FUNC: define i32 @g()
|
||||
; CHECK-FILTER-MULT-FUNC: cat:{{.*}}Initial IR
|
||||
; CHECK-FILTER-MULT-FUNC: define i32 @g()
|
||||
; CHECK-FILTER-MULT-FUNC: cat:{{.*}}InstSimplifyPass
|
||||
; CHECK-FILTER-MULT-FUNC: define i32 @f()
|
||||
; CHECK-FILTER-MULT-FUNC: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-FILTER-PASSES: define i32 @g()
|
||||
; CHECK-FILTER-PASSES: cat:{{.*}}Initial IR
|
||||
|
||||
; CHECK-FILTER-MULT-PASSES: define i32 @g()
|
||||
; CHECK-FILTER-MULT-PASSES: cat:{{.*}}Initial IR
|
||||
; CHECK-FILTER-MULT-PASSES: define i32 @g()
|
||||
; CHECK-FILTER-MULT-PASSES: cat:{{.*}}InstSimplifyPass
|
||||
; CHECK-FILTER-MULT-PASSES: define i32 @f()
|
||||
; CHECK-FILTER-MULT-PASSES: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-FILTER-FUNC-PASSES: define i32 @f()
|
||||
; CHECK-FILTER-FUNC-PASSES: cat:{{.*}}Initial IR
|
||||
; CHECK-FILTER-FUNC-PASSES: define i32 @f()
|
||||
; CHECK-FILTER-FUNC-PASSES: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE: ; ModuleID = {{.+}}
|
||||
; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE: cat:{{.*}}Initial IR
|
||||
; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE: ModuleID = {{.+}}
|
||||
; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE: cat:{{.*}}InstSimplifyPass
|
||||
|
||||
; CHECK-MULT-PASSES-FILTER-FUNC: define i32 @f()
|
||||
; CHECK-MULT-PASSES-FILTER-FUNC: cat:{{.*}}Initial IR
|
||||
; CHECK-MULT-PASSES-FILTER-FUNC: define i32 @f()
|
||||
; CHECK-MULT-PASSES-FILTER-FUNC: cat:{{.*}}InstSimplifyPass
|
Loading…
Reference in New Issue