123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- SwiftErrorValueTracking.h - Track swifterror VReg vals --*- 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 implements a limited mem2reg-like analysis to promote uses of function
- // arguments and allocas marked with swiftalloc from memory into virtual
- // registers tracked by this class.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CODEGEN_SWIFTERRORVALUETRACKING_H
- #define LLVM_CODEGEN_SWIFTERRORVALUETRACKING_H
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/ADT/SmallVector.h"
- #include "llvm/CodeGen/Register.h"
- #include "llvm/IR/BasicBlock.h"
- #include "llvm/IR/DebugLoc.h"
- #include <functional>
- #include <type_traits>
- #include <utility>
- namespace llvm {
- class Function;
- class MachineBasicBlock;
- class MachineFunction;
- class MachineInstr;
- class TargetInstrInfo;
- class TargetLowering;
- class SwiftErrorValueTracking {
- // Some useful objects to reduce the number of function arguments needed.
- MachineFunction *MF;
- const Function *Fn;
- const TargetLowering *TLI;
- const TargetInstrInfo *TII;
- /// A map from swifterror value in a basic block to the virtual register it is
- /// currently represented by.
- DenseMap<std::pair<const MachineBasicBlock *, const Value *>, Register>
- VRegDefMap;
- /// A list of upward exposed vreg uses that need to be satisfied by either a
- /// copy def or a phi node at the beginning of the basic block representing
- /// the predecessor(s) swifterror value.
- DenseMap<std::pair<const MachineBasicBlock *, const Value *>, Register>
- VRegUpwardsUse;
- /// A map from instructions that define/use a swifterror value to the virtual
- /// register that represents that def/use.
- llvm::DenseMap<PointerIntPair<const Instruction *, 1, bool>, Register>
- VRegDefUses;
- /// The swifterror argument of the current function.
- const Value *SwiftErrorArg;
- using SwiftErrorValues = SmallVector<const Value*, 1>;
- /// A function can only have a single swifterror argument. And if it does
- /// have a swifterror argument, it must be the first entry in
- /// SwiftErrorVals.
- SwiftErrorValues SwiftErrorVals;
- public:
- /// Initialize data structures for specified new function.
- void setFunction(MachineFunction &MF);
- /// Get the (unique) function argument that was marked swifterror, or nullptr
- /// if this function has no swifterror args.
- const Value *getFunctionArg() const {
- return SwiftErrorArg;
- }
- /// Get or create the swifterror value virtual register in
- /// VRegDefMap for this basic block.
- Register getOrCreateVReg(const MachineBasicBlock *, const Value *);
- /// Set the swifterror virtual register in the VRegDefMap for this
- /// basic block.
- void setCurrentVReg(const MachineBasicBlock *MBB, const Value *, Register);
- /// Get or create the swifterror value virtual register for a def of a
- /// swifterror by an instruction.
- Register getOrCreateVRegDefAt(const Instruction *, const MachineBasicBlock *,
- const Value *);
- /// Get or create the swifterror value virtual register for a use of a
- /// swifterror by an instruction.
- Register getOrCreateVRegUseAt(const Instruction *, const MachineBasicBlock *,
- const Value *);
- /// Create initial definitions of swifterror values in the entry block of the
- /// current function.
- bool createEntriesInEntryBlock(DebugLoc DbgLoc);
- /// Propagate assigned swifterror vregs through a function, synthesizing PHI
- /// nodes when needed to maintain consistency.
- void propagateVRegs();
- void preassignVRegs(MachineBasicBlock *MBB, BasicBlock::const_iterator Begin,
- BasicBlock::const_iterator End);
- };
- }
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|