diff --git a/llvm/test/tools/llvm-reduce/remove-global-align.ll b/llvm/test/tools/llvm-reduce/remove-global-align.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/remove-global-align.ll @@ -0,0 +1,17 @@ +; RUN: llvm-reduce --delta-passes=global-objects --abort-on-invalid-reduction --test FileCheck --test-arg --check-prefixes=INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefix=FINAL %s --input-file=%t + +; INTERESTINGNESS: @b = global i32 +; FINAL: @b = global i32 0{{$}} + +@b = global i32 0, align 4 + +; INTERESTINGNESS: define {{.*}} @f +; FINAL: define void @f() { +define void @f() align 4 { + ret void +} + +; INTERESTINGNESS: declare {{.*}} @h +; FINAL: declare void @h(){{$}} +declare void @h() align 4 diff --git a/llvm/test/tools/llvm-reduce/remove-section.ll b/llvm/test/tools/llvm-reduce/remove-section.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/remove-section.ll @@ -0,0 +1,17 @@ +; RUN: llvm-reduce --delta-passes=global-objects --abort-on-invalid-reduction --test FileCheck --test-arg --check-prefixes=INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefix=FINAL %s --input-file=%t + +; INTERESTINGNESS: @a = global i32 +; FINAL: @a = global i32 0{{$}} + +@a = global i32 0, section "hi" + +; INTERESTINGNESS: define {{.*}} @f +; FINAL: define void @f() { +define void @f() section "hello" { + ret void +} + +; INTERESTINGNESS: declare {{.*}} @g +; FINAL: declare void @g(){{$}} +declare void @g() section "hello" diff --git a/llvm/tools/llvm-reduce/CMakeLists.txt b/llvm/tools/llvm-reduce/CMakeLists.txt --- a/llvm/tools/llvm-reduce/CMakeLists.txt +++ b/llvm/tools/llvm-reduce/CMakeLists.txt @@ -24,6 +24,7 @@ deltas/ReduceBasicBlocks.cpp deltas/ReduceFunctionBodies.cpp deltas/ReduceFunctions.cpp + deltas/ReduceGlobalObjects.cpp deltas/ReduceGlobalValues.cpp deltas/ReduceGlobalVarInitializers.cpp deltas/ReduceGlobalVars.cpp diff --git a/llvm/tools/llvm-reduce/DeltaManager.cpp b/llvm/tools/llvm-reduce/DeltaManager.cpp --- a/llvm/tools/llvm-reduce/DeltaManager.cpp +++ b/llvm/tools/llvm-reduce/DeltaManager.cpp @@ -20,6 +20,7 @@ #include "deltas/ReduceBasicBlocks.h" #include "deltas/ReduceFunctionBodies.h" #include "deltas/ReduceFunctions.h" +#include "deltas/ReduceGlobalObjects.h" #include "deltas/ReduceGlobalValues.h" #include "deltas/ReduceGlobalVarInitializers.h" #include "deltas/ReduceGlobalVars.h" @@ -47,6 +48,7 @@ DELTA_PASS("functions", reduceFunctionsDeltaPass) \ DELTA_PASS("basic-blocks", reduceBasicBlocksDeltaPass) \ DELTA_PASS("global-values", reduceGlobalValuesDeltaPass) \ + DELTA_PASS("global-objects", reduceGlobalObjectsDeltaPass) \ DELTA_PASS("global-initializers", reduceGlobalsInitializersDeltaPass) \ DELTA_PASS("global-variables", reduceGlobalsDeltaPass) \ DELTA_PASS("metadata", reduceMetadataDeltaPass) \ diff --git a/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.h b/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.h new file mode 100644 --- /dev/null +++ b/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.h @@ -0,0 +1,18 @@ +//===- ReduceGlobalObjects.h ----------------------------------------------===// +// +// 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_DELTAS_REDUCEGLOBALOBJECTS_H +#define LLVM_TOOLS_LLVM_REDUCE_DELTAS_REDUCEGLOBALOBJECTS_H + +#include "Delta.h" + +namespace llvm { +void reduceGlobalObjectsDeltaPass(TestRunner &Test); +} // namespace llvm + +#endif diff --git a/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp b/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp new file mode 100644 --- /dev/null +++ b/llvm/tools/llvm-reduce/deltas/ReduceGlobalObjects.cpp @@ -0,0 +1,43 @@ +//===- ReduceGlobalObjects.cpp --------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "ReduceGlobalObjects.h" +#include "llvm/IR/GlobalObject.h" + +using namespace llvm; + +static bool shouldReduceSection(GlobalObject &GO) { return GO.hasSection(); } + +static bool shouldReduceAlign(GlobalObject &GO) { + return GO.getAlign().hasValue(); +} + +static void reduceGOs(Oracle &O, Module &Program) { + for (auto &GO : Program.global_objects()) { + if (shouldReduceSection(GO) && !O.shouldKeep()) + GO.setSection(""); + if (shouldReduceAlign(GO) && !O.shouldKeep()) + GO.setAlignment(MaybeAlign()); + } +} + +static int countGOs(Module &Program) { + int SectionCount = count_if(Program.global_objects(), [](GlobalObject &GO) { + return shouldReduceSection(GO); + }); + int AlignCount = count_if(Program.global_objects(), [](GlobalObject &GO) { + return shouldReduceAlign(GO); + }); + return SectionCount + AlignCount; +} + +void llvm::reduceGlobalObjectsDeltaPass(TestRunner &Test) { + outs() << "*** Reducing GlobalObjects...\n"; + int GVCount = countGOs(Test.getProgram()); + runDeltaPass(Test, GVCount, reduceGOs); +} diff --git a/llvm/utils/gn/secondary/llvm/tools/llvm-reduce/BUILD.gn b/llvm/utils/gn/secondary/llvm/tools/llvm-reduce/BUILD.gn --- a/llvm/utils/gn/secondary/llvm/tools/llvm-reduce/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/tools/llvm-reduce/BUILD.gn @@ -20,6 +20,7 @@ "deltas/ReduceBasicBlocks.cpp", "deltas/ReduceFunctionBodies.cpp", "deltas/ReduceFunctions.cpp", + "deltas/ReduceGlobalObjects.cpp", "deltas/ReduceGlobalValues.cpp", "deltas/ReduceGlobalVarInitializers.cpp", "deltas/ReduceGlobalVars.cpp",