Having a separate counting method runs the risk of a mismatch between the actual reduction method and the counting method. Instead, create an Oracle that always returns true for shouldKeep(), run the reduction, and count how many times shouldKeep() was called. The module should not be modified if shouldKeep() always returns true. Reviewed By: Meinersbur Differential Revision: https://reviews.llvm.org/D113537
64 lines
2.2 KiB
C++
64 lines
2.2 KiB
C++
//===- ReduceGlobalValues.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 to reduce
|
|
// global value attributes/specifiers.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ReduceGlobalValues.h"
|
|
#include "llvm/IR/GlobalValue.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static bool shouldReduceDSOLocal(GlobalValue &GV) {
|
|
return GV.isDSOLocal() && !GV.isImplicitDSOLocal();
|
|
}
|
|
|
|
static bool shouldReduceVisibility(GlobalValue &GV) {
|
|
return GV.getVisibility() != GlobalValue::VisibilityTypes::DefaultVisibility;
|
|
}
|
|
|
|
static bool shouldReduceUnnamedAddress(GlobalValue &GV) {
|
|
return GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None;
|
|
}
|
|
|
|
static bool shouldReduceDLLStorageClass(GlobalValue &GV) {
|
|
return GV.getDLLStorageClass() !=
|
|
GlobalValue::DLLStorageClassTypes::DefaultStorageClass;
|
|
}
|
|
|
|
static bool shouldReduceThreadLocal(GlobalValue &GV) {
|
|
return GV.isThreadLocal();
|
|
}
|
|
|
|
static void reduceGVs(Oracle &O, Module &Program) {
|
|
for (auto &GV : Program.global_values()) {
|
|
if (shouldReduceDSOLocal(GV) && !O.shouldKeep())
|
|
GV.setDSOLocal(false);
|
|
if (shouldReduceVisibility(GV) && !O.shouldKeep()) {
|
|
bool IsImplicitDSOLocal = GV.isImplicitDSOLocal();
|
|
GV.setVisibility(GlobalValue::VisibilityTypes::DefaultVisibility);
|
|
if (IsImplicitDSOLocal)
|
|
GV.setDSOLocal(false);
|
|
}
|
|
if (shouldReduceUnnamedAddress(GV) && !O.shouldKeep())
|
|
GV.setUnnamedAddr(GlobalValue::UnnamedAddr::None);
|
|
if (shouldReduceDLLStorageClass(GV) && !O.shouldKeep())
|
|
GV.setDLLStorageClass(
|
|
GlobalValue::DLLStorageClassTypes::DefaultStorageClass);
|
|
if (shouldReduceThreadLocal(GV) && !O.shouldKeep())
|
|
GV.setThreadLocal(false);
|
|
}
|
|
}
|
|
|
|
void llvm::reduceGlobalValuesDeltaPass(TestRunner &Test) {
|
|
outs() << "*** Reducing GlobalValues...\n";
|
|
runDeltaPass(Test, reduceGVs);
|
|
}
|