1//===- SimplifyCFGOptions.h - Control structure for SimplifyCFG -*- 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// A set of parameters used to control the transforms in the SimplifyCFG pass.
10// Options may change depending on the position in the optimization pipeline.
11// For example, canonical form that includes switches and branches may later be
12// replaced by lookup tables and selects.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYCFGOPTIONS_H
17#define LLVM_TRANSFORMS_UTILS_SIMPLIFYCFGOPTIONS_H
18
19namespace llvm {
20
21class AssumptionCache;
22
23struct SimplifyCFGOptions {
24  int BonusInstThreshold = 1;
25  bool ForwardSwitchCondToPhi = false;
26  bool ConvertSwitchRangeToICmp = false;
27  bool ConvertSwitchToLookupTable = false;
28  bool NeedCanonicalLoop = true;
29  bool HoistCommonInsts = false;
30  bool SinkCommonInsts = false;
31  bool SimplifyCondBranch = true;
32  bool SpeculateBlocks = true;
33
34  AssumptionCache *AC = nullptr;
35
36  // Support 'builder' pattern to set members by name at construction time.
37  SimplifyCFGOptions &bonusInstThreshold(int I) {
38    BonusInstThreshold = I;
39    return *this;
40  }
41  SimplifyCFGOptions &forwardSwitchCondToPhi(bool B) {
42    ForwardSwitchCondToPhi = B;
43    return *this;
44  }
45  SimplifyCFGOptions &convertSwitchRangeToICmp(bool B) {
46    ConvertSwitchRangeToICmp = B;
47    return *this;
48  }
49  SimplifyCFGOptions &convertSwitchToLookupTable(bool B) {
50    ConvertSwitchToLookupTable = B;
51    return *this;
52  }
53  SimplifyCFGOptions &needCanonicalLoops(bool B) {
54    NeedCanonicalLoop = B;
55    return *this;
56  }
57  SimplifyCFGOptions &hoistCommonInsts(bool B) {
58    HoistCommonInsts = B;
59    return *this;
60  }
61  SimplifyCFGOptions &sinkCommonInsts(bool B) {
62    SinkCommonInsts = B;
63    return *this;
64  }
65  SimplifyCFGOptions &setAssumptionCache(AssumptionCache *Cache) {
66    AC = Cache;
67    return *this;
68  }
69  SimplifyCFGOptions &setSimplifyCondBranch(bool B) {
70    SimplifyCondBranch = B;
71    return *this;
72  }
73
74  SimplifyCFGOptions &speculateBlocks(bool B) {
75    SpeculateBlocks = B;
76    return *this;
77  }
78};
79
80} // namespace llvm
81
82#endif // LLVM_TRANSFORMS_UTILS_SIMPLIFYCFGOPTIONS_H
83