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 @@ -546,9 +546,13 @@ void TempRValueOptPass::tryOptimizeCopyIntoTemp(CopyAddrInst *copyInst) {
546
546
// only users that modify memory are the copy_addr [initialization] and
547
547
// destroy_addr.
548
548
InstructionSetWithSize loadInsts (getFunction ());
549
+ // Set of tempObj users
550
+ InstructionSet userSet (getFunction ());
549
551
for (auto *useOper : tempObj->getUses ()) {
550
552
SILInstruction *user = useOper->getUser ();
551
553
554
+ userSet.insert (user);
555
+
552
556
if (user == copyInst)
553
557
continue ;
554
558
@@ -575,6 +579,20 @@ void TempRValueOptPass::tryOptimizeCopyIntoTemp(CopyAddrInst *copyInst) {
575
579
return ;
576
580
}
577
581
582
+ // Check and return without optimization if we have any users of tempObj that
583
+ // precede the copyInst.
584
+ // This can happen with projections.
585
+ // TODO: We can enable this case if we clone the projections at "load" uses
586
+
587
+ // All instructions in userSet are in the same block as copyInst. collectLoads
588
+ // ensures of this.
589
+ for (SILInstruction &inst : llvm::make_range (copyInst->getParent ()->begin (),
590
+ copyInst->getIterator ())) {
591
+ if (userSet.contains (&inst)) {
592
+ return ;
593
+ }
594
+ }
595
+
578
596
AliasAnalysis *aa = getPassManager ()->getAnalysis <AliasAnalysis>(getFunction ());
579
597
580
598
// Check if the source is modified within the lifetime of the temporary.
Original file line number Diff line number Diff line change @@ -1821,3 +1821,21 @@ bb0:
1821
1821
dealloc_stack %src : $*MOS
1822
1822
return %instance_3 : $MOS
1823
1823
}
1824
+
1825
+ // CHECK-LABEL: sil [ossa] @dont_optimize_use_before_copy :
1826
+ // CHECK: copy_addr
1827
+ // CHECK-LABEL: } // end sil function 'dont_optimize_use_before_copy'
1828
+ sil [ossa] @dont_optimize_use_before_copy : $@convention(thin) <B> (@in_guaranteed GS<B>, @inout GS<B>) -> () {
1829
+ bb0(%0 : $*GS<B>, %1 : $*GS<B>):
1830
+ %2 = alloc_stack $GS<B>
1831
+ %3 = struct_element_addr %2 : $*GS<B>, #GS._value
1832
+ copy_addr %1 to [init] %2 : $*GS<B>
1833
+ %5 = load [trivial] %3 : $*Builtin.Int64
1834
+ %6 = builtin "cmp_slt_Int64"(%5 : $Builtin.Int64, %5 : $Builtin.Int64) : $Builtin.Int1
1835
+ copy_addr %2 to %1 : $*GS<B>
1836
+ destroy_addr %2 : $*GS<B>
1837
+ dealloc_stack %2 : $*GS<B>
1838
+ %10 = tuple ()
1839
+ return %10 : $()
1840
+ }
1841
+
You can’t perform that action at this time.
0 commit comments