@@ -88,7 +88,7 @@ deleteTriviallyDeadOperandsOfDeadArgument(MutableArrayRef<Operand> termOperands,
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) {
91
+ size_t argIndex, bool cleanupDeadPhiOps ) {
92
92
if (auto *cbi = dyn_cast<CondBranchInst>(branch)) {
93
93
SmallVector<SILValue, 8 > trueArgs;
94
94
SmallVector<SILValue, 8 > falseArgs;
@@ -97,14 +97,18 @@ TermInst *swift::deleteEdgeValue(TermInst *branch, SILBasicBlock *destBlock,
97
97
llvm::copy (cbi->getFalseArgs (), std::back_inserter (falseArgs));
98
98
99
99
if (destBlock == cbi->getTrueBB ()) {
100
- deleteTriviallyDeadOperandsOfDeadArgument (cbi->getTrueOperands (),
101
- argIndex);
100
+ if (cleanupDeadPhiOps) {
101
+ deleteTriviallyDeadOperandsOfDeadArgument (cbi->getTrueOperands (),
102
+ argIndex);
103
+ }
102
104
trueArgs.erase (trueArgs.begin () + argIndex);
103
105
}
104
106
105
107
if (destBlock == cbi->getFalseBB ()) {
106
- deleteTriviallyDeadOperandsOfDeadArgument (cbi->getFalseOperands (),
107
- argIndex);
108
+ if (cleanupDeadPhiOps) {
109
+ deleteTriviallyDeadOperandsOfDeadArgument (cbi->getFalseOperands (),
110
+ argIndex);
111
+ }
108
112
falseArgs.erase (falseArgs.begin () + argIndex);
109
113
}
110
114
@@ -120,8 +124,9 @@ TermInst *swift::deleteEdgeValue(TermInst *branch, SILBasicBlock *destBlock,
120
124
if (auto *bi = dyn_cast<BranchInst>(branch)) {
121
125
SmallVector<SILValue, 8 > args;
122
126
llvm::copy (bi->getArgs (), std::back_inserter (args));
123
-
124
- deleteTriviallyDeadOperandsOfDeadArgument (bi->getAllOperands (), argIndex);
127
+ if (cleanupDeadPhiOps) {
128
+ deleteTriviallyDeadOperandsOfDeadArgument (bi->getAllOperands (), argIndex);
129
+ }
125
130
args.erase (args.begin () + argIndex);
126
131
auto *result = SILBuilderWithScope (bi).createBranch (bi->getLoc (),
127
132
bi->getDestBB (), args);
@@ -132,7 +137,8 @@ TermInst *swift::deleteEdgeValue(TermInst *branch, SILBasicBlock *destBlock,
132
137
llvm_unreachable (" unsupported terminator" );
133
138
}
134
139
135
- void swift::erasePhiArgument (SILBasicBlock *block, unsigned argIndex) {
140
+ void swift::erasePhiArgument (SILBasicBlock *block, unsigned argIndex,
141
+ bool cleanupDeadPhiOps) {
136
142
assert (block->getArgument (argIndex)->isPhi ()
137
143
&& " Only should be used on phi arguments" );
138
144
block->eraseArgument (argIndex);
@@ -149,7 +155,7 @@ void swift::erasePhiArgument(SILBasicBlock *block, unsigned argIndex) {
149
155
predBlocks.insert (pred);
150
156
151
157
for (auto *pred : predBlocks)
152
- deleteEdgeValue (pred->getTerminator (), block, argIndex);
158
+ deleteEdgeValue (pred->getTerminator (), block, argIndex, cleanupDeadPhiOps );
153
159
}
154
160
155
161
// / Changes the edge value between a branch and destination basic block
0 commit comments