mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-17 21:35:07 +00:00
c7b0b7dc8f
Split sadd.with.overflow into add + sadd.with.overflow to allow analysis and optimization. This should ideally be done after InstCombine, which can perform code motion (eventually indvars should run after all canonical instcombines). We want ISEL to recombine the add and the check, at least on x86. This is currently under an option for reducing live induction variables: -liv-reduce. The next step is reducing liveness of IVs that are live out of the overflow check paths. Once the related optimizations are fully developed, reviewed and tested, I do expect this to become default. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197926 91177308-0d34-0410-b5e6-96231b3b80d8
70 lines
2.2 KiB
C++
70 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/Support/CommandLine.h"
|
|
#include "llvm/Support/ValueHandle.h"
|
|
|
|
namespace llvm {
|
|
|
|
class CastInst;
|
|
class DominatorTree;
|
|
class IVUsers;
|
|
class Loop;
|
|
class LPPassManager;
|
|
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(NULL), 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, LPPassManager *LPM,
|
|
SmallVectorImpl<WeakVH> &Dead, IVVisitor *V = NULL);
|
|
|
|
/// SimplifyLoopIVs - Simplify users of induction variables within this
|
|
/// loop. This does not actually change or add IVs.
|
|
bool simplifyLoopIVs(Loop *L, ScalarEvolution *SE, LPPassManager *LPM,
|
|
SmallVectorImpl<WeakVH> &Dead);
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|