12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|