From c4ce4265043b28cbdae63ae4e0bf152b5d330b44 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Wed, 8 Dec 2021 13:57:25 -0800 Subject: [PATCH] Revert "A new hidden option test-changed=exe that calls exe after each time IR changes" This reverts commit f9235e45fd1f5ca21f95105427184a6afd0f9d95. Causes breakages on Windows: http://45.33.8.238/win/50453/step_11.txt. --- .../include/llvm/Passes/StandardInstrumentations.h | 27 ---- llvm/lib/Passes/StandardInstrumentations.cpp | 145 +++++---------------- llvm/test/Other/test-changed-script.sh | 4 - llvm/test/Other/test-changed.ll | 103 --------------- 4 files changed, 30 insertions(+), 249 deletions(-) delete mode 100755 llvm/test/Other/test-changed-script.sh delete mode 100644 llvm/test/Other/test-changed.ll diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h index 1446c58..6cab4ce 100644 --- a/llvm/include/llvm/Passes/StandardInstrumentations.h +++ b/llvm/include/llvm/Passes/StandardInstrumentations.h @@ -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 class BlockDataT { @@ -530,7 +504,6 @@ class StandardInstrumentations { PseudoProbeVerifier PseudoProbeVerification; InLineChangePrinter PrintChangedDiff; DotCfgChangeReporter WebsiteChangeReporter; - IRChangedTester ChangeTester; VerifyInstrumentation Verify; bool VerifyEach; diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp index b2283cc..23c825c 100644 --- a/llvm/lib/Passes/StandardInstrumentations.cpp +++ b/llvm/lib/Passes/StandardInstrumentations.cpp @@ -164,30 +164,22 @@ static cl::opt 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 - TestChanged("test-changed", 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 &FD, ArrayRef SR, - SmallVector &FileName) { - assert(FD.size() >= SR.size() && FileName.size() == FD.size() && - "Unexpected array sizes"); - for (unsigned I = 0; I < FD.size(); ++I) { +// 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 +// for any failures instead of the diff. +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. + 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 SV; std::error_code EC = @@ -196,44 +188,19 @@ std::string prepareTempFiles(SmallVector &FD, ArrayRef SR, 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 ""; -} + // The third file is used as the result of the diff. + if (I == NumFiles - 1) + break; -std::string cleanUpTempFiles(ArrayRef FileName) { - for (unsigned I = 0; I < FileName.size(); ++I) { - std::error_code EC = sys::fs::remove(FileName[I]); + std::error_code EC = sys::fs::openFileForWrite(FileName[I], FD[I]); if (EC) - return "Unable to remove temporary file."; - } - return ""; -} + return "Unable to open temporary file for writing."; -// 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 -// for any failures instead of the diff. -std::string doSystemDiff(StringRef Before, StringRef After, - StringRef OldLineFormat, StringRef NewLineFormat, - StringRef UnchangedLineFormat) { - // Store the 2 bodies into temporary files and call diff on them - // to get the body of the node. - static SmallVector FD{-1, -1, -1}; - SmallVector SR{Before, After}; - static SmallVector FileName{"", "", ""}; - std::string Err = prepareTempFiles(FD, SR, FileName); - if (Err != "") - return Err; + raw_fd_ostream OutStream(FD[I], /*shouldClose=*/true); + if (FD[I] == -1) + return "Error opening file for writing."; + OutStream << SR[I]; + } static ErrorOr 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::registerRequiredCallbacks(PIC); -} - -void IRChangedTester::handleIR(const std::string &S, StringRef PassID) { - // Store the body into a temporary file - static SmallVector FD{-1}; - SmallVector SR{S}; - static SmallVector FileName{""}; - std::string Err = prepareTempFiles(FD, SR, FileName); - if (Err != "") { - dbgs() << Err; - return; - } - static ErrorOr 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 void OrderedChangedData::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; diff --git a/llvm/test/Other/test-changed-script.sh b/llvm/test/Other/test-changed-script.sh deleted file mode 100755 index 19c02bb..0000000 --- a/llvm/test/Other/test-changed-script.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo "***" $2 "***" -cat $1 diff --git a/llvm/test/Other/test-changed.ll b/llvm/test/Other/test-changed.ll deleted file mode 100644 index e34f3de..0000000 --- a/llvm/test/Other/test-changed.ll +++ /dev/null @@ -1,103 +0,0 @@ -; Simple checks of -test-changed=%S/test-changed-script.sh functionality -; -; Simple functionality check. -; RUN: opt -S -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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 -test-changed=%S/test-changed-script.sh -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: *** Initial IR *** -; CHECK-SIMPLE-NEXT: ; ModuleID = {{.+}} -; CHECK-SIMPLE: *** InstSimplifyPass *** -; CHECK-SIMPLE-NEXT: define i32 @g() -; CHECK-SIMPLE: *** InstSimplifyPass *** -; CHECK-SIMPLE-NEXT: define i32 @f() - -; CHECK-FUNC-FILTER: *** Initial IR *** -; CHECK-FUNC-FILTER-NEXT: define i32 @f() -; CHECK-FUNC-FILTER: *** InstSimplifyPass *** -; CHECK-FUNC-FILTER-NEXT: define i32 @f() - -; CHECK-PRINT-MOD-SCOPE: *** Initial IR *** -; CHECK-PRINT-MOD-SCOPE-NEXT: ModuleID = {{.+}} -; CHECK-PRINT-MOD-SCOPE: *** InstSimplifyPass *** -; CHECK-PRINT-MOD-SCOPE-NEXT: ModuleID = {{.+}} -; CHECK-PRINT-MOD-SCOPE: *** InstSimplifyPass *** -; CHECK-PRINT-MOD-SCOPE-NEXT: ModuleID = {{.+}} - -; CHECK-FUNC-FILTER-MOD-SCOPE: *** Initial IR *** -; CHECK-FUNC-FILTER-MOD-SCOPE-NEXT: ; ModuleID = {{.+}} -; CHECK-FUNC-FILTER-MOD-SCOPE: *** InstSimplifyPass *** -; CHECK-FUNC-FILTER-MOD-SCOPE-NEXT: ModuleID = {{.+}} - -; CHECK-FILTER-MULT-FUNC: *** Initial IR *** -; CHECK-FILTER-MULT-FUNC-NEXT: define i32 @g() -; CHECK-FILTER-MULT-FUNC: *** InstSimplifyPass *** -; CHECK-FILTER-MULT-FUNC-NEXT: define i32 @g() -; CHECK-FILTER-MULT-FUNC: *** InstSimplifyPass *** -; CHECK-FILTER-MULT-FUNC-NEXT: define i32 @f() - -; CHECK-FILTER-PASSES: *** Initial IR *** -; CHECK-FILTER-PASSES-NEXT: define i32 @g() - -; CHECK-FILTER-MULT-PASSES: *** Initial IR *** -; CHECK-FILTER-MULT-PASSES-NEXT: define i32 @g() -; CHECK-FILTER-MULT-PASSES: *** InstSimplifyPass *** -; CHECK-FILTER-MULT-PASSES-NEXT: define i32 @g() -; CHECK-FILTER-MULT-PASSES: *** InstSimplifyPass *** -; CHECK-FILTER-MULT-PASSES-NEXT: define i32 @f() - -; CHECK-FILTER-FUNC-PASSES: *** Initial IR *** -; CHECK-FILTER-FUNC-PASSES-NEXT: define i32 @f() -; CHECK-FILTER-FUNC-PASSES: *** InstSimplifyPass *** -; CHECK-FILTER-FUNC-PASSES-NEXT: define i32 @f() - -; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE: *** Initial IR *** -; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE-NEXT: ; ModuleID = {{.+}} -; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE: *** InstSimplifyPass *** -; CHECK-FILTER-FUNC-PASSES-MOD-SCOPE-NEXT: ModuleID = {{.+}} - -; CHECK-MULT-PASSES-FILTER-FUNC: *** Initial IR *** -; CHECK-MULT-PASSES-FILTER-FUNC-NEXT: define i32 @f() -; CHECK-MULT-PASSES-FILTER-FUNC: *** InstSimplifyPass *** -; CHECK-MULT-PASSES-FILTER-FUNC-NEXT: define i32 @f() -- 2.7.4