Many MIR reductions benefit from or require increasing the instruction count. For example, unlike in the IR, you may need to insert a new instruction to represent an undef. The current instruction reduction pass works around this by sticking implicit defs on whatever instruction happens to be first in the entry block block. Other strategies I've applied manually include breaking instructions with multiple defs into separate instructions, or breaking large register defs into multiple subregister defs. Make up a simple scoring system based on what I generally try to get rid of first when manually reducing. Counts implicit defs as free since reduction passes will be introducing them, although they probably should count for something. It also might make more sense to have a comparison the two functions, rather than having to compute a contextless number. This isn't particularly well tested since overall the MIR support isn't in a place where it is useful on the kinds of testcases I want to throw at it.
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
//===- ReducerWorkItem.h - Wrapper for Module and MachineFunction ---------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TOOLS_LLVM_REDUCE_REDUCERWORKITEM_H
|
|
#define LLVM_TOOLS_LLVM_REDUCE_REDUCERWORKITEM_H
|
|
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
using namespace llvm;
|
|
|
|
class ReducerWorkItem {
|
|
public:
|
|
std::shared_ptr<Module> M;
|
|
std::unique_ptr<MachineModuleInfo> MMI;
|
|
|
|
bool isMIR() const { return MMI != nullptr; }
|
|
|
|
const Module &getModule() const { return *M; }
|
|
|
|
void print(raw_ostream &ROS, void *p = nullptr) const;
|
|
operator Module &() const { return *M; }
|
|
|
|
/// Return a number to indicate whether there was any reduction progress.
|
|
uint64_t getComplexityScore() const {
|
|
return isMIR() ? computeMIRComplexityScore() : getIRSize();
|
|
}
|
|
|
|
private:
|
|
uint64_t computeMIRComplexityScore() const;
|
|
uint64_t getIRSize() const;
|
|
};
|
|
|
|
std::unique_ptr<ReducerWorkItem>
|
|
parseReducerWorkItem(const char *ToolName, StringRef Filename,
|
|
LLVMContext &Ctxt, std::unique_ptr<TargetMachine> &TM,
|
|
bool IsMIR);
|
|
|
|
std::unique_ptr<ReducerWorkItem>
|
|
cloneReducerWorkItem(const ReducerWorkItem &MMM, const TargetMachine *TM);
|
|
|
|
bool verifyReducerWorkItem(const ReducerWorkItem &MMM, raw_fd_ostream *OS);
|
|
|
|
#endif
|