1 | //===- AssumeBundleBuilder.h - utils to build assume bundles ----*- 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 file contain tools to preserve informations. They should be used before |
10 | // performing a transformation that may move and delete instructions as those |
11 | // transformation may destroy or worsen information that can be derived from the |
12 | // IR. |
13 | // |
14 | //===----------------------------------------------------------------------===// |
15 | |
16 | #ifndef LLVM_TRANSFORMS_UTILS_ASSUMEBUNDLEBUILDER_H |
17 | #define LLVM_TRANSFORMS_UTILS_ASSUMEBUNDLEBUILDER_H |
18 | |
19 | #include "llvm/Analysis/AssumeBundleQueries.h" |
20 | #include "llvm/IR/PassManager.h" |
21 | #include "llvm/Support/CommandLine.h" |
22 | |
23 | namespace llvm { |
24 | class AssumeInst; |
25 | class Function; |
26 | class Instruction; |
27 | class AssumptionCache; |
28 | class DominatorTree; |
29 | |
30 | extern cl::opt<bool> EnableKnowledgeRetention; |
31 | |
32 | /// Build a call to llvm.assume to preserve informations that can be derived |
33 | /// from the given instruction. |
34 | /// If no information derived from \p I, this call returns null. |
35 | /// The returned instruction is not inserted anywhere. |
36 | AssumeInst *buildAssumeFromInst(Instruction *I); |
37 | |
38 | /// Calls BuildAssumeFromInst and if the resulting llvm.assume is valid insert |
39 | /// if before I. This is usually what need to be done to salvage the knowledge |
40 | /// contained in the instruction I. |
41 | /// The AssumptionCache must be provided if it is available or the cache may |
42 | /// become silently be invalid. |
43 | /// The DominatorTree can optionally be provided to enable cross-block |
44 | /// reasoning. |
45 | /// This returns if a change was made. |
46 | bool salvageKnowledge(Instruction *I, AssumptionCache *AC = nullptr, |
47 | DominatorTree *DT = nullptr); |
48 | |
49 | /// Build and return a new assume created from the provided knowledge |
50 | /// if the knowledge in the assume is fully redundant this will return nullptr |
51 | AssumeInst *buildAssumeFromKnowledge(ArrayRef<RetainedKnowledge> Knowledge, |
52 | Instruction *CtxI, |
53 | AssumptionCache *AC = nullptr, |
54 | DominatorTree *DT = nullptr); |
55 | |
56 | /// This pass attempts to minimize the number of assume without loosing any |
57 | /// information. |
58 | struct AssumeSimplifyPass : public PassInfoMixin<AssumeSimplifyPass> { |
59 | PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); |
60 | }; |
61 | |
62 | /// This pass will try to build an llvm.assume for every instruction in the |
63 | /// function. Its main purpose is testing. |
64 | struct AssumeBuilderPass : public PassInfoMixin<AssumeBuilderPass> { |
65 | PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); |
66 | }; |
67 | |
68 | /// canonicalize the RetainedKnowledge RK. it is assumed that RK is part of |
69 | /// Assume. This will return an empty RetainedKnowledge if the knowledge is |
70 | /// useless. |
71 | RetainedKnowledge simplifyRetainedKnowledge(AssumeInst *Assume, |
72 | RetainedKnowledge RK, |
73 | AssumptionCache *AC, |
74 | DominatorTree *DT); |
75 | |
76 | } // namespace llvm |
77 | |
78 | #endif |
79 | |