mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 09:46:05 +00:00

Move `AttributeMask` out of `llvm/IR/Attributes.h` to a new file `llvm/IR/AttributeMask.h`. After doing this we can remove the `#include <bitset>` and `#include <set>` directives from `Attributes.h`. Since there are many headers including `Attributes.h`, but not needing the definition of `AttributeMask`, this causes unnecessary bloating of the translation units and slows down compilation. This commit adds in the include directive for `llvm/IR/AttributeMask.h` to the handful of source files that need to see the definition. This reduces the total number of preprocessing tokens across the LLVM source files in lib from (roughly) 1,917,509,187 to 1,902,982,273 - a reduction of ~0.76%. This should result in a small improvement in compilation time. Differential Revision: https://reviews.llvm.org/D153728
69 lines
2.6 KiB
C++
69 lines
2.6 KiB
C++
//===- ReduceInstructions.cpp - Specialized Delta Pass ---------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements a function which calls the Generic Delta pass in order
|
|
// to reduce uninteresting Instructions from defined functions.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ReduceInstructions.h"
|
|
#include "Utils.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include <set>
|
|
|
|
using namespace llvm;
|
|
|
|
/// Filter out cases where deleting the instruction will likely cause the
|
|
/// user/def of the instruction to fail the verifier.
|
|
//
|
|
// TODO: Technically the verifier only enforces preallocated token usage and
|
|
// there is a none token.
|
|
static bool shouldAlwaysKeep(const Instruction &I) {
|
|
return I.isEHPad() || I.getType()->isTokenTy() || I.isSwiftError();
|
|
}
|
|
|
|
/// Removes out-of-chunk arguments from functions, and modifies their calls
|
|
/// accordingly. It also removes allocations of out-of-chunk arguments.
|
|
static void extractInstrFromModule(Oracle &O, ReducerWorkItem &WorkItem) {
|
|
Module &Program = WorkItem.getModule();
|
|
std::vector<Instruction *> InitInstToKeep;
|
|
|
|
for (auto &F : Program)
|
|
for (auto &BB : F) {
|
|
// Removing the terminator would make the block invalid. Only iterate over
|
|
// instructions before the terminator.
|
|
InitInstToKeep.push_back(BB.getTerminator());
|
|
for (auto &Inst : make_range(BB.begin(), std::prev(BB.end()))) {
|
|
if (shouldAlwaysKeep(Inst) || O.shouldKeep())
|
|
InitInstToKeep.push_back(&Inst);
|
|
}
|
|
}
|
|
|
|
// We create a vector first, then convert it to a set, so that we don't have
|
|
// to pay the cost of rebalancing the set frequently if the order we insert
|
|
// the elements doesn't match the order they should appear inside the set.
|
|
std::set<Instruction *> InstToKeep(InitInstToKeep.begin(),
|
|
InitInstToKeep.end());
|
|
|
|
std::vector<Instruction *> InstToDelete;
|
|
for (auto &F : Program)
|
|
for (auto &BB : F)
|
|
for (auto &Inst : BB)
|
|
if (!InstToKeep.count(&Inst)) {
|
|
Inst.replaceAllUsesWith(getDefaultValue(Inst.getType()));
|
|
InstToDelete.push_back(&Inst);
|
|
}
|
|
|
|
for (auto &I : InstToDelete)
|
|
I->eraseFromParent();
|
|
}
|
|
|
|
void llvm::reduceInstructionsDeltaPass(TestRunner &Test) {
|
|
runDeltaPass(Test, extractInstrFromModule, "Reducing Instructions");
|
|
}
|