- //===- AssumeBundleBuilder.h - utils to build assume bundles ----*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
- // 
- // This file contain tools to preserve informations. They should be used before 
- // performing a transformation that may move and delete instructions as those 
- // transformation may destroy or worsen information that can be derived from the 
- // IR. 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_TRANSFORMS_UTILS_ASSUMEBUNDLEBUILDER_H 
- #define LLVM_TRANSFORMS_UTILS_ASSUMEBUNDLEBUILDER_H 
-   
- #include "llvm/Analysis/AssumeBundleQueries.h" 
- #include "llvm/IR/PassManager.h" 
-   
- namespace llvm { 
- class AssumeInst; 
- class Function; 
- class FunctionPass; 
- class Instruction; 
- class AssumptionCache; 
- class DominatorTree; 
-   
- /// Build a call to llvm.assume to preserve informations that can be derived 
- /// from the given instruction. 
- /// If no information derived from \p I, this call returns null. 
- /// The returned instruction is not inserted anywhere. 
- AssumeInst *buildAssumeFromInst(Instruction *I); 
-   
- /// Calls BuildAssumeFromInst and if the resulting llvm.assume is valid insert 
- /// if before I. This is usually what need to be done to salvage the knowledge 
- /// contained in the instruction I. 
- /// The AssumptionCache must be provided if it is available or the cache may 
- /// become silently be invalid. 
- /// The DominatorTree can optionally be provided to enable cross-block 
- /// reasoning. 
- void salvageKnowledge(Instruction *I, AssumptionCache *AC = nullptr, 
-                       DominatorTree *DT = nullptr); 
-   
- /// Build and return a new assume created from the provided knowledge 
- /// if the knowledge in the assume is fully redundant this will return nullptr 
- AssumeInst *buildAssumeFromKnowledge(ArrayRef<RetainedKnowledge> Knowledge, 
-                                      Instruction *CtxI, 
-                                      AssumptionCache *AC = nullptr, 
-                                      DominatorTree *DT = nullptr); 
-   
- /// This pass attempts to minimize the number of assume without loosing any 
- /// information. 
- struct AssumeSimplifyPass : public PassInfoMixin<AssumeSimplifyPass> { 
-   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 
- }; 
-   
- FunctionPass *createAssumeSimplifyPass(); 
-   
- /// This pass will try to build an llvm.assume for every instruction in the 
- /// function. Its main purpose is testing. 
- struct AssumeBuilderPass : public PassInfoMixin<AssumeBuilderPass> { 
-   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 
- }; 
-   
- /// canonicalize the RetainedKnowledge RK. it is assumed that RK is part of 
- /// Assume. This will return an empty RetainedKnowledge if the knowledge is 
- /// useless. 
- RetainedKnowledge simplifyRetainedKnowledge(AssumeInst *Assume, 
-                                             RetainedKnowledge RK, 
-                                             AssumptionCache *AC, 
-                                             DominatorTree *DT); 
-   
- } // namespace llvm 
-   
- #endif 
-