mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
621a2ef540
A large number of loop utility functions take a `Pass *` and reach into it to find out which analyses to preserve. There are a number of problems with this: - The APIs have access to pretty well any Pass state they want, so it's hard to tell what they may or may not do. - Other APIs have copied these and pass around a `Pass *` even though they don't even use it. Some of these just hand a nullptr to the API since the callers don't even have a pass available. - Passes in the new pass manager don't work like the current ones, so the APIs can't be used as is there. Instead, we should explicitly thread the analysis results that we actually care about through these APIs. This is both simpler and more reusable. llvm-svn: 255669
72 lines
2.2 KiB
C++
72 lines
2.2 KiB
C++
//===-- llvm/Transforms/Utils/SimplifyIndVar.h - Indvar Utils ---*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines in interface for induction variable simplification. It does
|
|
// not define any actual pass or policy, but provides a single function to
|
|
// simplify a loop's induction variables based on ScalarEvolution.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYINDVAR_H
|
|
#define LLVM_TRANSFORMS_UTILS_SIMPLIFYINDVAR_H
|
|
|
|
#include "llvm/IR/ValueHandle.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
|
|
namespace llvm {
|
|
|
|
class CastInst;
|
|
class DominatorTree;
|
|
class IVUsers;
|
|
class Loop;
|
|
class LoopInfo;
|
|
class PHINode;
|
|
class ScalarEvolution;
|
|
|
|
/// Interface for visiting interesting IV users that are recognized but not
|
|
/// simplified by this utility.
|
|
class IVVisitor {
|
|
protected:
|
|
const DominatorTree *DT;
|
|
bool ShouldSplitOverflowIntrinsics;
|
|
|
|
virtual void anchor();
|
|
|
|
public:
|
|
IVVisitor(): DT(nullptr), ShouldSplitOverflowIntrinsics(false) {}
|
|
virtual ~IVVisitor() {}
|
|
|
|
const DominatorTree *getDomTree() const { return DT; }
|
|
|
|
bool shouldSplitOverflowInstrinsics() const {
|
|
return ShouldSplitOverflowIntrinsics;
|
|
}
|
|
void setSplitOverflowIntrinsics() {
|
|
ShouldSplitOverflowIntrinsics = true;
|
|
assert(DT && "Splitting overflow intrinsics requires a DomTree.");
|
|
}
|
|
|
|
virtual void visitCast(CastInst *Cast) = 0;
|
|
};
|
|
|
|
/// simplifyUsersOfIV - Simplify instructions that use this induction variable
|
|
/// by using ScalarEvolution to analyze the IV's recurrence.
|
|
bool simplifyUsersOfIV(PHINode *CurrIV, ScalarEvolution *SE, DominatorTree *DT,
|
|
LoopInfo *LI, SmallVectorImpl<WeakVH> &Dead,
|
|
IVVisitor *V = nullptr);
|
|
|
|
/// SimplifyLoopIVs - Simplify users of induction variables within this
|
|
/// loop. This does not actually change or add IVs.
|
|
bool simplifyLoopIVs(Loop *L, ScalarEvolution *SE, DominatorTree *DT,
|
|
LoopInfo *LI, SmallVectorImpl<WeakVH> &Dead);
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|