Files
gps/tools/local/circt/include/llvm/CodeGen/MachineIDFSSAUpdater.h
T
2026-07-12 11:01:51 +03:00

82 lines
2.8 KiB
C++

//===- MachineIDFSSAUpdater.h - Unstructured SSA Update Tool ----*- 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 declares the MachineIDFSSAUpdater class.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_MACHINEIDFSSAUPDATER_H
#define LLVM_CODEGEN_MACHINEIDFSSAUPDATER_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Register.h"
namespace llvm {
class MachineDominatorTree;
class MachineInstrBuilder;
class MachineBasicBlock;
class TargetInstrInfo;
class MachineIDFSSAUpdater {
struct BBValueInfo {
Register LiveInValue;
Register LiveOutValue;
};
MachineDominatorTree &DT;
MachineRegisterInfo &MRI;
const TargetInstrInfo &TII;
MachineRegisterInfo::VRegAttrs RegAttrs;
SmallVector<std::pair<MachineBasicBlock *, Register>, 4> Defines;
SmallVector<MachineBasicBlock *, 4> UseBlocks;
DenseMap<MachineBasicBlock *, BBValueInfo> BBInfos;
MachineInstrBuilder createInst(unsigned Opc, MachineBasicBlock *BB,
MachineBasicBlock::iterator I);
// IsLiveOut indicates whether we are computing live-out values (true) or
// live-in values (false).
Register computeValue(MachineBasicBlock *BB, bool IsLiveOut);
public:
MachineIDFSSAUpdater(MachineDominatorTree &DT, MachineFunction &MF,
const MachineRegisterInfo::VRegAttrs &RegAttr)
: DT(DT), MRI(MF.getRegInfo()), TII(*MF.getSubtarget().getInstrInfo()),
RegAttrs(RegAttr) {}
MachineIDFSSAUpdater(MachineDominatorTree &DT, MachineFunction &MF,
Register Reg)
: MachineIDFSSAUpdater(DT, MF, MF.getRegInfo().getVRegAttrs(Reg)) {}
/// Indicate that a rewritten value is available in the specified block
/// with the specified value. Must be called before invoking Calculate().
void addAvailableValue(MachineBasicBlock *BB, Register V) {
Defines.emplace_back(BB, V);
}
/// Record a basic block that uses the value. This method should be called for
/// every basic block where the value will be used. Must be called before
/// invoking Calculate().
void addUseBlock(MachineBasicBlock *BB) { UseBlocks.push_back(BB); }
/// Calculate and insert necessary PHI nodes for SSA form.
/// Must be called after registering all definitions and uses.
LLVM_ABI void calculate();
/// See SSAUpdater::GetValueInMiddleOfBlock description.
LLVM_ABI Register getValueInMiddleOfBlock(MachineBasicBlock *BB);
};
} // end namespace llvm
#endif // LLVM_CODEGEN_MACHINEIDFSSAUPDATER_H