Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- llvm/Analysis/DemandedBits.h - Determine demanded bits ---*- 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 pass implements a demanded bits analysis. A demanded bit is one that
  10. // contributes to a result; bits that are not demanded can be either zero or
  11. // one without affecting control or data flow. For example in this sequence:
  12. //
  13. //   %1 = add i32 %x, %y
  14. //   %2 = trunc i32 %1 to i16
  15. //
  16. // Only the lowest 16 bits of %1 are demanded; the rest are removed by the
  17. // trunc.
  18. //
  19. //===----------------------------------------------------------------------===//
  20.  
  21. #ifndef LLVM_ANALYSIS_DEMANDEDBITS_H
  22. #define LLVM_ANALYSIS_DEMANDEDBITS_H
  23.  
  24. #include "llvm/ADT/APInt.h"
  25. #include "llvm/ADT/DenseMap.h"
  26. #include "llvm/ADT/SmallPtrSet.h"
  27. #include "llvm/IR/PassManager.h"
  28. #include "llvm/Pass.h"
  29. #include <optional>
  30.  
  31. namespace llvm {
  32.  
  33. class AssumptionCache;
  34. class DominatorTree;
  35. class Function;
  36. class Instruction;
  37. struct KnownBits;
  38. class raw_ostream;
  39.  
  40. class DemandedBits {
  41. public:
  42.   DemandedBits(Function &F, AssumptionCache &AC, DominatorTree &DT) :
  43.     F(F), AC(AC), DT(DT) {}
  44.  
  45.   /// Return the bits demanded from instruction I.
  46.   ///
  47.   /// For vector instructions individual vector elements are not distinguished:
  48.   /// A bit is demanded if it is demanded for any of the vector elements. The
  49.   /// size of the return value corresponds to the type size in bits of the
  50.   /// scalar type.
  51.   ///
  52.   /// Instructions that do not have integer or vector of integer type are
  53.   /// accepted, but will always produce a mask with all bits set.
  54.   APInt getDemandedBits(Instruction *I);
  55.  
  56.   /// Return the bits demanded from use U.
  57.   APInt getDemandedBits(Use *U);
  58.  
  59.   /// Return true if, during analysis, I could not be reached.
  60.   bool isInstructionDead(Instruction *I);
  61.  
  62.   /// Return whether this use is dead by means of not having any demanded bits.
  63.   bool isUseDead(Use *U);
  64.  
  65.   void print(raw_ostream &OS);
  66.  
  67.   /// Compute alive bits of one addition operand from alive output and known
  68.   /// operand bits
  69.   static APInt determineLiveOperandBitsAdd(unsigned OperandNo,
  70.                                            const APInt &AOut,
  71.                                            const KnownBits &LHS,
  72.                                            const KnownBits &RHS);
  73.  
  74.   /// Compute alive bits of one subtraction operand from alive output and known
  75.   /// operand bits
  76.   static APInt determineLiveOperandBitsSub(unsigned OperandNo,
  77.                                            const APInt &AOut,
  78.                                            const KnownBits &LHS,
  79.                                            const KnownBits &RHS);
  80.  
  81. private:
  82.   void performAnalysis();
  83.   void determineLiveOperandBits(const Instruction *UserI,
  84.     const Value *Val, unsigned OperandNo,
  85.     const APInt &AOut, APInt &AB,
  86.     KnownBits &Known, KnownBits &Known2, bool &KnownBitsComputed);
  87.  
  88.   Function &F;
  89.   AssumptionCache &AC;
  90.   DominatorTree &DT;
  91.  
  92.   bool Analyzed = false;
  93.  
  94.   // The set of visited instructions (non-integer-typed only).
  95.   SmallPtrSet<Instruction*, 32> Visited;
  96.   DenseMap<Instruction *, APInt> AliveBits;
  97.   // Uses with no demanded bits. If the user also has no demanded bits, the use
  98.   // might not be stored explicitly in this map, to save memory during analysis.
  99.   SmallPtrSet<Use *, 16> DeadUses;
  100. };
  101.  
  102. class DemandedBitsWrapperPass : public FunctionPass {
  103. private:
  104.   mutable std::optional<DemandedBits> DB;
  105.  
  106. public:
  107.   static char ID; // Pass identification, replacement for typeid
  108.  
  109.   DemandedBitsWrapperPass();
  110.  
  111.   bool runOnFunction(Function &F) override;
  112.   void getAnalysisUsage(AnalysisUsage &AU) const override;
  113.  
  114.   /// Clean up memory in between runs
  115.   void releaseMemory() override;
  116.  
  117.   DemandedBits &getDemandedBits() { return *DB; }
  118.  
  119.   void print(raw_ostream &OS, const Module *M) const override;
  120. };
  121.  
  122. /// An analysis that produces \c DemandedBits for a function.
  123. class DemandedBitsAnalysis : public AnalysisInfoMixin<DemandedBitsAnalysis> {
  124.   friend AnalysisInfoMixin<DemandedBitsAnalysis>;
  125.  
  126.   static AnalysisKey Key;
  127.  
  128. public:
  129.   /// Provide the result type for this analysis pass.
  130.   using Result = DemandedBits;
  131.  
  132.   /// Run the analysis pass over a function and produce demanded bits
  133.   /// information.
  134.   DemandedBits run(Function &F, FunctionAnalysisManager &AM);
  135. };
  136.  
  137. /// Printer pass for DemandedBits
  138. class DemandedBitsPrinterPass : public PassInfoMixin<DemandedBitsPrinterPass> {
  139.   raw_ostream &OS;
  140.  
  141. public:
  142.   explicit DemandedBitsPrinterPass(raw_ostream &OS) : OS(OS) {}
  143.  
  144.   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
  145. };
  146.  
  147. /// Create a demanded bits analysis pass.
  148. FunctionPass *createDemandedBitsWrapperPass();
  149.  
  150. } // end namespace llvm
  151.  
  152. #endif // LLVM_ANALYSIS_DEMANDEDBITS_H
  153.