Commit Graph

8 Commits

Author SHA1 Message Date
Erik Eckstein
6d533e8913 DestroyHoisting: correctly detect if debug_value_addr instructions need to be deleted.
https://bugs.swift.org/browse/SR-12355
rdar://problem/60832805
2020-03-31 17:34:56 +02:00
Erik Eckstein
15f519f544 DestroyHoisting: fix a bug which creates invalid SIL
A dominance check was missing.
2020-03-24 15:07:37 +01:00
Erik Eckstein
bb38711894 DestoyHoisting: handle infinite loops correctly
Ignore blocks in infinite loops and don't insert destroys where they don't belong.

Fixes an ownership verifier crash.
2019-11-20 11:16:05 +01:00
Michael Gottesman
a02fca16e2 [ownership] Add a frontend option -disable-ossa-opts to disable ossa based opts for benchmarking purposes. 2019-11-12 10:12:45 -08:00
Erik Eckstein
b5af722d44 DestroyHoisting: support of abort_apply instruction.
This was missing from the previous commit.
2019-10-30 15:12:23 +01:00
Erik Eckstein
fbd41f7f66 DestroyHoisting: support of begin_apply and end_apply instructions
This enables destroy hoisting when accessor co-routines are not yet inlined.

https://bugs.swift.org/browse/SR-11675
rdar://problem/56704059
2019-10-29 15:43:48 +01:00
Andrew Trick
bddc69c8a6 Organize SILOptimizer/Utils headers. Remove Local.h.
The XXOptUtils.h convention is already established and parallels
the SIL/XXUtils convention.

New:
- InstOptUtils.h
- CFGOptUtils.h
- BasicBlockOptUtils.h
- ValueLifetime.h

Removed:
- Local.h
- Two conflicting CFG.h files

This reorganization is helpful before I introduce more
utilities for block cloning similar to SinkAddressProjections.

Move the control flow utilies out of Local.h, which was an
unreadable, unprincipled mess. Rename it to InstOptUtils.h, and
confine it to small APIs for working with individual instructions.
These are the optimizer's additions to /SIL/InstUtils.h.

Rename CFG.h to CFGOptUtils.h and remove the one in /Analysis. Now
there is only SIL/CFG.h, resolving the naming conflict within the
swift project (this has always been a problem for source tools). Limit
this header to low-level APIs for working with branches and CFG edges.

Add BasicBlockOptUtils.h for block level transforms (it makes me sad
that I can't use BBOptUtils.h, but SIL already has
BasicBlockUtils.h). These are larger APIs for cloning or removing
whole blocks.
2019-10-02 11:34:54 -07:00
Erik Eckstein
0e08976600 SILOptimizer: a new optimization to hoist destroys of memory locations
DestroyHoisting moves destroys of memory locations up the control flow as far as possible.
Beside destroy_addr, also "store [assign]" is considered a destroy, because is is equivalent to an destroy_addr + a "store [init]".
The main purpose of this optimization is to minimize copy-on-write operations for arrays, etc. Especially if such COW containers  are used as enum payloads and modified in-place. E.g.

switch e {
  case .A(var arr):
    arr.append(x)
    self = .A(arr)
...

In such a case DestroyHoisting can move the destroy of the self-assignment up before the switch and thus let the array buffer only be single-referenced at the time of the append.

When we have ownership SIL throughout the pass pipeline this optimization will replace the current destroy hoisting optimization in CopyForwarding.
For now, this optimization only runs in the mandatory pipeline (but not for -Onone) where we already have ownership SIL.

SR-10605
rdar://problem/50463362
2019-08-28 15:40:05 +02:00