Skip to content

Commit c7d6790

Browse files
author
Joe Shajrawi
committed
---
yaml --- r: 276447 b: "refs/heads/split_edge_%1" c: e7d5e87 h: refs/heads/master i: 276445: e7880f6 276443: cef1d3b 276439: 47d53e1 276431: 50bfa36 276415: 4ca5358
1 parent e3a3d76 commit c7d6790

File tree

4 files changed

+97
-18
lines changed

4 files changed

+97
-18
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1280,4 +1280,4 @@ refs/heads/revert-23076-48509051: 70350478681ae06e70cd1358df9890485ff0e950
12801280
refs/heads/revert-23143-pr-10e754de40df648f53cb2f7089dbac068d2af1bb: 940e71020e5283559bef9918400c586361c29913
12811281
refs/heads/revert-23194-simplify-add-overload-set: 926a3f03c6b5e217bb9e67a377eebe4fbc1adf54
12821282
refs/heads/shahmishal-patch-2: 7918a764f8612dc45946947509216a35394fbb66
1283-
"refs/heads/split_edge_%1": 392917c3acb0a02382990c7198338a97a82e964f
1283+
"refs/heads/split_edge_%1": e7d5e871fb8d559768d60ebc6e3cb584001197cb

branches/split_edge_%1/include/swift/SIL/BasicBlockUtils.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,8 @@ class SILLoopInfo;
3434
void changeBranchTarget(TermInst *T, unsigned edgeIdx, SILBasicBlock *newDest,
3535
bool preserveArgs);
3636

37-
/// Returns the arguments values on the specified CFG edge. If necessary, may
38-
/// add create new SILPHIArguments, using `NewEdgeBB` as the placeholder.
39-
void getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
37+
/// Returns the arguments values on the specified CFG edge.
38+
void getEdgeArgs(TermInst *T, unsigned edgeIdx,
4039
llvm::SmallVectorImpl<SILValue> &args);
4140

4241
/// Splits the edge from terminator.

branches/split_edge_%1/lib/SIL/BasicBlockUtils.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ static SILBasicBlock *getNthEdgeBlock(SwitchInstTy *S, unsigned edgeIdx) {
9595
return S->getCase(edgeIdx).second;
9696
}
9797

98-
void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
98+
void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx,
9999
llvm::SmallVectorImpl<SILValue> &args) {
100100
switch (T->getKind()) {
101101
case SILInstructionKind::BranchInst: {
@@ -131,8 +131,7 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
131131
assert(succBB->getNumArguments() < 2 && "Can take at most one argument");
132132
if (!succBB->getNumArguments())
133133
return;
134-
args.push_back(newEdgeBB->createPhiArgument(
135-
succBB->getArgument(0)->getType(), ValueOwnershipKind::Owned));
134+
args.push_back(succBB->getArgument(0));
136135
return;
137136
}
138137

@@ -143,8 +142,7 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
143142
(edgeIdx == 0) ? DMBI->getHasMethodBB() : DMBI->getNoMethodBB();
144143
if (!succBB->getNumArguments())
145144
return;
146-
args.push_back(newEdgeBB->createPhiArgument(
147-
succBB->getArgument(0)->getType(), ValueOwnershipKind::Owned));
145+
args.push_back(succBB->getArgument(0));
148146
return;
149147
}
150148

@@ -154,26 +152,23 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
154152
auto succBB = edgeIdx == 0 ? CBI->getSuccessBB() : CBI->getFailureBB();
155153
if (!succBB->getNumArguments())
156154
return;
157-
args.push_back(newEdgeBB->createPhiArgument(
158-
succBB->getArgument(0)->getType(), ValueOwnershipKind::Owned));
155+
args.push_back(succBB->getArgument(0));
159156
return;
160157
}
161158
case SILInstructionKind::CheckedCastAddrBranchInst: {
162159
auto CBI = cast<CheckedCastAddrBranchInst>(T);
163160
auto succBB = edgeIdx == 0 ? CBI->getSuccessBB() : CBI->getFailureBB();
164161
if (!succBB->getNumArguments())
165162
return;
166-
args.push_back(newEdgeBB->createPhiArgument(
167-
succBB->getArgument(0)->getType(), ValueOwnershipKind::Owned));
163+
args.push_back(succBB->getArgument(0));
168164
return;
169165
}
170166
case SILInstructionKind::CheckedCastValueBranchInst: {
171167
auto CBI = cast<CheckedCastValueBranchInst>(T);
172168
auto succBB = edgeIdx == 0 ? CBI->getSuccessBB() : CBI->getFailureBB();
173169
if (!succBB->getNumArguments())
174170
return;
175-
args.push_back(newEdgeBB->createPhiArgument(
176-
succBB->getArgument(0)->getType(), ValueOwnershipKind::Owned));
171+
args.push_back(succBB->getArgument(0));
177172
return;
178173
}
179174

@@ -182,8 +177,7 @@ void swift::getEdgeArgs(TermInst *T, unsigned edgeIdx, SILBasicBlock *newEdgeBB,
182177
auto *succBB = edgeIdx == 0 ? TAI->getNormalBB() : TAI->getErrorBB();
183178
if (!succBB->getNumArguments())
184179
return;
185-
args.push_back(newEdgeBB->createPhiArgument(
186-
succBB->getArgument(0)->getType(), ValueOwnershipKind::Owned));
180+
args.push_back(succBB->getArgument(0));
187181
return;
188182
}
189183

@@ -215,8 +209,15 @@ SILBasicBlock *swift::splitEdge(TermInst *T, unsigned edgeIdx,
215209
// Create a new basic block in the edge, and insert it after the srcBB.
216210
auto *edgeBB = F->createBasicBlockAfter(srcBB);
217211

212+
SmallVector<SILValue, 16> oldArgs;
213+
getEdgeArgs(T, edgeIdx, oldArgs);
214+
218215
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+
}
220221

221222
SILBuilder(edgeBB).createBranch(T->getLoc(), destBB, args);
222223

branches/split_edge_%1/test/SILOptimizer/stack_promotion.sil

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,3 +741,82 @@ bb0(%0 : $Int, %another: $Array<Int>):
741741
%24 = tuple ()
742742
return %24 : $()
743743
}
744+
745+
746+
// CHECK-LABEL: sil @promote_with_unreachable_block_nest_bug
747+
// CHECK: bb3:
748+
// CHECK: dealloc_ref [stack] %{{.*}}
749+
// CHECK: bb4:
750+
// CHECK: br bb5(%{{.*}} : $Int32)
751+
// CHECK: bb5(%{{.*}} : $Int32):
752+
// CHECK: dealloc_ref [stack] %{{.*}}
753+
// CHECK: bb6:
754+
// CHECK: dealloc_ref [stack] %{{.*}}
755+
// CHECK: bb11:
756+
// CHECK: alloc_ref [stack] $XX
757+
// CHECK: return
758+
sil @promote_with_unreachable_block_nest_bug : $@convention(thin) () -> Int32 {
759+
bb0:
760+
%0 = alloc_stack $Builtin.Int32 // user: %30
761+
%1 = alloc_stack $Builtin.Int32 // users: %29, %27
762+
cond_br undef, bb1, bb7 // id: %2
763+
764+
bb1: // Preds: bb0
765+
br bb14 // id: %3
766+
767+
bb2: // Preds: bb10
768+
cond_br undef, bb5, bb3 // id: %4
769+
770+
bb3: // Preds: bb2
771+
strong_release %20 : $XX // id: %5
772+
br bb6 // id: %6
773+
774+
bb4: // Preds: bb10
775+
%7 = integer_literal $Builtin.Int32, 0 // user: %8
776+
%8 = struct $Int32 (%7 : $Builtin.Int32) // user: %9
777+
br bb13(%8 : $Int32) // id: %9
778+
779+
bb5: // Preds: bb2
780+
strong_release %20 : $XX // id: %10
781+
br bb6 // id: %11
782+
783+
bb6: // Preds: bb5 bb3
784+
br bb12 // id: %12
785+
786+
bb7: // Preds: bb0
787+
cond_br undef, bb8, bb9 // id: %13
788+
789+
bb8: // Preds: bb7
790+
cond_br undef, bb10, bb11 // id: %14
791+
792+
bb9: // Preds: bb7
793+
%15 = integer_literal $Builtin.Int32, 0 // user: %16
794+
%16 = struct $Int32 (%15 : $Builtin.Int32) // user: %17
795+
br bb13(%16 : $Int32) // id: %17
796+
797+
bb10: // Preds: bb8
798+
%18 = alloc_ref $XX // user: %20
799+
// function_ref xx_init
800+
%19 = function_ref @xx_init : $@convention(thin) (@guaranteed XX) -> XX // user: %20
801+
%20 = apply %19(%18) : $@convention(thin) (@guaranteed XX) -> XX // users: %21, %5, %10
802+
%21 = ref_element_addr %20 : $XX, #XX.x // user: %22
803+
%22 = load %21 : $*Int32
804+
cond_br undef, bb2, bb4 // id: %23
805+
806+
bb11: // Preds: bb8
807+
unreachable // id: %24
808+
809+
bb12: // Preds: bb6
810+
br bb14 // id: %25
811+
812+
bb13(%26 : $Int32): // Preds: bb9 bb4
813+
dealloc_stack %1 : $*Builtin.Int32 // id: %27
814+
unreachable // id: %28
815+
816+
bb14: // Preds: bb12 bb1
817+
dealloc_stack %1 : $*Builtin.Int32 // id: %29
818+
dealloc_stack %0 : $*Builtin.Int32 // id: %30
819+
%31 = integer_literal $Builtin.Int32, 0 // user: %32
820+
%32 = struct $Int32 (%31 : $Builtin.Int32) // user: %33
821+
return %32 : $Int32 // id: %33
822+
} // end sil function 'promote_with_unreachable_block_nest_bug'

0 commit comments

Comments
 (0)