mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
On some targets, the penalty of executing runtime unrolling checks and then not the unrolled loop can be significantly detrimental to performance. This results in the need to be more conservative with the unroll count, keeping a trip count of 2 reduces the overhead as well as increasing the chance of the unrolled body being executed. But being conservative leaves performance gains on the table. This patch enables the unrolling of the remainder loop introduced by runtime unrolling. This can help reduce the overhead of misunrolled loops because the cost of non-taken branches is much less than the cost of the backedge that would normally be executed in the remainder loop. This allows larger unroll factors to be used without suffering performance loses with smaller iteration counts. Differential Revision: https://reviews.llvm.org/D36309 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310824 91177308-0d34-0410-b5e6-96231b3b80d8
70 lines
2.6 KiB
C++
70 lines
2.6 KiB
C++
//===- llvm/Transforms/Utils/UnrollLoop.h - Unrolling utilities -*- 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 some loop unrolling utilities. It does not define any
|
|
// actual pass or policy, but provides a single function to perform loop
|
|
// unrolling.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_UTILS_UNROLLLOOP_H
|
|
#define LLVM_TRANSFORMS_UTILS_UNROLLLOOP_H
|
|
|
|
// Needed because we can't forward-declare the nested struct
|
|
// TargetTransformInfo::UnrollingPreferences
|
|
#include "llvm/Analysis/TargetTransformInfo.h"
|
|
|
|
namespace llvm {
|
|
|
|
class StringRef;
|
|
class AssumptionCache;
|
|
class DominatorTree;
|
|
class Loop;
|
|
class LoopInfo;
|
|
class LPPassManager;
|
|
class MDNode;
|
|
class Pass;
|
|
class OptimizationRemarkEmitter;
|
|
class ScalarEvolution;
|
|
|
|
typedef SmallDenseMap<const Loop *, Loop *, 4> NewLoopsMap;
|
|
|
|
const Loop* addClonedBlockToLoopInfo(BasicBlock *OriginalBB,
|
|
BasicBlock *ClonedBB, LoopInfo *LI,
|
|
NewLoopsMap &NewLoops);
|
|
|
|
bool UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool Force,
|
|
bool AllowRuntime, bool AllowExpensiveTripCount,
|
|
bool PreserveCondBr, bool PreserveOnlyFirst,
|
|
unsigned TripMultiple, unsigned PeelCount, bool UnrollRemainder,
|
|
LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT,
|
|
AssumptionCache *AC, OptimizationRemarkEmitter *ORE,
|
|
bool PreserveLCSSA);
|
|
|
|
bool UnrollRuntimeLoopRemainder(Loop *L, unsigned Count,
|
|
bool AllowExpensiveTripCount,
|
|
bool UseEpilogRemainder, bool UnrollRemainder,
|
|
LoopInfo *LI,
|
|
ScalarEvolution *SE, DominatorTree *DT,
|
|
AssumptionCache *AC,
|
|
OptimizationRemarkEmitter *ORE,
|
|
bool PreserveLCSSA);
|
|
|
|
void computePeelCount(Loop *L, unsigned LoopSize,
|
|
TargetTransformInfo::UnrollingPreferences &UP,
|
|
unsigned &TripCount);
|
|
|
|
bool peelLoop(Loop *L, unsigned PeelCount, LoopInfo *LI, ScalarEvolution *SE,
|
|
DominatorTree *DT, AssumptionCache *AC, bool PreserveLCSSA);
|
|
|
|
MDNode *GetUnrollMetadata(MDNode *LoopID, StringRef Name);
|
|
}
|
|
|
|
#endif
|