LLVM: lib/CodeGen/ExpandPostRAPseudos.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

23

24using namespace llvm;

25

26#define DEBUG_TYPE "postrapseudos"

27

28namespace {

30private:

33

34public:

35 static char ID;

37

43 }

44

45

47

48private:

50};

51}

52

53char ExpandPostRA::ID = 0;

55

57 "Post-RA pseudo instruction expansion pass", false, false)

58

61 assert((MI->getOperand(0).isReg() && MI->getOperand(0).isDef()) &&

62 MI->getOperand(1).isImm() &&

63 (MI->getOperand(2).isReg() && MI->getOperand(2).isUse()) &&

64 MI->getOperand(3).isImm() && "Invalid subreg_to_reg");

65

66 Register DstReg = MI->getOperand(0).getReg();

67 Register InsReg = MI->getOperand(2).getReg();

68 assert(MI->getOperand(2).getSubReg() && "SubIdx on physreg?");

69 unsigned SubIdx = MI->getOperand(3).getImm();

70

71 assert(SubIdx != 0 && "Invalid index for insert_subreg");

72 Register DstSubReg = TRI->getSubReg(DstReg, SubIdx);

73

75 "Insert destination must be in a physical register");

77 "Inserted value must be in a physical register");

78

80

81 if (MI->allDefsAreDead()) {

82 MI->setDesc(TII->get(TargetOpcode::KILL));

83 MI->removeOperand(3);

84 MI->removeOperand(1);

86 return true;

87 }

88

89 if (DstSubReg == InsReg) {

90

91

92

93

94 if (DstReg != InsReg) {

95 MI->setDesc(TII->get(TargetOpcode::KILL));

96 MI->removeOperand(3);

97 MI->removeOperand(1);

99 return true;

100 }

102 } else {

104 MI->getOperand(2).isKill());

105

106

108 --CopyMI;

109 CopyMI->addRegisterDefined(DstReg);

111 }

112

115 return true;

116}

117

118

119

120

121bool ExpandPostRA::runOnMachineFunction(MachineFunction &MF) {

123 << "********** EXPANDING POST-RA PSEUDO INSTRS **********\n"

124 << "********** Function: " << MF.getName() << '\n');

127

128 bool MadeChange = false;

129

132

133 if (MI.isPseudo())

134 continue;

135

136

138 MadeChange = true;

139 continue;

140 }

141

142

143 switch (MI.getOpcode()) {

144 case TargetOpcode::SUBREG_TO_REG:

145 MadeChange |= LowerSubregToReg(&MI);

146 break;

147 case TargetOpcode::COPY:

149 MadeChange = true;

150 break;

151 case TargetOpcode::DBG_VALUE:

152 continue;

153 case TargetOpcode::INSERT_SUBREG:

154 case TargetOpcode::EXTRACT_SUBREG:

155 llvm_unreachable("Sub-register pseudos should have been eliminated.");

156 }

157 }

158 }

159

160 return MadeChange;

161}

const HexagonInstrInfo * TII

unsigned const TargetRegisterInfo * TRI

#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)

assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())

Represent the analysis usage information of a pass.

AnalysisUsage & addPreservedID(const void *ID)

void setPreservesCFG()

This function should be called by the pass, iff they do not:

bool expandPostRAPseudo(MachineInstr &MI) const override

This function is called for all pseudo instructions that remain after register allocation.

void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override

Emit instructions to copy a pair of physical registers.

instr_iterator erase(instr_iterator I)

Remove an instruction from the instruction list and delete it.

MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...

void getAnalysisUsage(AnalysisUsage &AU) const override

getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.

virtual bool runOnMachineFunction(MachineFunction &MF)=0

runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...

const TargetSubtargetInfo & getSubtarget() const

getSubtarget - Return the subtarget for which this machine code is being compiled.

StringRef getName() const

getName - Return the name of the corresponding LLVM function.

Representation of each machine instruction.

Wrapper class representing virtual and physical registers.

constexpr bool isPhysical() const

Return true if the specified register number is in the physical register namespace.

TargetInstrInfo - Interface to description of machine instruction set.

TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...

virtual const TargetRegisterInfo * getRegisterInfo() const

getRegisterInfo - If register information is available, return it.

virtual const TargetInstrInfo * getInstrInfo() const

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

unsigned ID

LLVM IR allows to use arbitrary numbers as calling convention identifiers.

This is an optimization pass for GlobalISel generic memory operations.

char & MachineDominatorsID

MachineDominators - This pass is a machine dominators analysis pass.

char & ExpandPostRAPseudosID

ExpandPostRAPseudos - This pass expands pseudo instructions after register allocation.

iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)

Make a range that does early increment to allow mutation of the underlying range without disrupting i...

char & MachineLoopInfoID

MachineLoopInfo - This pass is a loop analysis pass.

raw_ostream & dbgs()

dbgs() - This returns a reference to a raw_ostream for debugging messages.