@@ -74,21 +74,22 @@ TermInst *swift::addNewEdgeValueToBranch(TermInst *branch, SILBasicBlock *dest,
74
74
return newBr;
75
75
}
76
76
77
- static void
78
- deleteTriviallyDeadOperandsOfDeadArgument ( MutableArrayRef<Operand> termOperands,
79
- unsigned deadArgIndex ) {
77
+ static void deleteTriviallyDeadOperandsOfDeadArgument (
78
+ MutableArrayRef<Operand> termOperands, unsigned deadArgIndex ,
79
+ InstModCallbacks callbacks = InstModCallbacks() ) {
80
80
Operand &op = termOperands[deadArgIndex];
81
81
auto *i = op.get ()->getDefiningInstruction ();
82
82
if (!i)
83
83
return ;
84
84
op.set (SILUndef::get (op.get ()->getType (), *i->getFunction ()));
85
- eliminateDeadInstruction (i);
85
+ eliminateDeadInstruction (i, callbacks );
86
86
}
87
87
88
88
// Our implementation assumes that our caller is attempting to remove a dead
89
89
// SILPhiArgument from a SILBasicBlock and has already RAUWed the argument.
90
90
TermInst *swift::deleteEdgeValue (TermInst *branch, SILBasicBlock *destBlock,
91
- size_t argIndex, bool cleanupDeadPhiOps) {
91
+ size_t argIndex, bool cleanupDeadPhiOps,
92
+ InstModCallbacks callbacks) {
92
93
if (auto *cbi = dyn_cast<CondBranchInst>(branch)) {
93
94
SmallVector<SILValue, 8 > trueArgs;
94
95
SmallVector<SILValue, 8 > falseArgs;
@@ -99,15 +100,15 @@ TermInst *swift::deleteEdgeValue(TermInst *branch, SILBasicBlock *destBlock,
99
100
if (destBlock == cbi->getTrueBB ()) {
100
101
if (cleanupDeadPhiOps) {
101
102
deleteTriviallyDeadOperandsOfDeadArgument (cbi->getTrueOperands (),
102
- argIndex);
103
+ argIndex, callbacks );
103
104
}
104
105
trueArgs.erase (trueArgs.begin () + argIndex);
105
106
}
106
107
107
108
if (destBlock == cbi->getFalseBB ()) {
108
109
if (cleanupDeadPhiOps) {
109
110
deleteTriviallyDeadOperandsOfDeadArgument (cbi->getFalseOperands (),
110
- argIndex);
111
+ argIndex, callbacks );
111
112
}
112
113
falseArgs.erase (falseArgs.begin () + argIndex);
113
114
}
@@ -125,7 +126,8 @@ TermInst *swift::deleteEdgeValue(TermInst *branch, SILBasicBlock *destBlock,
125
126
SmallVector<SILValue, 8 > args;
126
127
llvm::copy (bi->getArgs (), std::back_inserter (args));
127
128
if (cleanupDeadPhiOps) {
128
- deleteTriviallyDeadOperandsOfDeadArgument (bi->getAllOperands (), argIndex);
129
+ deleteTriviallyDeadOperandsOfDeadArgument (bi->getAllOperands (), argIndex,
130
+ callbacks);
129
131
}
130
132
args.erase (args.begin () + argIndex);
131
133
auto *result = SILBuilderWithScope (bi).createBranch (bi->getLoc (),
@@ -138,7 +140,8 @@ TermInst *swift::deleteEdgeValue(TermInst *branch, SILBasicBlock *destBlock,
138
140
}
139
141
140
142
void swift::erasePhiArgument (SILBasicBlock *block, unsigned argIndex,
141
- bool cleanupDeadPhiOps) {
143
+ bool cleanupDeadPhiOps,
144
+ InstModCallbacks callbacks) {
142
145
assert (block->getArgument (argIndex)->isPhi ()
143
146
&& " Only should be used on phi arguments" );
144
147
block->eraseArgument (argIndex);
@@ -155,7 +158,8 @@ void swift::erasePhiArgument(SILBasicBlock *block, unsigned argIndex,
155
158
predBlocks.insert (pred);
156
159
157
160
for (auto *pred : predBlocks)
158
- deleteEdgeValue (pred->getTerminator (), block, argIndex, cleanupDeadPhiOps);
161
+ deleteEdgeValue (pred->getTerminator (), block, argIndex, cleanupDeadPhiOps,
162
+ callbacks);
159
163
}
160
164
161
165
// / Changes the edge value between a branch and destination basic block
0 commit comments