File tree Expand file tree Collapse file tree 2 files changed +36
-0
lines changed
lib/SILOptimizer/Transforms Expand file tree Collapse file tree 2 files changed +36
-0
lines changed Original file line number Diff line number Diff line change @@ -547,9 +547,13 @@ void TempRValueOptPass::tryOptimizeCopyIntoTemp(CopyAddrInst *copyInst) {
547
547
// only users that modify memory are the copy_addr [initialization] and
548
548
// destroy_addr.
549
549
InstructionSetWithSize loadInsts (getFunction ());
550
+ // Set of tempObj users
551
+ InstructionSet userSet (getFunction ());
550
552
for (auto *useOper : tempObj->getUses ()) {
551
553
SILInstruction *user = useOper->getUser ();
552
554
555
+ userSet.insert (user);
556
+
553
557
if (user == copyInst)
554
558
continue ;
555
559
@@ -576,6 +580,20 @@ void TempRValueOptPass::tryOptimizeCopyIntoTemp(CopyAddrInst *copyInst) {
576
580
return ;
577
581
}
578
582
583
+ // Check and return without optimization if we have any users of tempObj that
584
+ // precede the copyInst.
585
+ // This can happen with projections.
586
+ // TODO: We can enable this case if we clone the projections at "load" uses
587
+
588
+ // All instructions in userSet are in the same block as copyInst. collectLoads
589
+ // ensures of this.
590
+ for (SILInstruction &inst : llvm::make_range (copyInst->getParent ()->begin (),
591
+ copyInst->getIterator ())) {
592
+ if (userSet.contains (&inst)) {
593
+ return ;
594
+ }
595
+ }
596
+
579
597
AliasAnalysis *aa = getPassManager ()->getAnalysis <AliasAnalysis>(getFunction ());
580
598
581
599
// Check if the source is modified within the lifetime of the temporary.
Original file line number Diff line number Diff line change @@ -1847,3 +1847,21 @@ bb0:
1847
1847
dealloc_stack %src : $*MOS
1848
1848
return %instance_3 : $MOS
1849
1849
}
1850
+
1851
+ // CHECK-LABEL: sil [ossa] @dont_optimize_use_before_copy :
1852
+ // CHECK: copy_addr
1853
+ // CHECK-LABEL: } // end sil function 'dont_optimize_use_before_copy'
1854
+ sil [ossa] @dont_optimize_use_before_copy : $@convention(thin) <B> (@in_guaranteed GS<B>, @inout GS<B>) -> () {
1855
+ bb0(%0 : $*GS<B>, %1 : $*GS<B>):
1856
+ %2 = alloc_stack $GS<B>
1857
+ %3 = struct_element_addr %2 : $*GS<B>, #GS._value
1858
+ copy_addr %1 to [init] %2 : $*GS<B>
1859
+ %5 = load [trivial] %3 : $*Builtin.Int64
1860
+ %6 = builtin "cmp_slt_Int64"(%5 : $Builtin.Int64, %5 : $Builtin.Int64) : $Builtin.Int1
1861
+ copy_addr %2 to %1 : $*GS<B>
1862
+ destroy_addr %2 : $*GS<B>
1863
+ dealloc_stack %2 : $*GS<B>
1864
+ %10 = tuple ()
1865
+ return %10 : $()
1866
+ }
1867
+
You can’t perform that action at this time.
0 commit comments