1 //===- HardwareLoops.h ------------------------------------------*- 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 /// \file
9 ///
10 /// Defines an IR pass for the creation of hardware loops.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CODEGEN_HARDWARELOOPS_H
15 #define LLVM_CODEGEN_HARDWARELOOPS_H
16 
17 #include "llvm/IR/PassManager.h"
18 
19 namespace llvm {
20 
21 struct HardwareLoopOptions {
22   std::optional<unsigned> Decrement;
23   std::optional<unsigned> Bitwidth;
24   std::optional<bool> Force;
25   std::optional<bool> ForcePhi;
26   std::optional<bool> ForceNested;
27   std::optional<bool> ForceGuard;
28 
29   HardwareLoopOptions &setDecrement(unsigned Count) {
30     Decrement = Count;
31     return *this;
32   }
33   HardwareLoopOptions &setCounterBitwidth(unsigned Width) {
34     Bitwidth = Width;
35     return *this;
36   }
37   HardwareLoopOptions &setForce(bool Force) {
38     this->Force = Force;
39     return *this;
40   }
41   HardwareLoopOptions &setForcePhi(bool Force) {
42     ForcePhi = Force;
43     return *this;
44   }
45   HardwareLoopOptions &setForceNested(bool Force) {
46     ForceNested = Force;
47     return *this;
48   }
49   HardwareLoopOptions &setForceGuard(bool Force) {
50     ForceGuard = Force;
51     return *this;
52   }
53   bool getForcePhi() const {
54     return ForcePhi.has_value() && ForcePhi.value();
55   }
56   bool getForceNested() const {
57     return ForceNested.has_value() && ForceNested.value();
58   }
59   bool getForceGuard() const {
60     return ForceGuard.has_value() && ForceGuard.value();
61   }
62 };
63 
64 class HardwareLoopsPass : public PassInfoMixin<HardwareLoopsPass> {
65   HardwareLoopOptions Opts;
66 
67 public:
68   explicit HardwareLoopsPass(HardwareLoopOptions Opts = {})
69     : Opts(Opts) { }
70 
71   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
72 };
73 
74 } // end namespace llvm
75 
76 #endif // LLVM_CODEGEN_HARDWARELOOPS_H
77