LLVM: lib/Target/NVPTX/NVPTXProxyRegErasure.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

24

25using namespace llvm;

26

27namespace {

28

30 static char ID;

31 NVPTXProxyRegErasure() : MachineFunctionPass(ID) {}

32

33 bool runOnMachineFunction(MachineFunction &MF) override;

34

35 StringRef getPassName() const override {

36 return "NVPTX Proxy Register Instruction Erasure";

37 }

38

39 void getAnalysisUsage(AnalysisUsage &AU) const override {

41 }

42};

43

44}

45

46char NVPTXProxyRegErasure::ID = 0;

47

49 "NVPTX ProxyReg Erasure", false, false)

50

53

54

55

57

58 for (auto &BB : MF) {

59 for (auto &MI : BB) {

60 switch (MI.getOpcode()) {

61 case NVPTX::ProxyRegB1:

62 case NVPTX::ProxyRegB16:

63 case NVPTX::ProxyRegB32:

64 case NVPTX::ProxyRegB64: {

65 auto &InOp = *MI.uses().begin();

66 auto &OutOp = *MI.defs().begin();

67 assert(InOp.isReg() && "ProxyReg input should be a register.");

68 assert(OutOp.isReg() && "ProxyReg output should be a register.");

70 Register replacement = InOp.getReg();

71

72 if (auto it = RAUWBatch.find(replacement); it != RAUWBatch.end())

73 replacement = it->second;

74 RAUWBatch.try_emplace(OutOp.getReg(), replacement);

75 break;

76 }

77 }

78 }

79 }

80

81

82 if (RemoveList.empty())

83 return false;

84

85

86 for (auto *MI : RemoveList) {

87 MI->eraseFromParent();

88 }

89

90

91 for (auto &BB : MF) {

92 for (auto &MI : BB) {

93 for (auto &Op : MI.uses()) {

94 if (Op.isReg())

95 continue;

96 auto it = RAUWBatch.find(Op.getReg());

97 if (it != RAUWBatch.end())

98 Op.setReg(it->second);

99 }

100 }

101 }

102

103 return true;

104}

105

107 return new NVPTXProxyRegErasure();

108}

for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

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

iterator find(const_arg_type_t< KeyT > Val)

std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)

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.

Wrapper class representing virtual and physical registers.

void push_back(const T &Elt)

This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.

This is an optimization pass for GlobalISel generic memory operations.

MachineFunctionPass * createNVPTXProxyRegErasurePass()

Definition NVPTXProxyRegErasure.cpp:106

DWARFExpression::Operation Op