LLVM 20.0.0git
SimpleLoopUnswitch.h
Go to the documentation of this file.
1//===- SimpleLoopUnswitch.h - Hoist loop-invariant control flow -*- 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#ifndef LLVM_TRANSFORMS_SCALAR_SIMPLELOOPUNSWITCH_H
10#define LLVM_TRANSFORMS_SCALAR_SIMPLELOOPUNSWITCH_H
11
14#include "llvm/IR/PassManager.h"
17
18namespace llvm {
19
20class LPMUpdater;
21class Loop;
22class StringRef;
23class raw_ostream;
24
25/// This pass transforms loops that contain branches or switches on loop-
26/// invariant conditions to have multiple loops. For example, it turns the left
27/// into the right code:
28///
29/// for (...) if (lic)
30/// A for (...)
31/// if (lic) A; B; C
32/// B else
33/// C for (...)
34/// A; C
35///
36/// This can increase the size of the code exponentially (doubling it every time
37/// a loop is unswitched) so we only unswitch if the resultant code will be
38/// smaller than a threshold.
39///
40/// This pass expects LICM to be run before it to hoist invariant conditions out
41/// of the loop, to make the unswitching opportunity obvious.
42///
43/// There is a taxonomy of unswitching that we use to classify different forms
44/// of this transformaiton:
45///
46/// - Trival unswitching: this is when the condition can be unswitched without
47/// cloning any code from inside the loop. A non-trivial unswitch requires
48/// code duplication.
49///
50/// - Full unswitching: this is when the branch or switch is completely moved
51/// from inside the loop to outside the loop. Partial unswitching removes the
52/// branch from the clone of the loop but must leave a (somewhat simplified)
53/// branch in the original loop. While theoretically partial unswitching can
54/// be done for switches, the requirements are extreme - we need the loop
55/// invariant input to the switch to be sufficient to collapse to a single
56/// successor in each clone.
57///
58/// This pass always does trivial, full unswitching for both branches and
59/// switches. For branches, it also always does trivial, partial unswitching.
60///
61/// If enabled (via the constructor's `NonTrivial` parameter), this pass will
62/// additionally do non-trivial, full unswitching for branches and switches, and
63/// will do non-trivial, partial unswitching for branches.
64///
65/// Because partial unswitching of switches is extremely unlikely to be possible
66/// in practice and significantly complicates the implementation, this pass does
67/// not currently implement that in any mode.
68class SimpleLoopUnswitchPass : public PassInfoMixin<SimpleLoopUnswitchPass> {
69 bool NonTrivial;
70 bool Trivial;
71
72public:
73 SimpleLoopUnswitchPass(bool NonTrivial = false, bool Trivial = true)
74 : NonTrivial(NonTrivial), Trivial(Trivial) {}
75
78
80 function_ref<StringRef(StringRef)> MapClassName2PassName);
81};
82
83/// A marker analysis to determine if SimpleLoopUnswitch should run again on a
84/// given loop.
86 : public ShouldRunExtraPasses<ShouldRunExtraSimpleLoopUnswitch>,
87 public AnalysisInfoMixin<ShouldRunExtraSimpleLoopUnswitch> {
89};
90
91} // end namespace llvm
92
93#endif // LLVM_TRANSFORMS_SCALAR_SIMPLELOOPUNSWITCH_H
This file provides a pass manager that only runs its passes if the provided marker analysis has been ...
This header defines various interfaces for pass management in LLVM.
This header provides classes for managing per-loop analyses.
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
raw_pwrite_stream & OS
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:39
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
This pass transforms loops that contain branches or switches on loop- invariant conditions to have mu...
SimpleLoopUnswitchPass(bool NonTrivial=false, bool Trivial=true)
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
A CRTP mix-in that provides informational APIs needed for analysis passes.
Definition: PassManager.h:92
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:28
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition: PassManager.h:69
A marker analysis to determine if extra passes should be run on demand.
A marker analysis to determine if SimpleLoopUnswitch should run again on a given loop.