Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- SwiftErrorValueTracking.h - Track swifterror VReg vals --*- 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 implements a limited mem2reg-like analysis to promote uses of function
10
// arguments and allocas marked with swiftalloc from memory into virtual
11
// registers tracked by this class.
12
//
13
//===----------------------------------------------------------------------===//
14
 
15
#ifndef LLVM_CODEGEN_SWIFTERRORVALUETRACKING_H
16
#define LLVM_CODEGEN_SWIFTERRORVALUETRACKING_H
17
 
18
#include "llvm/ADT/DenseMap.h"
19
#include "llvm/ADT/SmallVector.h"
20
#include "llvm/CodeGen/Register.h"
21
#include "llvm/IR/BasicBlock.h"
22
#include "llvm/IR/DebugLoc.h"
23
#include <utility>
24
 
25
 
26
namespace llvm {
27
  class Function;
28
  class MachineBasicBlock;
29
  class MachineFunction;
30
  class MachineInstr;
31
  class TargetInstrInfo;
32
  class TargetLowering;
33
 
34
class SwiftErrorValueTracking {
35
  // Some useful objects to reduce the number of function arguments needed.
36
  MachineFunction *MF;
37
  const Function *Fn;
38
  const TargetLowering *TLI;
39
  const TargetInstrInfo *TII;
40
 
41
  /// A map from swifterror value in a basic block to the virtual register it is
42
  /// currently represented by.
43
  DenseMap<std::pair<const MachineBasicBlock *, const Value *>, Register>
44
      VRegDefMap;
45
 
46
  /// A list of upward exposed vreg uses that need to be satisfied by either a
47
  /// copy def or a phi node at the beginning of the basic block representing
48
  /// the predecessor(s) swifterror value.
49
  DenseMap<std::pair<const MachineBasicBlock *, const Value *>, Register>
50
      VRegUpwardsUse;
51
 
52
  /// A map from instructions that define/use a swifterror value to the virtual
53
  /// register that represents that def/use.
54
  llvm::DenseMap<PointerIntPair<const Instruction *, 1, bool>, Register>
55
      VRegDefUses;
56
 
57
  /// The swifterror argument of the current function.
58
  const Value *SwiftErrorArg;
59
 
60
  using SwiftErrorValues = SmallVector<const Value*, 1>;
61
  /// A function can only have a single swifterror argument. And if it does
62
  /// have a swifterror argument, it must be the first entry in
63
  /// SwiftErrorVals.
64
  SwiftErrorValues SwiftErrorVals;
65
 
66
public:
67
  /// Initialize data structures for specified new function.
68
  void setFunction(MachineFunction &MF);
69
 
70
  /// Get the (unique) function argument that was marked swifterror, or nullptr
71
  /// if this function has no swifterror args.
72
  const Value *getFunctionArg() const {
73
    return SwiftErrorArg;
74
  }
75
 
76
  /// Get or create the swifterror value virtual register in
77
  /// VRegDefMap for this basic block.
78
  Register getOrCreateVReg(const MachineBasicBlock *, const Value *);
79
 
80
  /// Set the swifterror virtual register in the VRegDefMap for this
81
  /// basic block.
82
  void setCurrentVReg(const MachineBasicBlock *MBB, const Value *, Register);
83
 
84
  /// Get or create the swifterror value virtual register for a def of a
85
  /// swifterror by an instruction.
86
  Register getOrCreateVRegDefAt(const Instruction *, const MachineBasicBlock *,
87
                                const Value *);
88
 
89
  /// Get or create the swifterror value virtual register for a use of a
90
  /// swifterror by an instruction.
91
  Register getOrCreateVRegUseAt(const Instruction *, const MachineBasicBlock *,
92
                                const Value *);
93
 
94
  /// Create initial definitions of swifterror values in the entry block of the
95
  /// current function.
96
  bool createEntriesInEntryBlock(DebugLoc DbgLoc);
97
 
98
  /// Propagate assigned swifterror vregs through a function, synthesizing PHI
99
  /// nodes when needed to maintain consistency.
100
  void propagateVRegs();
101
 
102
  void preassignVRegs(MachineBasicBlock *MBB, BasicBlock::const_iterator Begin,
103
                      BasicBlock::const_iterator End);
104
};
105
 
106
}
107
 
108
#endif