forked from OSchip/llvm-project
[llvm-reduce] Add reduction for special globals like llvm.used.
This patch adds a reduction of 'special' globals that lead to further reductions (e.g. alias or regular globals reduction) being less efficient because there are special constraints on values referenced in those special globals. For example, values in @llvm.used and @llvm.compiler.used need to be named, so replacing all uses of an alias/global with undef or a different unnamed constant results in invalid IR. More details: https://llvm.org/docs/LangRef.html#intrinsic-global-variables Reviewed By: lebedev.ri Differential Revision: https://reviews.llvm.org/D90302
This commit is contained in:
parent
ffbbfc76ca
commit
250de7388b
|
@ -5,15 +5,9 @@
|
|||
|
||||
; CHECK-INTERESTINGNESS: define void @fn3
|
||||
|
||||
; CHECK-FINAL: @g1 = global
|
||||
; CHECK-FINAL: @g2 = global
|
||||
; CHECK-FINAL-NOT: global
|
||||
|
||||
; CHECK-FINAL-NOT: $a1
|
||||
; CHECK-FINAL-NOT: $a2
|
||||
; CHECK-FINAL-NOT: $a3
|
||||
; CHECK-FINAL-NOT: $a4
|
||||
; CHECK-FINAL: $a5
|
||||
; CHECK-FINAL: $a6
|
||||
; CHECK-FINAL-NOT: = alias
|
||||
|
||||
; CHECK-FINAL-NOT: @llvm.used
|
||||
; CHECK-FINAL-NOT: @llvm.compiler.used
|
||||
|
|
|
@ -23,6 +23,7 @@ add_llvm_tool(llvm-reduce
|
|||
deltas/ReduceInstructions.cpp
|
||||
deltas/ReduceMetadata.cpp
|
||||
deltas/ReduceOperandBundles.cpp
|
||||
deltas/ReduceSpecialGlobals.cpp
|
||||
llvm-reduce.cpp
|
||||
|
||||
DEPENDS
|
||||
|
|
|
@ -23,11 +23,13 @@
|
|||
#include "deltas/ReduceInstructions.h"
|
||||
#include "deltas/ReduceMetadata.h"
|
||||
#include "deltas/ReduceOperandBundles.h"
|
||||
#include "deltas/ReduceSpecialGlobals.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
// TODO: Add CLI option to run only specified Passes (for unit tests)
|
||||
inline void runDeltaPasses(TestRunner &Tester) {
|
||||
reduceSpecialGlobalsDeltaPass(Tester);
|
||||
reduceAliasesDeltaPass(Tester);
|
||||
reduceFunctionBodiesDeltaPass(Tester);
|
||||
reduceFunctionsDeltaPass(Tester);
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
//===- ReduceSpecialGlobals.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 special globals, like @llvm.used, in the provided Module.
|
||||
//
|
||||
// For more details about special globals, see
|
||||
// https://llvm.org/docs/LangRef.html#intrinsic-global-variables
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "ReduceSpecialGlobals.h"
|
||||
#include "Delta.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/GlobalValue.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
static StringRef SpecialGlobalNames[] = {"llvm.used", "llvm.compiler.used"};
|
||||
|
||||
/// Removes all special globals aren't inside any of the
|
||||
/// desired Chunks.
|
||||
static void
|
||||
extractSpecialGlobalsFromModule(const std::vector<Chunk> &ChunksToKeep,
|
||||
Module *Program) {
|
||||
Oracle O(ChunksToKeep);
|
||||
|
||||
for (StringRef Name : SpecialGlobalNames) {
|
||||
if (auto *Used = Program->getNamedGlobal(Name)) {
|
||||
Used->replaceAllUsesWith(UndefValue::get(Used->getType()));
|
||||
Used->eraseFromParent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Counts the amount of special globals and prints their
|
||||
/// respective name & index
|
||||
static int countSpecialGlobals(Module *Program) {
|
||||
// TODO: Silence index with --quiet flag
|
||||
errs() << "----------------------------\n";
|
||||
errs() << "Special Globals Index Reference:\n";
|
||||
int Count = 0;
|
||||
for (StringRef Name : SpecialGlobalNames) {
|
||||
if (auto *Used = Program->getNamedGlobal(Name))
|
||||
errs() << "\t" << ++Count << ": " << Used->getName() << "\n";
|
||||
}
|
||||
errs() << "----------------------------\n";
|
||||
return Count;
|
||||
}
|
||||
|
||||
void llvm::reduceSpecialGlobalsDeltaPass(TestRunner &Test) {
|
||||
errs() << "*** Reducing Special Globals ...\n";
|
||||
int Functions = countSpecialGlobals(Test.getProgram());
|
||||
runDeltaPass(Test, Functions, extractSpecialGlobalsFromModule);
|
||||
errs() << "----------------------------\n";
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
//===- ReduceSpecialGlobals.h - 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 special globals, like @llvm.used, in the provided Module.
|
||||
//
|
||||
// For more details about special globals, see
|
||||
// https://llvm.org/docs/LangRef.html#intrinsic-global-variables
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "Delta.h"
|
||||
|
||||
namespace llvm {
|
||||
void reduceSpecialGlobalsDeltaPass(TestRunner &Test);
|
||||
} // namespace llvm
|
Loading…
Reference in New Issue