Commit Graph

2592 Commits

Author SHA1 Message Date
Michael Gottesman
6c255734ba [simplify-cfg] Enable remove unreachable blocks to shrink the CFG a bit. 2021-02-12 23:20:17 -08:00
Erik Eckstein
214b7a9929 Use the new BasicBlockWorklist utility in various places in the compiler.
It's a refactoring which simplifies the code.
NFC.
2021-02-12 11:15:55 +01:00
Erik Eckstein
fe10f98cf0 SIL: rename the SILBitfield.h header file to BasicBlockBits.h
NFC
2021-02-12 11:15:55 +01:00
Meghana Gupta
319e9e0140 Merge pull request #35840 from meg-gupta/fixrpe
Fix redundant phi elimination for OSSA
2021-02-10 13:26:56 -08:00
Meghana Gupta
b9ac9a867c Fix redundant phi elimination for OSSA
In the common case, we cannot have redundant @owned and @guaranteed phi
args. However, if the incoming values had none ownership and were passed
as an @owned or an @guaranteed phi arg, they can be considered as redundant.

For such redundant @owned phi args, create a copy value, and use the
copy to replace all uses of the redundant phi arg.

For such redundant @guaranteed phi args, we turn off the optimization
currently. We cannot just create a borrow scope and use the new borrowed
value for replacement. We will also have to re-write the consuming uses of
the @guaranteed values such that the newly created borrow scope is
within the scope of its operand.
2021-02-09 12:09:53 -08:00
Erik Eckstein
542a378436 SIL: add FunctionRefInst::getReferencedFunction()
If we know that we have a FunctionRefInst (and not another variant of FunctionRefBaseInst), we know that getting the referenced function will not be null (in contrast to FunctionRefBaseInst::getReferencedFunctionOrNull).

NFC
2021-02-09 19:56:43 +01:00
Varun Gandhi
caf1a55eea Merge pull request #35229 from mininny/switch-find-to-contains
[NFC] Replace uses of find(x) != end() idiom with contains(x) for StringRef and Set-like types
2021-02-08 13:57:43 -08:00
Meghana Gupta
aed2dcb07b Fix Mem2Reg for store [assign]
This PR simplifies the handling of store [assign] in Mem2Reg by always
converting it to a store [init].
Also fixes an edge case where store [assign] in a non entry block was
not the first store of an alloc_stack with uses in multiple blocks.
2021-02-06 19:54:34 -08:00
Meghana Gupta
e2563e63d2 Merge pull request #35766 from meg-gupta/csechangespr
CSE OSSA: look through ownership instructions for some additional instructions
2021-02-05 12:50:40 -08:00
Meghana Gupta
10492c9efc Merge pull request #35718 from meg-gupta/dceossafixespr
Fixes for OSSA DCE
2021-02-04 15:16:13 -08:00
Meghana Gupta
b854df0ebb CSE OSSA: look through ownership instructions for some additional instructions 2021-02-04 12:50:31 -08:00
Meghana Gupta
691ead342f Merge pull request #35731 from meg-gupta/rlefixes
Fix lifetime of intermediate phis created by the SSAUpdater for RLE
2021-02-04 09:57:37 -08:00
Erik Eckstein
028afc0fb2 DeadObjectElimination: delete dead arrays for which the "destroyArray" builtin is inlined.
This is needed for non-OSSA SIL: in case we see a destroyArray builtin, we can safely remove the otherwise dead array.
This optimization kicks in later in the pipeline, after array semantics are already inlined (for early SIL, DeadObjectElimination can remove arrays based on semantics).

rdar://73569282
https://bugs.swift.org/browse/SR-14100
2021-02-04 07:53:32 +01:00
Meghana Gupta
d3acfee433 When DCE removes a dead terminator, insert appropriate lifetime ends 2021-02-03 11:38:43 -08:00
Meghana Gupta
a78acfe4b0 Disable handling of nested borrows in DCE
Nested borrow handling can be complex in the presence of reborrows. So
it is not handled currently.
2021-02-03 11:38:40 -08:00
Meghana Gupta
234d29ab51 Insert end_borrow before any destroy_value while ending lifetime of a reborrow with dependencies 2021-02-03 11:38:11 -08:00
Meghana Gupta
180b3bdcca Add reborrow dependencies to DCE
A reborrow's base value may change if the base value is also passed as
an operand on a branch. Record reborrow dependencies so that we can mark
the base value as live, if the reborrow was also live. This ensures we
do not insert destroy_value on the base value prematurely before the
lifetime of the reborrow ends.
2021-02-03 11:38:11 -08:00
Minhyuk Kim
e924cf6104 Replace usages of StringRef.find(Key) != StringRef::npos to StringRef.contains(Key) 2021-02-04 00:42:04 +09:00
Meghana Gupta
ecb5d65d6d Fix lifetime of intermediate phis created by RLE
We were adjusting the lifetime of the final phi created by the
SSAUpdater. The intermediate phi's lifetime needs to be adjusted as
well.
2021-02-02 21:54:09 -08:00
Meghana Gupta
df82a1a92c Allow DCE of load [copy] 2021-02-02 14:01:37 -08:00
Erik Eckstein
d33ea9f350 SIL: remove the JointPostDominanceSetComputer helper struct.
Instead make `findJointPostDominatingSet` a stand-alone function.
There is no need to keep the temporary SmallVector alive across multiple calls of findJointPostDominatingSet for the purpose of re-using malloc'ed memory. The worklist usually contains way less elements than its small size.
2021-02-02 10:20:35 +01:00
Meghana Gupta
aa76077173 Merge pull request #35674 from meg-gupta/fixtemplvalopt
TempLValueOpt : Cleanup debug_value_addr when combining a copy_addr and destroy
2021-02-02 00:22:42 -08:00
Meghana Gupta
abd1603c88 TempLValueOpt : Cleanup debug_value_addr when combining a copy_addr and destroy 2021-01-30 22:19:00 -08:00
Adrian Prantl
a9f05c8c30 Merge remote-tracking branch 'origin/main' into rebranch
Conflicts:
	lib/IRGen/IRGenDebugInfo.cpp
2021-01-29 16:17:10 -08:00
Erik Eckstein
ec64f2a255 SILLocation: replace CleanupLocation::get(loc) with CleanupLocation(loc)
No need to have a static get function - the constructor can be used directly.
NFC
2021-01-29 20:28:21 +01:00
Erik Eckstein
462e58d3cb SILLocation: a big refactoring and reducing its size from 3 to 2 words
My goal was to reduce the size of SILLocation. It now contains only of a storage union, which is basically a pointer and a bitfield containing the Kind, StorageKind and flags. By far, most locations are only single pointers to an AST node. For the few cases where more data needs to be stored, this data is allocated separately: with the SILModule's bump pointer allocator.

While working on this, I couldn't resist to do a major refactoring to simplify the code:

* removed unused stuff
* The term "DebugLoc" was used for 3 completely different things:
    - for `struct SILLocation::DebugLoc` -> renamed it to `FilePosition`
    - for `hasDebugLoc()`/`getDebugSourceLoc()` -> renamed it to `hasASTNodeForDebugging()`/`getSourceLocForDebugging()`
    - for `class SILDebugLocation` -> kept it as it is (though, `SILScopedLocation` would be a better name, IMO)
* made SILLocation more "functional", i.e. replaced some setters with corresponding constructors
* replaced the hand-written bitfield `KindData` with C bitfields
* updated and improved comments
2021-01-29 20:28:21 +01:00
swift-ci
378b6d42d1 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-29 05:52:27 -08:00
Andrew Trick
67863c55b6 Revert "SimplifyCFG: fix an infinite jump-threading loop."
This reverts commit fe928d57ac.

This causes an ASAN failure. Reverting until it can be debugged.
2021-01-28 23:46:23 -08:00
Andrew Trick
0b2a6267f6 Revert "Comment SimplifyCFG JumpThreadingCost."
This reverts commit 7a1065cfc2.
2021-01-28 23:46:12 -08:00
swift-ci
f39cace82b Merge remote-tracking branch 'origin/main' into rebranch 2021-01-27 21:12:42 -08:00
Andrew Trick
7a1065cfc2 Comment SimplifyCFG JumpThreadingCost.
Explain how this actually works since it isn't directly obvious.
2021-01-27 16:34:02 -08:00
swift-ci
ccbfe36f97 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-27 16:32:44 -08:00
Andrew Trick
e5e2cf1f62 Merge pull request #35608 from atrick/guard-simplify-loops
Add a safeguard to SimplifyCFG tryJumpThreading to avoid infinite loop peeling
2021-01-27 16:19:27 -08:00
swift-ci
2a09ccb73d Merge remote-tracking branch 'origin/main' into rebranch 2021-01-27 16:12:25 -08:00
Andrew Trick
578adca67e Merge pull request #35614 from eeckstein/fix-simplifycfg
SimplifyCFG: fix an infinite jump-threading loop.
2021-01-27 15:54:01 -08:00
swift-ci
2f5c3d3e51 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-27 11:12:39 -08:00
Erik Eckstein
32224d2576 SILMem2Reg: a small cleanup
NFC
2021-01-27 16:40:14 +01:00
Erik Eckstein
bb7844cd6b DeadCodeElimination: a small cleanup
Split `markValueLive(SILNode *)` into `markValueLive(SILValue)` and `markInstructionLive(SILInstruction*)`
2021-01-27 16:40:14 +01:00
Erik Eckstein
fe928d57ac SimplifyCFG: fix an infinite jump-threading loop.
The JumpThreadingCost map in Simplify CFG is used to prevent infinite jump threading loops.
There was a missing update of the cost for blocks which are cloned:
Jump threading loops were prevented for infinitely cloning the original block, but not for re-cloning the cloned block.

A test case is already added in 8948f7565a

rdar://73357726, [SR-14068]
2021-01-27 14:54:25 +01:00
swift-ci
e349794517 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-27 04:12:41 -08:00
Erik Eckstein
f48191966c SILOptimizer: use BasicBlockSet instead of SmallPtrSet in various transformations.
It reduces compile time.
2021-01-27 10:31:17 +01:00
Erik Eckstein
4d61dad616 DeadCodeElimination: Make DCE a separate class, called by DCEPass::run().
Instead of manually managing the internal state of the pass.
Also, use BasicBlockSet instead of SmallPtrSet.
2021-01-27 10:31:17 +01:00
Erik Eckstein
f7f7188b14 SILOptimizer: use BasicBlockData and BasicBlockSet in ARCCodeMotion 2021-01-27 10:31:17 +01:00
swift-ci
334f11c580 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-26 23:32:31 -08:00
Andrew Trick
43293ea612 Merge pull request #35604 from atrick/fix-simplifycfg-tramp
Fix a SimplifyCFG typo that leads to unbounded optimization
2021-01-26 23:23:40 -08:00
Andrew Trick
8b2098445e Add a safeguard to SimplifyCFG tryJumpThreading to avoid infinite loop peeling
rdar://73644659 (Add a safeguard to SimplifyCFG tryJumpThreading to avoid infinite loop peeling)

A case of infinite loop peeling was exposed recently:

([SR-14068]: Compiling with optimisation runs indefinitely for grpc-swift)

It was trivially fixed here:

---
commit 8948f7565a (HEAD -> fix-simplifycfg-tramp, public/fix-simplifycfg-tramp)
Author: Andrew Trick <atrick@apple.com>
Date:   Tue Jan 26 17:02:37 2021

Fix a SimplifyCFG typo that leads to unbounded optimization
---

However, that fix isn't a strong guarantee against this behavior. The
obvious complete fix is that jump-threading should not affect loop
structure. But changing that requires a performance investigation. In
the meantime this change introduces a simple mechanism that guarantees
that a loop header is not repeatedly cloned.

This safeguard is worthwhile because jump-threading across loop
boundaries is kicking in more frequently now the critical edges are
being split within SimplifyCFG.

Note that it is both necessary and desirable to split critical edges
between transformations so that SIL remains in a valid state. That
allows other code in SimplifyCFG to call arbitrary SIL utilities,
allows verifying SimplifyCFG by running verification between
transformation, and simplifies the patters that SimplifyCFG itself
needs to consider.
2021-01-26 19:42:19 -08:00
Andrew Trick
8948f7565a Fix a SimplifyCFG typo that leads to unbounded optimization
Fixes rdar://73357726 ([SR-14068]: Compiling with optimisation runs
indefinitely for grpc-swift)

The root cause of this problem is that SimplifyCFG::tryJumpThreading
jump threads into loops, effectively peeling loops. This is not the
right way to implement loop peeling. That belongs in a loop
optimization pass. There's is simply no sane way to control jump
threading if it is allowed across loop boundaries, both from the
standpoint of requiring optimizations to terminate and from the
standpoint of reducing senseless code bloat.

SimplifyCFG does have a mechanism to avoid jump-threading into loop in
most cases. That mechanism would actually prevent the infinite loop
peeling in this particular case if it were implemented correctly. But
the original implementation circa 2014 appears to have a typo.

This commit fixes that obvious bug. I do not think it's a sufficient
to ensure we never see the bad behavior. I will file separate bugs for
the broader issue.

This bad behavior was exposed incidentally by splitting critical
edges. Without edge splitting, SimplifyCFG::simplifyBlocks only
performs "jump threading" once, creating a critical edge to the loop
header. Because simplifyBlocks works under the assumption that there
are no critical edges, it never attempts to perform jump threading
again. In other words, the presence of the critical edge "breaks" the
optimization, preventing it from continuing as intended.

With edge splitting, the simplifyBlocks worklist performs "jump
threading" followed by "jump to trampoline" removal, which creates a
new loop-back edge to the original loop header. This is fine. However,
simplifyBlocks iteratively attempts all optimizations up to a fix
point and it does not stop at loop headers! So, splitting the critical
edge causes simplifyBlocks to work as intended, which leads to
infinite loop peeling. The end result is an infinite sequence of
nested loops. Each peeled iteration is actually within the parent
loop.
2021-01-26 17:05:37 -08:00
swift-ci
6137579b93 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-26 10:12:52 -08:00
Eric Miotto
8e7f9c9cbd Revert "SIL: let SingleValueInstruction only inherit from a single SILNode." 2021-01-26 10:02:24 -08:00
swift-ci
46b618e7af Merge remote-tracking branch 'origin/main' into rebranch 2021-01-25 19:52:42 -08:00