forked from OSchip/llvm-project
[InstCombine] Move InstCombineWorklist to Utils to allow reuse (NFC).
InstCombine's worklist can be re-used by other passes like VectorCombine. Move it to llvm/Transform/Utils and rename it to InstructionWorklist. Reviewed By: lebedev.ri Differential Revision: https://reviews.llvm.org/D110181
This commit is contained in:
parent
abbb0f901a
commit
e08a5dc86f
|
@ -18,12 +18,14 @@
|
|||
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/PassManager.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class InstCombinePass : public PassInfoMixin<InstCombinePass> {
|
||||
InstCombineWorklist Worklist;
|
||||
InstructionWorklist Worklist;
|
||||
const unsigned MaxIterations;
|
||||
|
||||
public:
|
||||
|
@ -38,7 +40,7 @@ public:
|
|||
/// This is a basic whole-function wrapper around the instcombine utility. It
|
||||
/// will try to combine all instructions in the function.
|
||||
class InstructionCombiningPass : public FunctionPass {
|
||||
InstCombineWorklist Worklist;
|
||||
InstructionWorklist Worklist;
|
||||
const unsigned MaxIterations;
|
||||
|
||||
public:
|
||||
|
@ -67,4 +69,6 @@ FunctionPass *createInstructionCombiningPass();
|
|||
FunctionPass *createInstructionCombiningPass(unsigned MaxIterations);
|
||||
}
|
||||
|
||||
#undef DEBUG_TYPE
|
||||
|
||||
#endif
|
||||
|
|
|
@ -25,10 +25,10 @@
|
|||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include <cassert>
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
|
@ -57,7 +57,7 @@ public:
|
|||
|
||||
protected:
|
||||
/// A worklist of the instructions that need to be simplified.
|
||||
InstCombineWorklist &Worklist;
|
||||
InstructionWorklist &Worklist;
|
||||
|
||||
// Mode in which we are running the combiner.
|
||||
const bool MinimizeSize;
|
||||
|
@ -81,7 +81,7 @@ protected:
|
|||
bool MadeIRChange = false;
|
||||
|
||||
public:
|
||||
InstCombiner(InstCombineWorklist &Worklist, BuilderTy &Builder,
|
||||
InstCombiner(InstructionWorklist &Worklist, BuilderTy &Builder,
|
||||
bool MinimizeSize, AAResults *AA, AssumptionCache &AC,
|
||||
TargetLibraryInfo &TLI, TargetTransformInfo &TTI,
|
||||
DominatorTree &DT, OptimizationRemarkEmitter &ORE,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
//===- InstCombineWorklist.h - Worklist for InstCombine pass ----*- C++ -*-===//
|
||||
//=== InstructionWorklist.h - Worklist for InstCombine & others -*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
|
@ -6,8 +6,8 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINEWORKLIST_H
|
||||
#define LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINEWORKLIST_H
|
||||
#ifndef LLVM_TRANSFORMS_UTILS_INSTRUCTIONWORKLIST_H
|
||||
#define LLVM_TRANSFORMS_UTILS_INSTRUCTIONWORKLIST_H
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
|
@ -18,13 +18,11 @@
|
|||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// InstCombineWorklist - This is the worklist management logic for
|
||||
/// InstCombine.
|
||||
class InstCombineWorklist {
|
||||
/// InstructionWorklist - This is the worklist management logic for
|
||||
/// InstCombine and other simplification passes.
|
||||
class InstructionWorklist {
|
||||
SmallVector<Instruction *, 256> Worklist;
|
||||
DenseMap<Instruction *, unsigned> WorklistMap;
|
||||
/// These instructions will be added in reverse order after the current
|
||||
|
@ -33,10 +31,10 @@ class InstCombineWorklist {
|
|||
SmallSetVector<Instruction *, 16> Deferred;
|
||||
|
||||
public:
|
||||
InstCombineWorklist() = default;
|
||||
InstructionWorklist() = default;
|
||||
|
||||
InstCombineWorklist(InstCombineWorklist &&) = default;
|
||||
InstCombineWorklist &operator=(InstCombineWorklist &&) = default;
|
||||
InstructionWorklist(InstructionWorklist &&) = default;
|
||||
InstructionWorklist &operator=(InstructionWorklist &&) = default;
|
||||
|
||||
bool isEmpty() const { return Worklist.empty() && Deferred.empty(); }
|
||||
|
||||
|
@ -45,7 +43,7 @@ public:
|
|||
/// You likely want to use this method.
|
||||
void add(Instruction *I) {
|
||||
if (Deferred.insert(I))
|
||||
LLVM_DEBUG(dbgs() << "IC: ADD DEFERRED: " << *I << '\n');
|
||||
LLVM_DEBUG(dbgs() << "ADD DEFERRED: " << *I << '\n');
|
||||
}
|
||||
|
||||
/// Add value to the worklist if it is an instruction.
|
||||
|
@ -62,7 +60,7 @@ public:
|
|||
assert(I->getParent() && "Instruction not inserted yet?");
|
||||
|
||||
if (WorklistMap.insert(std::make_pair(I, Worklist.size())).second) {
|
||||
LLVM_DEBUG(dbgs() << "IC: ADD: " << *I << '\n');
|
||||
LLVM_DEBUG(dbgs() << "ADD: " << *I << '\n');
|
||||
Worklist.push_back(I);
|
||||
}
|
||||
}
|
||||
|
@ -85,7 +83,7 @@ public:
|
|||
|
||||
/// Remove I from the worklist if it exists.
|
||||
void remove(Instruction *I) {
|
||||
DenseMap<Instruction*, unsigned>::iterator It = WorklistMap.find(I);
|
||||
DenseMap<Instruction *, unsigned>::iterator It = WorklistMap.find(I);
|
||||
if (It != WorklistMap.end()) {
|
||||
// Don't bother moving everything down, just null out the slot.
|
||||
Worklist[It->second] = nullptr;
|
||||
|
@ -110,7 +108,6 @@ public:
|
|||
push(cast<Instruction>(U));
|
||||
}
|
||||
|
||||
|
||||
/// Check that the worklist is empty and nuke the backing store for the map.
|
||||
void zap() {
|
||||
assert(WorklistMap.empty() && "Worklist empty, but map not?");
|
||||
|
@ -123,6 +120,4 @@ public:
|
|||
|
||||
} // end namespace llvm.
|
||||
|
||||
#undef DEBUG_TYPE
|
||||
|
||||
#endif
|
|
@ -67,7 +67,6 @@
|
|||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombiner.h"
|
||||
#include "llvm/Transforms/Utils/AssumeBundleBuilder.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
|
@ -79,11 +78,12 @@
|
|||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace PatternMatch;
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
|
||||
STATISTIC(NumSimplified, "Number of library calls simplified");
|
||||
|
||||
static cl::opt<unsigned> GuardWideningWindow(
|
||||
|
|
|
@ -25,12 +25,12 @@
|
|||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombiner.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include <cassert>
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
using namespace llvm::PatternMatch;
|
||||
|
||||
|
@ -62,7 +62,7 @@ class LLVM_LIBRARY_VISIBILITY InstCombinerImpl final
|
|||
: public InstCombiner,
|
||||
public InstVisitor<InstCombinerImpl, Instruction *> {
|
||||
public:
|
||||
InstCombinerImpl(InstCombineWorklist &Worklist, BuilderTy &Builder,
|
||||
InstCombinerImpl(InstructionWorklist &Worklist, BuilderTy &Builder,
|
||||
bool MinimizeSize, AAResults *AA, AssumptionCache &AC,
|
||||
TargetLibraryInfo &TLI, TargetTransformInfo &TTI,
|
||||
DominatorTree &DT, OptimizationRemarkEmitter &ORE,
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombiner.h"
|
||||
#include "llvm/Transforms/Utils/BuildLibCalls.h"
|
||||
#include <cassert>
|
||||
|
@ -39,11 +38,12 @@
|
|||
#include <cstdint>
|
||||
#include <utility>
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace PatternMatch;
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
|
||||
/// The specific integer value is used in a context where it is known to be
|
||||
/// non-zero. If this allows us to simplify the computation, do so and return
|
||||
/// the new operand, otherwise return null.
|
||||
|
|
|
@ -38,15 +38,16 @@
|
|||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombiner.h"
|
||||
#include <cassert>
|
||||
#include <utility>
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace PatternMatch;
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
|
||||
static Value *createMinMax(InstCombiner::BuilderTy &Builder,
|
||||
SelectPatternFlavor SPF, Value *A, Value *B) {
|
||||
|
|
|
@ -35,18 +35,18 @@
|
|||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombiner.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <iterator>
|
||||
#include <utility>
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace PatternMatch;
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
|
||||
STATISTIC(NumAggregateReconstructionsSimplified,
|
||||
"Number of aggregate reconstructions turned into reuse of the "
|
||||
"original aggregate");
|
||||
|
|
|
@ -100,7 +100,6 @@
|
|||
#include "llvm/Support/KnownBits.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
|
@ -109,11 +108,12 @@
|
|||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
#include "llvm/Transforms/Utils/InstructionWorklist.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace llvm::PatternMatch;
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
|
||||
STATISTIC(NumWorklistIterations,
|
||||
"Number of instruction combining iterations performed");
|
||||
|
||||
|
@ -3975,13 +3975,13 @@ public:
|
|||
/// whose condition is a known constant, we only visit the reachable successors.
|
||||
static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI,
|
||||
InstCombineWorklist &ICWorklist) {
|
||||
InstructionWorklist &ICWorklist) {
|
||||
bool MadeIRChange = false;
|
||||
SmallPtrSet<BasicBlock *, 32> Visited;
|
||||
SmallVector<BasicBlock*, 256> Worklist;
|
||||
Worklist.push_back(&F.front());
|
||||
|
||||
SmallVector<Instruction*, 128> InstrsForInstCombineWorklist;
|
||||
SmallVector<Instruction *, 128> InstrsForInstructionWorklist;
|
||||
DenseMap<Constant *, Constant *> FoldedConstants;
|
||||
AliasScopeTracker SeenAliasScopes;
|
||||
|
||||
|
@ -4030,7 +4030,7 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,
|
|||
// these call instructions consumes non-trivial amount of time and
|
||||
// provides no value for the optimization.
|
||||
if (!Inst.isDebugOrPseudoInst()) {
|
||||
InstrsForInstCombineWorklist.push_back(&Inst);
|
||||
InstrsForInstructionWorklist.push_back(&Inst);
|
||||
SeenAliasScopes.analyse(&Inst);
|
||||
}
|
||||
}
|
||||
|
@ -4076,8 +4076,8 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,
|
|||
// of the function down. This jives well with the way that it adds all uses
|
||||
// of instructions to the worklist after doing a transformation, thus avoiding
|
||||
// some N^2 behavior in pathological cases.
|
||||
ICWorklist.reserve(InstrsForInstCombineWorklist.size());
|
||||
for (Instruction *Inst : reverse(InstrsForInstCombineWorklist)) {
|
||||
ICWorklist.reserve(InstrsForInstructionWorklist.size());
|
||||
for (Instruction *Inst : reverse(InstrsForInstructionWorklist)) {
|
||||
// DCE instruction if trivially dead. As we iterate in reverse program
|
||||
// order here, we will clean up whole chains of dead instructions.
|
||||
if (isInstructionTriviallyDead(Inst, TLI) ||
|
||||
|
@ -4097,7 +4097,7 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,
|
|||
}
|
||||
|
||||
static bool combineInstructionsOverFunction(
|
||||
Function &F, InstCombineWorklist &Worklist, AliasAnalysis *AA,
|
||||
Function &F, InstructionWorklist &Worklist, AliasAnalysis *AA,
|
||||
AssumptionCache &AC, TargetLibraryInfo &TLI, TargetTransformInfo &TTI,
|
||||
DominatorTree &DT, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI,
|
||||
ProfileSummaryInfo *PSI, unsigned MaxIterations, LoopInfo *LI) {
|
||||
|
|
Loading…
Reference in New Issue