blob: 04db3eb57c18e8f1ff0c646ca687340e279d4c71 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- llvm/Analysis/DemandedBits.h - Determine demanded bits ---*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
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_DEMANDED_BITS_H
22#define LLVM_ANALYSIS_DEMANDED_BITS_H
23
24#include "llvm/ADT/APInt.h"
25#include "llvm/ADT/DenseMap.h"
26#include "llvm/ADT/Optional.h"
27#include "llvm/ADT/SmallPtrSet.h"
28#include "llvm/IR/PassManager.h"
29#include "llvm/Pass.h"
30
31namespace llvm {
32
33class AssumptionCache;
34class DominatorTree;
35class Function;
36class Instruction;
37struct KnownBits;
38class raw_ostream;
39
40class DemandedBits {
41public:
42 DemandedBits(Function &F, AssumptionCache &AC, DominatorTree &DT) :
43 F(F), AC(AC), DT(DT) {}
44
45 /// Return the bits demanded from instruction I.
Andrew Walbran16937d02019-10-22 13:54:20 +010046 ///
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.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010054 APInt getDemandedBits(Instruction *I);
55
56 /// Return true if, during analysis, I could not be reached.
57 bool isInstructionDead(Instruction *I);
58
Andrew Walbran16937d02019-10-22 13:54:20 +010059 /// Return whether this use is dead by means of not having any demanded bits.
60 bool isUseDead(Use *U);
61
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010062 void print(raw_ostream &OS);
63
64private:
65 void performAnalysis();
66 void determineLiveOperandBits(const Instruction *UserI,
Andrew Walbran16937d02019-10-22 13:54:20 +010067 const Value *Val, unsigned OperandNo,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010068 const APInt &AOut, APInt &AB,
Andrew Walbran16937d02019-10-22 13:54:20 +010069 KnownBits &Known, KnownBits &Known2, bool &KnownBitsComputed);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010070
71 Function &F;
72 AssumptionCache ∾
73 DominatorTree &DT;
74
75 bool Analyzed = false;
76
77 // The set of visited instructions (non-integer-typed only).
78 SmallPtrSet<Instruction*, 32> Visited;
79 DenseMap<Instruction *, APInt> AliveBits;
Andrew Walbran16937d02019-10-22 13:54:20 +010080 // Uses with no demanded bits. If the user also has no demanded bits, the use
81 // might not be stored explicitly in this map, to save memory during analysis.
82 SmallPtrSet<Use *, 16> DeadUses;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010083};
84
85class DemandedBitsWrapperPass : public FunctionPass {
86private:
87 mutable Optional<DemandedBits> DB;
88
89public:
90 static char ID; // Pass identification, replacement for typeid
91
92 DemandedBitsWrapperPass();
93
94 bool runOnFunction(Function &F) override;
95 void getAnalysisUsage(AnalysisUsage &AU) const override;
96
97 /// Clean up memory in between runs
98 void releaseMemory() override;
99
100 DemandedBits &getDemandedBits() { return *DB; }
101
102 void print(raw_ostream &OS, const Module *M) const override;
103};
104
105/// An analysis that produces \c DemandedBits for a function.
106class DemandedBitsAnalysis : public AnalysisInfoMixin<DemandedBitsAnalysis> {
107 friend AnalysisInfoMixin<DemandedBitsAnalysis>;
108
109 static AnalysisKey Key;
110
111public:
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100112 /// Provide the result type for this analysis pass.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100113 using Result = DemandedBits;
114
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100115 /// Run the analysis pass over a function and produce demanded bits
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100116 /// information.
117 DemandedBits run(Function &F, FunctionAnalysisManager &AM);
118};
119
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100120/// Printer pass for DemandedBits
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100121class DemandedBitsPrinterPass : public PassInfoMixin<DemandedBitsPrinterPass> {
122 raw_ostream &OS;
123
124public:
125 explicit DemandedBitsPrinterPass(raw_ostream &OS) : OS(OS) {}
126
127 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
128};
129
130/// Create a demanded bits analysis pass.
131FunctionPass *createDemandedBitsWrapperPass();
132
133} // end namespace llvm
134
135#endif // LLVM_ANALYSIS_DEMANDED_BITS_H