@@ -95,7 +95,7 @@ static SILBasicBlock *getNthEdgeBlock(SwitchInstTy *S, unsigned edgeIdx) {
95
95
return S->getCase (edgeIdx).second ;
96
96
}
97
97
98
- void swift::getEdgeArgs (TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
98
+ void swift::getEdgeArgs (TermInst *T, unsigned edgeIdx,
99
99
llvm::SmallVectorImpl<SILValue> &args) {
100
100
switch (T->getKind ()) {
101
101
case SILInstructionKind::BranchInst: {
@@ -131,8 +131,7 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
131
131
assert (succBB->getNumArguments () < 2 && " Can take at most one argument" );
132
132
if (!succBB->getNumArguments ())
133
133
return ;
134
- args.push_back (newEdgeBB->createPhiArgument (
135
- succBB->getArgument (0 )->getType (), ValueOwnershipKind::Owned));
134
+ args.push_back (succBB->getArgument (0 ));
136
135
return ;
137
136
}
138
137
@@ -143,8 +142,7 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
143
142
(edgeIdx == 0 ) ? DMBI->getHasMethodBB () : DMBI->getNoMethodBB ();
144
143
if (!succBB->getNumArguments ())
145
144
return ;
146
- args.push_back (newEdgeBB->createPhiArgument (
147
- succBB->getArgument (0 )->getType (), ValueOwnershipKind::Owned));
145
+ args.push_back (succBB->getArgument (0 ));
148
146
return ;
149
147
}
150
148
@@ -154,26 +152,23 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
154
152
auto succBB = edgeIdx == 0 ? CBI->getSuccessBB () : CBI->getFailureBB ();
155
153
if (!succBB->getNumArguments ())
156
154
return ;
157
- args.push_back (newEdgeBB->createPhiArgument (
158
- succBB->getArgument (0 )->getType (), ValueOwnershipKind::Owned));
155
+ args.push_back (succBB->getArgument (0 ));
159
156
return ;
160
157
}
161
158
case SILInstructionKind::CheckedCastAddrBranchInst: {
162
159
auto CBI = cast<CheckedCastAddrBranchInst>(T);
163
160
auto succBB = edgeIdx == 0 ? CBI->getSuccessBB () : CBI->getFailureBB ();
164
161
if (!succBB->getNumArguments ())
165
162
return ;
166
- args.push_back (newEdgeBB->createPhiArgument (
167
- succBB->getArgument (0 )->getType (), ValueOwnershipKind::Owned));
163
+ args.push_back (succBB->getArgument (0 ));
168
164
return ;
169
165
}
170
166
case SILInstructionKind::CheckedCastValueBranchInst: {
171
167
auto CBI = cast<CheckedCastValueBranchInst>(T);
172
168
auto succBB = edgeIdx == 0 ? CBI->getSuccessBB () : CBI->getFailureBB ();
173
169
if (!succBB->getNumArguments ())
174
170
return ;
175
- args.push_back (newEdgeBB->createPhiArgument (
176
- succBB->getArgument (0 )->getType (), ValueOwnershipKind::Owned));
171
+ args.push_back (succBB->getArgument (0 ));
177
172
return ;
178
173
}
179
174
@@ -182,8 +177,7 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
182
177
auto *succBB = edgeIdx == 0 ? TAI->getNormalBB () : TAI->getErrorBB ();
183
178
if (!succBB->getNumArguments ())
184
179
return ;
185
- args.push_back (newEdgeBB->createPhiArgument (
186
- succBB->getArgument (0 )->getType (), ValueOwnershipKind::Owned));
180
+ args.push_back (succBB->getArgument (0 ));
187
181
return ;
188
182
}
189
183
@@ -215,8 +209,15 @@ SILBasicBlock *swift::splitEdge(TermInst *T, unsigned edgeIdx,
215
209
// Create a new basic block in the edge, and insert it after the srcBB.
216
210
auto *edgeBB = F->createBasicBlockAfter (srcBB);
217
211
212
+ SmallVector<SILValue, 16 > oldArgs;
213
+ getEdgeArgs (T, edgeIdx, oldArgs);
214
+
218
215
SmallVector<SILValue, 16 > args;
219
- getEdgeArgs (T, edgeIdx, edgeBB, args);
216
+ // create new SILPHIArguments, args are already sorted, go front to back:
217
+ for (auto arg : oldArgs) {
218
+ args.push_back (
219
+ edgeBB->createPhiArgument (arg->getType (), ValueOwnershipKind::Owned));
220
+ }
220
221
221
222
SILBuilder (edgeBB).createBranch (T->getLoc (), destBB, args);
222
223
0 commit comments