1//===- LoopIdiomRecognize.h - Loop Idiom Recognize Pass ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This pass implements an idiom recognizer that transforms simple loops into a
10// non-loop form. In cases that this kicks in, it can be a significant
11// performance win.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_TRANSFORMS_SCALAR_LOOPIDIOMRECOGNIZE_H
16#define LLVM_TRANSFORMS_SCALAR_LOOPIDIOMRECOGNIZE_H
17
18#include "llvm/Analysis/LoopAnalysisManager.h"
19#include "llvm/IR/PassManager.h"
20
21namespace llvm {
22
23class Loop;
24class LPMUpdater;
25
26/// Options to disable Loop Idiom Recognize, which can be shared with other
27/// passes.
28struct DisableLIRP {
29 /// When true, the entire pass is disabled.
30 static bool All;
31
32 /// When true, Memset is disabled.
33 static bool Memset;
34
35 /// When true, Memcpy is disabled.
36 static bool Memcpy;
37
38 /// When true, Strlen is disabled.
39 static bool Strlen;
40
41 /// When true, Wcslen is disabled.
42 static bool Wcslen;
43
44 /// When true, HashRecognize is disabled.
45 static bool HashRecognize;
46};
47
48/// Performs Loop Idiom Recognize Pass.
49class LoopIdiomRecognizePass : public PassInfoMixin<LoopIdiomRecognizePass> {
50public:
51 PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
52 LoopStandardAnalysisResults &AR, LPMUpdater &U);
53};
54
55} // end namespace llvm
56
57#endif // LLVM_TRANSFORMS_SCALAR_LOOPIDIOMRECOGNIZE_H
58