diff --git a/llvm/test/tools/llvm-reduce/custom-delta-passes.ll b/llvm/test/tools/llvm-reduce/custom-delta-passes.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/custom-delta-passes.ll @@ -0,0 +1,20 @@ +; RUN: llvm-reduce --delta-passes=module-inline-asm --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefix=CHECK-NOCHANGE %s < %t +; RUN: llvm-reduce --delta-passes=function-bodies --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefix=CHECK-CHANGE %s < %t +; RUN: llvm-reduce --delta-passes=function-bodies,module-inline-asm --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefix=CHECK-CHANGE %s < %t + +; RUN: not llvm-reduce --delta-passes=foo --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t 2>&1 | FileCheck %s --check-prefix=ERROR +; RUN: not llvm-reduce --delta-passes='function-bodies;module-inline-asm' --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t 2>&1 | FileCheck %s --check-prefix=ERROR + +; CHECK-INTERESTINGNESS: @f + +; CHECK-NOCHANGE: define {{.*}} @f +; CHECK-CHANGE: declare {{.*}} @f + +; ERROR: unknown + +define void @f() { + ret void +} diff --git a/llvm/tools/llvm-reduce/DeltaManager.cpp b/llvm/tools/llvm-reduce/DeltaManager.cpp --- a/llvm/tools/llvm-reduce/DeltaManager.cpp +++ b/llvm/tools/llvm-reduce/DeltaManager.cpp @@ -28,11 +28,15 @@ #include "deltas/ReduceModuleInlineAsm.h" #include "deltas/ReduceOperandBundles.h" #include "deltas/ReduceSpecialGlobals.h" +#include "llvm/Support/CommandLine.h" -namespace llvm { +using namespace llvm; -// TODO: Add CLI option to run only specified Passes (for unit tests) -void runDeltaPasses(TestRunner &Tester) { +static cl::opt + DeltaPasses("delta-passes", + cl::desc("Delta passes to run, separated by commas")); + +static void runAllDeltaPasses(TestRunner &Tester) { reduceSpecialGlobalsDeltaPass(Tester); reduceAliasesDeltaPass(Tester); reduceFunctionBodiesDeltaPass(Tester); @@ -49,4 +53,51 @@ reduceModuleInlineAsmDeltaPass(Tester); // TODO: Implement the remaining Delta Passes } -} // namespace llvm + +static void runDeltaPassName(TestRunner &Tester, StringRef PassName) { + if (PassName == "special-globals") { + reduceSpecialGlobalsDeltaPass(Tester); + } else if (PassName == "aliases") { + reduceAliasesDeltaPass(Tester); + } else if (PassName == "function-bodies") { + reduceFunctionBodiesDeltaPass(Tester); + } else if (PassName == "functions") { + reduceFunctionsDeltaPass(Tester); + } else if (PassName == "basic-blocks") { + reduceBasicBlocksDeltaPass(Tester); + } else if (PassName == "global-values") { + reduceGlobalValuesDeltaPass(Tester); + } else if (PassName == "global-initializers") { + reduceGlobalsInitializersDeltaPass(Tester); + } else if (PassName == "global-variables") { + reduceGlobalsDeltaPass(Tester); + } else if (PassName == "metadata") { + reduceMetadataDeltaPass(Tester); + } else if (PassName == "arguments") { + reduceArgumentsDeltaPass(Tester); + } else if (PassName == "instructions") { + reduceInstructionsDeltaPass(Tester); + } else if (PassName == "operand-bundles") { + reduceOperandBundesDeltaPass(Tester); + } else if (PassName == "attributes") { + reduceAttributesDeltaPass(Tester); + } else if (PassName == "module-inline-asm") { + reduceModuleInlineAsmDeltaPass(Tester); + } else { + errs() << "unknown pass \"" << PassName << "\""; + exit(1); + } +} + +void llvm::runDeltaPasses(TestRunner &Tester) { + if (DeltaPasses.empty()) { + runAllDeltaPasses(Tester); + } else { + StringRef Passes = DeltaPasses; + while (!Passes.empty()) { + auto Split = Passes.split(","); + runDeltaPassName(Tester, Split.first); + Passes = Split.second; + } + } +}