Skip to content

Commit 034cd7c

Browse files
committed
- more fixes
1 parent 3bbea52 commit 034cd7c

File tree

4 files changed

+51
-37
lines changed

4 files changed

+51
-37
lines changed

SwiftCompilerSources/Sources/SIL/ForwardingInstruction.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,8 @@ extension LinearFunctionExtractInst: ForwardingInstruction {
432432
}
433433

434434
extension BorrowedFromInst: ForwardingInstruction {
435+
public var singleForwardedOperand: Operand? { operands[0] }
436+
public var preservesIdentity: Bool { true }
435437
public var preservesRepresentation: Bool { true }
436438
public var canForwardGuaranteedValues: Bool { true }
437439
public var canForwardOwnedValues: Bool { false }

include/swift/SILOptimizer/Utils/BasicBlockOptUtils.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,6 @@ inline bool isUsedOutsideOfBlock(SILValue v) {
102102
return false;
103103
}
104104

105-
/// Rotate a loop's header as long as it is exiting and not equal to the
106-
/// passed basic block.
107-
/// If \p RotateSingleBlockLoops is true a single basic block loop will be
108-
/// rotated once. ShouldVerify specifies whether to perform verification after
109-
/// the transformation.
110-
/// Returns true if the loop could be rotated.
111-
bool rotateLoop(SILLoop *loop, DominanceInfo *domInfo, SILLoopInfo *loopInfo,
112-
bool rotateSingleBlockLoops, SILBasicBlock *upToBB,
113-
bool shouldVerify);
114-
115105
//===----------------------------------------------------------------------===//
116106
// BasicBlock Cloning
117107
//===----------------------------------------------------------------------===//

lib/SILOptimizer/LoopTransforms/LoopRotate.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "swift/SILOptimizer/Utils/BasicBlockOptUtils.h"
2525
#include "swift/SILOptimizer/Utils/CFGOptUtils.h"
2626
#include "swift/SILOptimizer/Utils/LoopUtils.h"
27+
#include "swift/SILOptimizer/Utils/OwnershipOptUtils.h"
2728
#include "swift/SILOptimizer/Utils/SILSSAUpdater.h"
2829
#include "swift/SILOptimizer/Utils/SILInliner.h"
2930

@@ -42,6 +43,10 @@ static llvm::cl::opt<int> LoopRotateSizeLimit("looprotate-size-limit",
4243
static llvm::cl::opt<bool> RotateSingleBlockLoop("looprotate-single-block-loop",
4344
llvm::cl::init(false));
4445

46+
static bool rotateLoop(SILLoop *loop, DominanceInfo *domInfo,
47+
SILLoopInfo *loopInfo, bool rotateSingleBlockLoops,
48+
SILBasicBlock *upToBB, bool shouldVerify);
49+
4550
/// Check whether all operands are loop invariant.
4651
static bool
4752
hasLoopInvariantOperands(SILInstruction *inst, SILLoop *loop,
@@ -307,7 +312,7 @@ static bool isSingleBlockLoop(SILLoop *L) {
307312
///
308313
/// Note: The code relies on the 'UpTo' basic block to stay within the rotate
309314
/// loop for termination.
310-
bool swift::rotateLoop(SILLoop *loop, DominanceInfo *domInfo,
315+
static bool rotateLoop(SILLoop *loop, DominanceInfo *domInfo,
311316
SILLoopInfo *loopInfo, bool rotateSingleBlockLoops,
312317
SILBasicBlock *upToBB, bool shouldVerify) {
313318
assert(loop != nullptr && domInfo != nullptr && loopInfo != nullptr
@@ -507,6 +512,7 @@ class LoopRotation : public SILFunctionTransform {
507512
}
508513

509514
if (changed) {
515+
updateBorrowedFrom(PM, f);
510516
// We preserve loop info and the dominator tree.
511517
domAnalysis->lockInvalidation();
512518
loopAnalysis->lockInvalidation();

test/SILOptimizer/ownership_liveness_unit.sil

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -349,14 +349,14 @@ bb3(%reborrow1 : @guaranteed $C, %reborrow2 : @guaranteed $D):
349349
// CHECK-NEXT: Inner scope: %{{.*}} = argument of bb1 : $D
350350
// CHECK-NEXT: bb0: LiveOut
351351
// CHECK-NEXT: bb1: LiveWithin
352+
// CHECK-NEXT: regular user: %{{.*}} = borrowed %{{.*}} : $D from (%1 : $C)
352353
// CHECK-NEXT: lifetime-ending user: end_borrow %{{.*}} : $C
353354
// CHECK-NEXT: regular user: %{{.*}} = unchecked_ref_cast %{{.*}} : $C to $D
354-
// CHECK-NEXT: regular user: end_borrow %{{.*}} : $D
355355
// CHECK-NEXT: regular user: br bb1(%{{.*}} : $D)
356356
// CHECK-NEXT: Complete liveness
357357
// CHECK-NEXT: Unenclosed phis {
358358
// CHECK-NEXT: }
359-
// CHECK-NEXT: last user: end_borrow %1 : $C // id: %7
359+
// CHECK-NEXT: last user: end_borrow %1 : $C
360360
// CHECK-NEXT: testInteriorDominatedReborrow: interior-liveness with: %borrow1
361361

362362
// CHECK-LABEL: testInteriorDominatedReborrow: interior_liveness_swift with: %borrow1
@@ -365,6 +365,7 @@ bb3(%reborrow1 : @guaranteed $C, %reborrow2 : @guaranteed $D):
365365
// CHECK-NEXT: ends: end_borrow %{{.*}} : $C
366366
// CHECK-NEXT: exits:
367367
// CHECK-NEXT: interiors: end_borrow %{{.*}} : $D
368+
// CHECK-NEXT: %{{.*}} = borrowed %{{.*}} : $D from (%1 : $C)
368369
// CHECK-NEXT: br bb1(%{{.*}} : $D)
369370
// CHECK-NEXT: %{{.*}} = unchecked_ref_cast %{{.*}} : $C to $D
370371
// CHECK-NEXT: Unenclosed phis {
@@ -512,9 +513,10 @@ bb0(%0 : @guaranteed $D, %1 : @owned $C):
512513
// CHECK-NEXT: begin: cond_br undef, bb1, bb2
513514
// CHECK-NEXT: ends: %{{.*}} = load [copy] %{{.*}} : $*C
514515
// CHECK-NEXT: exits:
515-
// CHECK-NEXT: interiors: br bb3(%{{.*}} : $D)
516+
// CHECK-NEXT: interiors: %{{.*}} = ref_element_addr %{{.*}} : $D, #D.object
517+
// CHECK-NEXT: %{{.*}} = borrowed %{{.*}} : $D from (%0 : $C)
518+
// CHECK-NEXT: br bb3(%{{.*}} : $D)
516519
// CHECK-NEXT: %{{.*}} = unchecked_ref_cast %0 : $C to $D
517-
// CHECK-NEXT: %{{.*}} = ref_element_addr %{{.*}} : $D, #D.object
518520
// CHECK-NEXT: br bb3(%{{.*}} : $D)
519521
// CHECK-NEXT: %{{.*}} = unchecked_ref_cast %0 : $C to $D
520522
// CHECK-NEXT: Unenclosed phis {
@@ -591,15 +593,16 @@ bb3(%reborrow : @guaranteed $C, %phi : @guaranteed $D):
591593
// CHECK: Complete liveness
592594
// CHECK: Unenclosed phis {
593595
// CHECK-NEXT: }
594-
// CHECK-NEXT: last user: end_borrow
596+
// CHECK-NEXT: last user: %{{.*}} = borrowed %{{.*}} : $C from (%0 : $C)
595597
// CHECK-NEXT: testInnerDominatedReborrow: interior-liveness with: @argument[0]
596598

597599
// CHECK-LABEL: testInnerDominatedReborrow: interior_liveness_swift with: @argument[0]
598600
// CHECK: Interior liveness: %0 = argument of bb0 : $C
599601
// CHECK-NEXT: begin: %{{.*}} = begin_borrow %0 : $C
600602
// CHECK-NEXT: ends: end_borrow %{{.*}} : $C
601603
// CHECK-NEXT: exits:
602-
// CHECK-NEXT: interiors: br bb1(%{{.*}} : $C)
604+
// CHECK-NEXT: interiors: %{{.*}} = borrowed %{{.*}} : $C from (%0 : $C)
605+
// CHECK-NEXT: br bb1(%{{.*}} : $C)
603606
// CHECK-NEXT: Unenclosed phis {
604607
// CHECK-NEXT: }
605608
// CHECK-NEXT: last user: end_borrow %{{.*}} : $C
@@ -632,6 +635,7 @@ bb1(%reborrow : @guaranteed $C):
632635
// CHECK-NEXT: ends: destroy_value %{{.*}} : $C
633636
// CHECK-NEXT: exits:
634637
// CHECK-NEXT: interiors: end_borrow %{{.*}} : $C
638+
// CHECK-NEXT: %{{.*}} = borrowed %{{.*}} : $C from (%2 : $C, %1 : $C)
635639
// CHECK-NEXT: br bb3(%{{.*}} : $C)
636640
// CHECK-NEXT: Unenclosed phis {
637641
// CHECK-NEXT: }
@@ -709,20 +713,23 @@ bb3(%outer : @guaranteed $D, %inner : @guaranteed $D):
709713
// CHECK: Interior liveness: [[DEF:%.*]] = argument of bb3 : $D
710714
// CHECK: Inner scope: %{{.*}} = argument of bb3 : $D
711715
// CHECK: Inner scope: %{{.*}} = argument of bb4 : $D
712-
// CHECK: regular user: end_borrow
713-
// CHECK-NEXT: regular user: br bb4(
716+
// CHECK: regular user: br bb4(
717+
// CHECK-NEXT: regular user: %{{.*}} = borrowed %{{.*}} : $D from (%0 : $D, %{{.*}} : $D)
718+
// CHECK-NEXT: regular user: %{{.*}} = borrowed %{{.*}} : $D from (%0 : $D, %{{.*}} : $D)
714719
// CHECK-NEXT: Complete liveness
715720
// CHECK-NEXT: Unenclosed phis {
716721
// CHECK-NEXT: }
717-
// CHECK-NEXT: last user: end_borrow
722+
// CHECK-NEXT: last user: %{{.*}} = borrowed %{{.*}} : $D from (%0 : $D, %{{.*}} : $D)
718723
// CHECK-NEXT: testInnerAdjacentReborrow1: interior-liveness with: %outer3
719724

720725
// CHECK-LABEL: testInnerAdjacentReborrow1: interior_liveness_swift with: %outer3
721726
// CHECK: Interior liveness: %{{.*}} = argument of bb3 : $D
722-
// CHECK-NEXT: begin: br bb4(
727+
// CHECK-NEXT: begin: %{{.*}} = borrowed %{{.*}} : $D from (%0 : $D, %{{.*}} : $D)
723728
// CHECK-NEXT: ends: end_borrow
724729
// CHECK-NEXT: exits:
725-
// CHECK-NEXT: interiors: br bb4(
730+
// CHECK-NEXT: interiors: %{{.*}} = borrowed %{{.*}} : $D from (%0 : $D, %{{.*}} : $D)
731+
// CHECK-NEXT: br bb4(
732+
// CHECK-NEXT: %{{.*}} = borrowed %{{.*}} : $D from (%0 : $D, %{{.*}} : $D)
726733
// CHECK-NEXT: Unenclosed phis {
727734
// CHECK-NEXT: }
728735
// CHECK-NEXT: last user: end_borrow
@@ -758,20 +765,23 @@ bb4(%inner4 : @guaranteed $D):
758765
// CHECK: Interior liveness: [[DEF:%.*]] = argument of bb3 : $D
759766
// CHECK: Inner scope: %{{.*}} = argument of bb3 : $D
760767
// CHECK: Inner scope: %{{.*}} = argument of bb4 : $D
761-
// CHECK: regular user: end_borrow
762-
// CHECK-NEXT: regular user: br bb4(
768+
// CHECK: regular user: br bb4(
769+
// CHECK-NEXT: regular user: {{.*}} borrowed {{.*}} from
770+
// CHECK-NEXT: regular user: {{.*}} borrowed {{.*}} from
763771
// CHECK-NEXT: Complete liveness
764772
// CHECK-NEXT: Unenclosed phis {
765773
// CHECK-NEXT: }
766-
// CHECK-NEXT: last user: end_borrow
774+
// CHECK-NEXT: last user: {{.*}} borrowed {{.*}} from
767775
// CHECK-NEXT: testInnerAdjacentReborrow2: interior-liveness with: %outer3
768776

769777
// CHECK-LABEL: testInnerAdjacentReborrow2: interior_liveness_swift with: %outer3
770778
// CHECK: Interior liveness: %{{.*}} = argument of bb3 : $D
771-
// CHECK-NEXT: begin: br bb4(%{{.*}} : $D)
779+
// CHECK-NEXT: begin: {{.*}} borrowed {{.*}} from
772780
// CHECK-NEXT: ends: end_borrow %{{.*}} : $D
773781
// CHECK-NEXT: exits:
774-
// CHECK-NEXT: interiors: br bb4(%{{.*}} : $D)
782+
// CHECK-NEXT: interiors: {{.*}} borrowed {{.*}} from
783+
// CHECK-NEXT: br bb4(%{{.*}} : $D)
784+
// CHECK-NEXT: {{.*}} borrowed {{.*}} from
775785
// CHECK-NEXT: Unenclosed phis {
776786
// CHECK-NEXT: }
777787
// CHECK-NEXT: last user: end_borrow %{{.*}} : $D
@@ -815,7 +825,7 @@ bb4(%inner4 : @guaranteed $D):
815825

816826
// CHECK-LABEL: testInnerNonAdjacentReborrow: interior_liveness_swift with: %outer3
817827
// CHECK: Interior liveness: %{{.*}} = argument of bb3 : $D
818-
// CHECK-NEXT: begin: br bb4(%{{.*}} : $D)
828+
// CHECK-NEXT: begin: {{.*}} borrowed {{.*}} from
819829
// CHECK-NEXT: ends:
820830
// CHECK-NEXT: exits:
821831
// CHECK-NEXT: interiors:
@@ -860,11 +870,14 @@ bb4(%inner4 : @guaranteed $D):
860870

861871
// CHECK-LABEL: testInnerAdjacentPhi1: interior_liveness_swift with: %inner3
862872
// CHECK: Interior liveness: %{{.*}} = argument of bb3 : $C
863-
// CHECK-NEXT: begin: br bb4(%{{.*}} : $D)
873+
// CHECK-NEXT: begin: {{.*}} borrowed {{.*}} from
864874
// CHECK-NEXT: ends: %{{.*}} = load [copy] %{{.*}} : $*C
865875
// CHECK-NEXT: exits:
866-
// CHECK-NEXT: interiors: br bb4(%{{.*}} : $D)
867-
// CHECK-NEXT: %{{.*}} = ref_element_addr %{{.*}} : $D, #D.object
876+
// CHECK-NEXT: interiors: %{{.*}} = ref_element_addr %{{.*}} : $D, #D.object
877+
// CHECK-NEXT: {{.*}} borrowed {{.*}} from
878+
// CHECK-NEXT: br bb4(%{{.*}} : $D)
879+
// CHECK-NEXT: {{.*}} borrowed {{.*}} from
880+
// CHECK-NEXT: {{.*}} borrowed {{.*}} from
868881
// CHECK-NEXT: Unenclosed phis {
869882
// CHECK-NEXT: }
870883
// CHECK-NEXT: last user: %{{.*}} = load [copy] %{{.*}} : $*C
@@ -907,11 +920,14 @@ bb4(%phi4 : @guaranteed $D):
907920

908921
// CHECK-LABEL: testInnerAdjacentPhi2: interior_liveness_swift with: %inner3
909922
// CHECK: Interior liveness: %{{.*}} = argument of bb3 : $C
910-
// CHECK-NEXT: begin: br bb4(%{{.*}} : $D)
923+
// CHECK-NEXT: begin: {{.*}} borrowed {{.*}} from
911924
// CHECK-NEXT: ends: %{{.*}} = load [copy] %{{.*}} : $*C
912925
// CHECK-NEXT: exits:
913-
// CHECK-NEXT: interiors: br bb4(%{{.*}} : $D)
914-
// CHECK-NEXT: %{{.*}} = ref_element_addr %{{.*}} : $D, #D.object
926+
// CHECK-NEXT: interiors: %{{.*}} = ref_element_addr %{{.*}} : $D, #D.object
927+
// CHECK-NEXT: {{.*}} borrowed {{.*}} from
928+
// CHECK-NEXT: br bb4(%{{.*}} : $D)
929+
// CHECK-NEXT: {{.*}} borrowed {{.*}} from
930+
// CHECK-NEXT: {{.*}} borrowed {{.*}} from
915931
// CHECK-NEXT: Unenclosed phis {
916932
// CHECK-NEXT: }
917933
// CHECK-NEXT: last user: %{{.*}} = load [copy] %{{.*}} : $*C
@@ -949,18 +965,18 @@ bb4(%phi4 : @guaranteed $D):
949965
// CHECK: Complete liveness
950966
// CHECK: Unenclosed phis {
951967
// CHECK-NEXT: }
952-
// CHECK-NEXT: dead def: [[DEF]] = argument of bb3 : $C
968+
// CHECK-NEXT: last user: {{.*}} borrowed {{.*}} from
953969
// CHECK-NEXT: testInnerNonAdjacentPhi: interior-liveness with: %inner3
954970

955971
// CHECK-LABEL: testInnerNonAdjacentPhi: interior_liveness_swift with: %inner3
956972
// CHECK: Interior liveness: %{{.*}} = argument of bb3 : $C
957-
// CHECK-NEXT: begin: br bb4(%{{.*}} : $D)
973+
// CHECK-NEXT: begin: {{.*}} borrowed {{.*}} from
958974
// CHECK-NEXT: ends:
959975
// CHECK-NEXT: exits:
960976
// CHECK-NEXT: interiors:
961977
// CHECK-NEXT: Unenclosed phis {
962978
// CHECK-NEXT: }
963-
// CHECK-NEXT: dead def: %{{.*}} = argument of bb3 : $C
979+
// CHECK-NEXT: last user: {{.*}} borrowed {{.*}} from
964980
// CHECK-NEXT: testInnerNonAdjacentPhi: interior_liveness_swift with: %inner3
965981
sil [ossa] @testInnerNonAdjacentPhi : $@convention(thin) (@guaranteed C) -> () {
966982
bb0(%0 : @guaranteed $C):

0 commit comments

Comments
 (0)