[Alignment][NFC] Use Align with TargetLowering::setMinFunctionAlignment
[llvm-core.git] / include / llvm / CodeGen / GlobalISel / GISelKnownBits.h
blobe2a088f9217644bf0f8abff6815b72f38c8368ee
1 //===- llvm/CodeGen/GlobalISel/GISelKnownBits.h ---------------*- 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 /// Provides analysis for querying information about KnownBits during GISel
10 /// passes.
12 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CODEGEN_GLOBALISEL_KNOWNBITSINFO_H
14 #define LLVM_CODEGEN_GLOBALISEL_KNOWNBITSINFO_H
16 #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
17 #include "llvm/CodeGen/MachineFunctionPass.h"
18 #include "llvm/CodeGen/Register.h"
19 #include "llvm/IR/PassManager.h"
20 #include "llvm/InitializePasses.h"
21 #include "llvm/Pass.h"
22 #include "llvm/Support/KnownBits.h"
24 namespace llvm {
26 class TargetLowering;
27 class DataLayout;
29 class GISelKnownBits : public GISelChangeObserver {
30 MachineFunction &MF;
31 MachineRegisterInfo &MRI;
32 const TargetLowering &TL;
33 const DataLayout &DL;
35 public:
36 GISelKnownBits(MachineFunction &MF);
37 virtual ~GISelKnownBits() = default;
38 void setMF(MachineFunction &MF);
39 virtual void computeKnownBitsImpl(Register R, KnownBits &Known,
40 const APInt &DemandedElts,
41 unsigned Depth = 0);
43 // KnownBitsAPI
44 KnownBits getKnownBits(Register R);
45 // Calls getKnownBits for first operand def of MI.
46 KnownBits getKnownBits(MachineInstr &MI);
47 APInt getKnownZeroes(Register R);
48 APInt getKnownOnes(Register R);
50 /// \return true if 'V & Mask' is known to be zero in DemandedElts. We use
51 /// this predicate to simplify operations downstream.
52 /// Mask is known to be zero for bits that V cannot have.
53 bool maskedValueIsZero(Register Val, const APInt &Mask) {
54 return Mask.isSubsetOf(getKnownBits(Val).Zero);
57 /// \return true if the sign bit of Op is known to be zero. We use this
58 /// predicate to simplify operations downstream.
59 bool signBitIsZero(Register Op);
61 // FIXME: Is this the right place for G_FRAME_INDEX? Should it be in
62 // TargetLowering?
63 void computeKnownBitsForFrameIndex(Register R, KnownBits &Known,
64 const APInt &DemandedElts,
65 unsigned Depth = 0);
66 static unsigned inferAlignmentForFrameIdx(int FrameIdx, int Offset,
67 const MachineFunction &MF);
68 static void computeKnownBitsForAlignment(KnownBits &Known, unsigned Align);
70 // Try to infer alignment for MI.
71 static unsigned inferPtrAlignment(const MachineInstr &MI);
73 // Observer API. No-op for non-caching implementation.
74 void erasingInstr(MachineInstr &MI) override{};
75 void createdInstr(MachineInstr &MI) override{};
76 void changingInstr(MachineInstr &MI) override{};
77 void changedInstr(MachineInstr &MI) override{};
79 protected:
80 unsigned getMaxDepth() const { return 6; }
83 /// To use KnownBitsInfo analysis in a pass,
84 /// KnownBitsInfo &Info = getAnalysis<GISelKnownBitsInfoAnalysis>().get(MF);
85 /// Add to observer if the Info is caching.
86 /// WrapperObserver.addObserver(Info);
88 /// Eventually add other features such as caching/ser/deserializing
89 /// to MIR etc. Those implementations can derive from GISelKnownBits
90 /// and override computeKnownBitsImpl.
91 class GISelKnownBitsAnalysis : public MachineFunctionPass {
92 std::unique_ptr<GISelKnownBits> Info;
94 public:
95 static char ID;
96 GISelKnownBitsAnalysis() : MachineFunctionPass(ID) {
97 initializeGISelKnownBitsAnalysisPass(*PassRegistry::getPassRegistry());
99 GISelKnownBits &get(MachineFunction &MF) {
100 if (!Info)
101 Info = std::make_unique<GISelKnownBits>(MF);
102 return *Info.get();
104 void getAnalysisUsage(AnalysisUsage &AU) const override;
105 bool runOnMachineFunction(MachineFunction &MF) override;
106 void releaseMemory() override { Info.reset(); }
108 } // namespace llvm
110 #endif // ifdef