From 7ccb8cc9eabfa3a39030312ba558cf7bc0856d4e Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 28 Mar 2025 23:38:42 +0700 Subject: [PATCH] llvm-reduce: Add pass to reduce uselistorders --- llvm/tools/llvm-reduce/CMakeLists.txt | 1 + llvm/tools/llvm-reduce/DeltaManager.cpp | 1 + llvm/tools/llvm-reduce/DeltaPasses.def | 1 + .../llvm-reduce/deltas/ReduceUseListOrder.cpp | 53 +++++++++++++++++++ .../llvm-reduce/deltas/ReduceUseListOrder.h | 23 ++++++++ 5 files changed, 79 insertions(+) create mode 100644 llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.cpp create mode 100644 llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.h diff --git a/llvm/tools/llvm-reduce/CMakeLists.txt b/llvm/tools/llvm-reduce/CMakeLists.txt index d1423e4c0895..1252f405acef 100644 --- a/llvm/tools/llvm-reduce/CMakeLists.txt +++ b/llvm/tools/llvm-reduce/CMakeLists.txt @@ -54,6 +54,7 @@ add_llvm_tool(llvm-reduce deltas/ReduceInstructionsMIR.cpp deltas/ReduceInstructionFlagsMIR.cpp deltas/ReduceIRReferences.cpp + deltas/ReduceUseListOrder.cpp deltas/ReduceVirtualRegisters.cpp deltas/ReduceRegisterMasks.cpp deltas/ReduceRegisterDefs.cpp diff --git a/llvm/tools/llvm-reduce/DeltaManager.cpp b/llvm/tools/llvm-reduce/DeltaManager.cpp index 74c1f1bfa5ea..8c4807e07830 100644 --- a/llvm/tools/llvm-reduce/DeltaManager.cpp +++ b/llvm/tools/llvm-reduce/DeltaManager.cpp @@ -46,6 +46,7 @@ #include "deltas/ReduceRegisterUses.h" #include "deltas/ReduceSpecialGlobals.h" #include "deltas/ReduceTargetFeaturesAttr.h" +#include "deltas/ReduceUseListOrder.h" #include "deltas/ReduceUsingSimplifyCFG.h" #include "deltas/ReduceVirtualRegisters.h" #include "deltas/RunIRPasses.h" diff --git a/llvm/tools/llvm-reduce/DeltaPasses.def b/llvm/tools/llvm-reduce/DeltaPasses.def index 84d01ab6646b..6993a384fc8e 100644 --- a/llvm/tools/llvm-reduce/DeltaPasses.def +++ b/llvm/tools/llvm-reduce/DeltaPasses.def @@ -53,6 +53,7 @@ DELTA_PASS_IR("volatile", reduceVolatileInstructionsDeltaPass, "Reducing Volatil DELTA_PASS_IR("atomic-ordering", reduceAtomicOrderingDeltaPass, "Reducing Atomic Ordering") DELTA_PASS_IR("syncscopes", reduceAtomicSyncScopesDeltaPass, "Reducing Atomic Sync Scopes") DELTA_PASS_IR("instruction-flags", reduceInstructionFlagsDeltaPass, "Reducing Instruction Flags") +DELTA_PASS_IR("uselistorder", reduceUseListOrderDeltaPass, "Reducing uselistorder") #ifndef DELTA_PASS_MIR diff --git a/llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.cpp b/llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.cpp new file mode 100644 index 000000000000..97d88d5c7986 --- /dev/null +++ b/llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.cpp @@ -0,0 +1,53 @@ +//===- ReduceUseListOrder.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 "ReduceUseListOrder.h" + +using namespace llvm; + +static void reduceUseListOrder(Oracle &O, Value &V) { + if (!V.hasNUsesOrMore(2)) + return; + + // TODO: Extract predictUseListOrder out of AsmWriter + + // TODO: Skip if use list already sorted + if (O.shouldKeep()) + return; + ArrayRef Indexes; + unsigned NumUses = 0; + SmallDenseMap Order; + for (const Use &U : V.uses()) + Order[&U] = Indexes[NumUses - 1]; + + V.sortUseList([&](const Use &L, const Use &R) { + return Order.lookup(&L) < Order.lookup(&R); + }); +} + +void llvm::reduceUseListOrderDeltaPass(Oracle &O, ReducerWorkItem &Program) { + Module &M = Program.getModule(); + + for (Function &F : M) { + reduceUseListOrder(O, F); + + for (BasicBlock &BB : F) { + reduceUseListOrder(O, BB); + for (Instruction &I : BB) + reduceUseListOrder(O, I); + } + } + + for (GlobalValue &GV : M.global_values()) + reduceUseListOrder(O, GV); +} diff --git a/llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.h b/llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.h new file mode 100644 index 000000000000..5638fe0a8380 --- /dev/null +++ b/llvm/tools/llvm-reduce/deltas/ReduceUseListOrder.h @@ -0,0 +1,23 @@ +//===- ReduceUseListOrder.h - Specialized Delta Pass ------------*- C++ -*-===// +// +// 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 sort +// uselistorder +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TOOLS_LLVM_REDUCE_DELTAS_REDUCEUSELISTORDER_H +#define LLVM_TOOLS_LLVM_REDUCE_DELTAS_REDUCEUSELISTORDER_H + +#include "Delta.h" + +namespace llvm { +void reduceUseListOrderDeltaPass(Oracle &O, ReducerWorkItem &Program); +} // namespace llvm + +#endif -- 2.49.0