--- /dev/null
+; llvm-reduce shouldn't remove arguments of debug intrinsics, because the resulting module will be ill-formed.
+;
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=arguments --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s --output %t
+; RUN: FileCheck --check-prefix=CHECK-FINAL %s < %t
+
+; CHECK-INTERESTINGNESS: declare void @llvm.dbg.addr
+; CHECK-FINAL: declare void @llvm.dbg.addr(metadata, metadata, metadata)
+declare void @llvm.dbg.addr(metadata, metadata, metadata)
+; CHECK-INTERESTINGNESS: declare void @llvm.dbg.declare
+; CHECK-FINAL: declare void @llvm.dbg.declare(metadata, metadata, metadata)
+declare void @llvm.dbg.declare(metadata, metadata, metadata)
+; CHECK-INTERESTINGNESS: declare void @llvm.dbg.value
+; CHECK-FINAL: declare void @llvm.dbg.value(metadata, metadata, metadata)
+declare void @llvm.dbg.value(metadata, metadata, metadata)
//===----------------------------------------------------------------------===//
//
// This file implements a function which calls the Generic Delta pass in order
-// to reduce uninteresting Arguments from defined functions.
+// to reduce uninteresting Arguments from declared and defined functions.
//
//===----------------------------------------------------------------------===//
#include "ReduceArguments.h"
#include "Delta.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/IR/Intrinsics.h"
#include <set>
#include <vector>
}
}
+/// Returns whether or not this function should be considered a candidate for
+/// argument removal. Currently, functions with no arguments and intrinsics are
+/// not considered. Intrinsics aren't considered because their signatures are
+/// fixed.
+static bool shouldRemoveArguments(const Function &F) {
+ return !F.arg_empty() && !F.isIntrinsic();
+}
+
/// Removes out-of-chunk arguments from functions, and modifies their calls
/// accordingly. It also removes allocations of out-of-chunk arguments.
static void extractArgumentsFromModule(std::vector<Chunk> ChunksToKeep,
std::vector<Function *> Funcs;
// Get inside-chunk arguments, as well as their parent function
for (auto &F : *Program)
- if (!F.arg_empty()) {
+ if (shouldRemoveArguments(F)) {
Funcs.push_back(&F);
for (auto &A : F.args())
if (O.shouldKeep())
}
}
-/// Counts the amount of arguments in non-declaration functions and prints their
-/// respective name, index, and parent function name
+/// Counts the amount of arguments in functions and prints their respective
+/// name, index, and parent function name
static int countArguments(Module *Program) {
// TODO: Silence index with --quiet flag
outs() << "----------------------------\n";
outs() << "Param Index Reference:\n";
int ArgsCount = 0;
for (auto &F : *Program)
- if (!F.arg_empty()) {
+ if (shouldRemoveArguments(F)) {
outs() << " " << F.getName() << "\n";
for (auto &A : F.args())
outs() << "\t" << ++ArgsCount << ": " << A.getName() << "\n";