Commit Graph

446 Commits

Author SHA1 Message Date
Erik Eckstein
3b9805b246 Disallow cond_br with identical destinations.
It avoids generation of llvm phi nodes with identical predecessors and differing values.
This change replaces my previous fix of this problem in r23580, where I handled it in IRGen.

There were some discussions about it with the conclusion that it's better to just disallow such cond_br instructions in SIL.
It makes the life easier for some SIL optimizations which can't deal with cond_br with identical destinations.

The original radar is <rdar://problem/18568272> Swift compiler fails with "PHI node has multiple entries for the same basic block with different incoming values!"



Swift SVN r23861
2014-12-11 15:03:49 +00:00
Mark Lacey
1859e5da52 Fix witness_method verification issue.
Verify that witness_method instructions with a lookup type that is an
opened archetype have the optional operand that represents the
open_existential instruction.

I ran into this working supporting substitution of existential types in
mandatory inlining (rdar://problem/17769717).

Swift SVN r23665
2014-12-03 23:34:45 +00:00
Mark Lacey
7335adb438 Fix another typo.
Swift SVN r23645
2014-12-03 06:08:10 +00:00
Michael Gottesman
652b5aeeea Add a verifier check to make sure that functions that have a function signature that should have a self parameter coming out of SILGen actually do so.
This was discovered while I was refactoring SILGen convention code.

Swift SVN r23611
2014-12-02 05:29:54 +00:00
Joe Groff
ee531db36e SIL verifier: Bit more helpful spew for entry BB argument mismatches.
Swift SVN r23493
2014-11-20 23:13:08 +00:00
Joe Groff
4a4296d0a5 SIL: Allow init_existential_ref to convert among @objc existentials.
This can arise by substitution when we specialize a generic parameter bounded by an ObjC protocol with an ObjC protocol type. Fixes rdar://problem/19035529.

Swift SVN r23463
2014-11-20 03:15:51 +00:00
Arnold Schwaighofer
c322b3592d Add a data dependence between opened existential values and method_inst that 'use' them.
Before this patch there was no dependence visible to the optimizer between a
open_existential and the witness_method allowing the optimizer to reorder the
two instruction. The dependence was implicit in the opened archetype but this
is not a concept model by the SIL optimizer.

  %2 = open_existential %0 : $*FooProto to $*@opened("...") FooProto
  %3 = witness_method $@opened("...") FooProto,
                      #FooProto.bar!1 : $@cc(...)
  %4 = apply %3<...>(%2)

This patch changes the SIL representation such that witness_methods on opened
archetypes take the open_existential (or the producer of the opened existential)
as an operand preventing the optimizer from reordering them.

  %2 = open_existential %0 : $*FooProto to $*@opened("...") FooProto
  %3 = witness_method $@opened("...") FooProto,
                      #FooProto.bar!1,
                      %2 : $*@opened("...") FooProto : $@cc(...)
  %4 = apply %3<...>(%2)

rdar://18984526

Swift SVN r23438
2014-11-19 17:22:22 +00:00
Dave Abrahams
177cbf3f8e Adjustment for upstream llvm change
Apparently sets now return an iterator from lookups as well as a bool

Swift SVN r23427
2014-11-19 05:31:10 +00:00
Mark Lacey
c270f76db1 Fix check related to null conformances.
Verify that existentials have null conformances, just as is required of
archetypes, and require non-null conformances in other cases.

The last require that we had here attempted to allow for null
conformances, but we check just above that the conformance is non-null,
and this was firing on existentials with some other changes that I have.

Swift SVN r23200
2014-11-10 06:30:06 +00:00
Joe Groff
95c1b0009d SIL: Verify that value checked_casts don't take addresses.
The instruction isn't expressive enough to represent an arbitrary indirect cast, which may need a buffer to change the value's representation, and it looks like we don't exercise this legacy capability anymore.

Swift SVN r23130
2014-11-06 19:41:46 +00:00
Adrian Prantl
62b91da9f5 Make the debug scope requirements even stricter.
Swift SVN r23049
2014-11-01 00:43:11 +00:00
Roman Levenstein
c8d180e660 Generalize the switch_int instruction into switch_value instruction, which may switch on arguments of builtin integer types or function types. The later is required for implementing a more efficient speculative devirtualizaiton implementation. Implement lowering of switch_value into LLVM code. In case of integer operands, it reuses LLVM's switch optimizations. Support for switching on function types is not yet bullet-proof and will be refined in the subsequent patches.
rdar://18508812

Swift SVN r23042
2014-10-31 22:55:56 +00:00
Adrian Prantl
25d1d5e65a Move the check for required debug scopes into the SIL verifier.
Swift SVN r23041
2014-10-31 22:32:20 +00:00
Roman Levenstein
f016754ef9 Add a new select_value instruction. This instruction should be the equivalent of select_enum, just for builtin int types. Such an instruction is needed e.g. to efficiently implement conversions of Int raw values to C-like enums.
rdar://18812325

Swift SVN r23036
2014-10-31 20:44:11 +00:00
Joe Groff
e7287289e4 SILGen: Redispatch protocol class method and init requirements.
Fixes a bug where dynamic dispatches of class methods or initializers through generic interfaces didn't redispatch to subclasses. Also fix up some logic errors noticed by inspection.

Swift SVN r22945
2014-10-26 04:37:59 +00:00
Erik Eckstein
60cb1a619a Support for eliminated witness methods in SILWitnessTable.
A method entry in SILWitnessTable can now be null.
This will be needed by dead method elimination.



Swift SVN r22914
2014-10-24 16:26:12 +00:00
Joe Groff
5a2f48e3be Add a Builtin.BridgeObject type.
This is a type that has ownership of a reference while allowing access to the
spare bits inside the pointer, but which can also safely hold an ObjC tagged pointer
reference (with no spare bits of course). It additionally blesses one
Foundation-coordinated bit with the meaning of "has swift refcounting" in order
to get a faster short-circuit to native refcounting. It supports the following
builtin operations:

- Builtin.castToBridgeObject<T>(ref: T, bits: Builtin.Word) ->
  Builtin.BridgeObject

  Creates a BridgeObject that contains the bitwise-OR of the bit patterns of
  "ref" and "bits". It is the user's responsibility to ensure "bits" doesn't
  interfere with the reference identity of the resulting value. In other words,
  it is undefined behavior unless:

    castReferenceFromBridgeObject(castToBridgeObject(ref, bits)) === ref

  This means "bits" must be zero if "ref" is a tagged pointer. If "ref" is a real
  object pointer, "bits" must not have any non-spare bits set (unless they're
  already set in the pointer value). The native discriminator bit may only be set
  if the object is Swift-refcounted.

- Builtin.castReferenceFromBridgeObject<T>(bo: Builtin.BridgeObject) -> T

  Extracts the reference from a BridgeObject.

- Builtin.castBitPatternFromBridgeObject(bo: Builtin.BridgeObject) -> Builtin.Word

  Presents the bit pattern of a BridgeObject as a Word.

BridgeObject's bits are set up as follows on the various platforms:

i386, armv7:

  No ObjC tagged pointers
  Swift native refcounting flag bit: 0x0000_0001
  Other available spare bits:        0x0000_0002

x86_64:

  Reserved for ObjC tagged pointers: 0x8000_0000_0000_0001
  Swift native refcounting flag bit: 0x0000_0000_0000_0002
  Other available spare bits:        0x7F00_0000_0000_0004

arm64:

  Reserved for ObjC tagged pointers: 0x8000_0000_0000_0000
  Swift native refcounting flag bit: 0x4000_0000_0000_0000
  Other available spare bits:        0x3F00_0000_0000_0007

TODO: BridgeObject doesn't present any extra inhabitants. It ought to at least provide null as an extra inhabitant for Optional.

Swift SVN r22880
2014-10-23 00:09:23 +00:00
Joe Groff
3f23b82e6d SIL: Rename SILGlobalAddr to GlobalAddr.
All globals are SIL globals now.

Swift SVN r22827
2014-10-18 17:08:28 +00:00
Arnold Schwaighofer
329fa51d3f Reapply "Verifier: Cannonical SIL should have split critical edges for non cond_br
terminators"

This is an assumption that the SSAUpdater makes. Verify that we preserve this
property.

With changes to the test cases, SIL documentation and add a critical edge (non
cond_br only) splitting pass to the mandatory pipeline.

This reapplies commit 22775.

Swift SVN r22803
2014-10-16 21:16:24 +00:00
Joe Groff
ea65d1e60b SIL: Remove the builtin_function_ref instruction.
Swift SVN r22797
2014-10-16 16:18:40 +00:00
Joe Groff
e3f9a2035c SIL: Move SILGen and passes over to use "builtin" instead of "apply (builtin_function_ref)".
Swift SVN r22785
2014-10-15 23:37:22 +00:00
Dave Abrahams
1007acb683 Revert "Verifier: Cannonical SIL should have split critical edges for non cond_br"
This reverts commit r22775 as it breaks SILPasses/simplify_cfg_args.sil
and SILPasses/split_critical_edges.sil for me with:

Assertion failed: (!isCriticalEdgePred(BB.getTerminator(), Idx) && "non
cond_br critical edges not allowed"), function verify, file
/Users/dave/src/s/swift/lib/SIL/Verifier.cpp, line 2380.

Swift SVN r22780
2014-10-15 22:46:32 +00:00
Arnold Schwaighofer
f4a855590d Verifier: Cannonical SIL should have split critical edges for non cond_br
terminators

This is an assumption that the SSAUpdater makes. Verify that we preserve this
property.

Swift SVN r22775
2014-10-15 21:42:14 +00:00
Dmitri Hrybenko
4833f311cd Allow private_external to be parsed and processed correctly
Also add tests for translating SIL linkage into LLVM linkage.

Swift SVN r22705
2014-10-13 18:19:12 +00:00
Joe Groff
bb46f4bbd9 SIL: Remove the global_addr instruction.
It's no longer needed now that we always lower to SIL globals.

Swift SVN r22693
2014-10-12 17:19:06 +00:00
Joe Groff
a60a52d72e SIL: Add a "builtin" instruction to represent builtin invocations.
Modeling builtins as first-class function values doesn't really make sense because there's no real function value to emit, and modeling them this way complicates passes that work with builtins because they have to invent function types for builtin invocations. It's much more straightforward to have a single instruction that references the builtin by ID, along with the type information for the necessary values, type parameters, and results, so add a new "builtin" instruction that directly represents a builtin invocation. NFC yet.

Swift SVN r22690
2014-10-11 20:34:24 +00:00
Arnold Schwaighofer
f6c7a99044 SIL verifier: Add check for constant argument requirement of llvm instrinsics
Swift SVN r22652
2014-10-10 01:39:18 +00:00
Joe Groff
9205bf64cf SIL: Remove enum_is_tag.
Swift SVN r22616
2014-10-09 05:03:43 +00:00
John McCall
89e60f31aa Add protocol witness tables to existential metatype
layouts.  Introduce new SIL instructions to initialize
and open existential metatype values.

Don't actually, y'know, lift any of the restriction on
existential metatypes; just pointlessly burn extra
memory storing them.

Swift SVN r22592
2014-10-08 01:20:13 +00:00
Joe Groff
ca8b168188 SIL: Add select_enum and select_enum_addr insns.
Similar to LLVM's "select" instruction, the instruction picks one of its operands based on the case tag of an enum value.

Swift SVN r22578
2014-10-07 21:45:08 +00:00
Michael Gottesman
c7c30bf962 [verifier] shared_external is a valid linkage for a fragile ref like shared since both are semantically the same things.
Swift SVN r22557
2014-10-07 00:07:43 +00:00
Michael Gottesman
2bb3269869 Add code to the verifier to make sure that functions with shared visibility always have bodies.
Since both shared and shared_external both lower to linkonce_odr, neither of
them can be declarations. This commit puts a check into the verifier to ensure
that this does not happen at the SIL level allowing us to catch such issues
earlier.

Swift SVN r22552
2014-10-06 23:16:51 +00:00
Joe Groff
782833f054 SIL: Remove the project_existential* instructions.
Swift SVN r22457
2014-10-02 04:06:10 +00:00
Joe Groff
3a606b9eb8 SIL: Drop the protocol_method instruction.
Swift SVN r22446
2014-10-01 23:35:41 +00:00
Joe Groff
be45322668 SIL: Drop the upcast_existential* instructions.
Swift SVN r22388
2014-09-30 16:11:54 +00:00
Joe Groff
c098645f34 SIL: Conformances relate to formal types, so change witness_method's lookup type to a CanType.
Should be NFC in practice, since only nominal types can currently conform to protocols anyway, but improves modeling of the system.

Swift SVN r22360
2014-09-29 20:44:00 +00:00
Joe Groff
152aa9e244 Revert "SIL: Drop the upcast_existential* instructions."
This reverts commit r22345.

Swift SVN r22353
2014-09-29 13:46:41 +00:00
Joe Groff
1e343fb430 SIL: Drop the upcast_existential* instructions.
Swift SVN r22345
2014-09-28 19:24:33 +00:00
Joe Groff
0518f2067f Revert "SIL: Drop the upcast_existential* instructions."
This reverts commit r22333.

Swift SVN r22337
2014-09-28 18:41:05 +00:00
Joe Groff
04872c86d9 SIL: Verify that init_existential instructions are fed a lowering of their formal concrete type.
Swift SVN r22335
2014-09-28 17:59:47 +00:00
Joe Groff
727c9b5ed7 SIL: Drop the upcast_existential* instructions.
Swift SVN r22333
2014-09-28 16:38:13 +00:00
Erik Eckstein
c16c510167 Set SILLinkage according to visibility.
Now the SILLinkage for functions and global variables is according to the swift visibility (private, internal or public).

In addition, the fact whether a function or global variable is considered as fragile, is kept in a separate flag at SIL level.
Previously the linkage was used for this (e.g. no inlining of less visible functions to more visible functions). But it had no effect,
because everything was public anyway.

For now this isFragile-flag is set for public transparent functions and for everything if a module is compiled with -sil-serialize-all,
i.e. for the stdlib.

For details see <rdar://problem/18201785> Set SILLinkage correctly and better handling of fragile functions.

The benefits of this change are:
*) Enable to eliminate unused private and internal functions
*) It should be possible now to use private in the stdlib
*) The symbol linkage is as one would expect (previously almost all symbols were public).

More details:

Specializations from fragile functions (e.g. from the stdlib) now get linkonce_odr,default
linkage instead of linkonce_odr,hidden, i.e. they have public visibility.
The reason is: if such a function is called from another fragile function (in the same module),
then it has to be visible from a third module, in case the fragile caller is inlined but not
the specialized function.

I had to update lots of test files, because many CHECK-LABEL lines include the linkage, which has changed.

The -sil-serialize-all option is now handled at SILGen and not at the Serializer.
This means that test files in sil format which are compiled with -sil-serialize-all
must have the [fragile] attribute set for all functions and globals.

The -disable-access-control option doesn't help anymore if the accessed module is not compiled
with -sil-serialize-all, because the linker will complain about unresolved symbols.

A final note: I tried to consider all the implications of this change, but it's not a low-risk change.
If you have any comments, please let me know.



Swift SVN r22215
2014-09-23 12:33:18 +00:00
Joe Groff
6cd5123712 SILGen: Use the formal type when taking dynamicTypes of values.
The metatype is associated with the formal AST type of the value, not whatever lowered SIL type we happen to have lying around. Adjust the SIL verifier to check that value_metatype instructions produce a metatype for which the instance is a potential lowering rather than by exact type match. This lets us take the metatype of metatypes (and incidentally, of functions, and of tuples thereof), fixing rdar://problem/17242770.

Swift SVN r22202
2014-09-23 02:56:48 +00:00
Michael Gottesman
867fab2d00 Make sure to only verify indirect results if the number of parameters to the function is > 1.
Swift SVN r22120
2014-09-19 05:04:59 +00:00
Michael Gottesman
04aaf791f0 [verifier] Make sure all SILFunctions only have one out parameter and that out parameter is the first argument to the function.
This is already an assumption in SILFunctionType:

  bool hasIndirectResult() const {
    return !getParameters().empty()
      && getParameters()[0].isIndirectResult();
  }
  SILParameterInfo getIndirectResult() const {
    assert(hasIndirectResult());
    return getParameters()[0];
  }

This just bakes the invariant into the IR so it is clear when writing tests that
this is not an issue.

I also updated function_ref and partial_apply to have the same such checks. This
should handle the majority of the cases.

Swift SVN r22119
2014-09-19 04:37:40 +00:00
Manman Ren
5ba1930a36 [Global Opt] add helper functions to analyze static initializer in SILGlobalVariable.
Also use the helper function to verify initializers for SILGlobalVariables.


Swift SVN r22082
2014-09-18 17:30:59 +00:00
Joe Groff
e004ad7df4 SIL: Carry AST types through init_existential instructions.
This is necessary to be able to properly stash values with nontrivial lowerings, such as metatypes and functions, inside existential containers. Modify SILGen to lower values to the proper abstraction level before storing them in an existential container. Part of the fix for rdar://problem/18189508, though runtime problems still remain when trying to actually dynamicCast out a metatype from an Any container.

Swift SVN r21830
2014-09-10 05:56:36 +00:00
Doug Gregor
c504086266 Revert r21707 "Remove the SIL is_nonnull instruction. It's no longer useful."
We want to be able to work around problems with non-failable
Objective-C initializers actually failing, which can happen when the
API audit data incorrectly marks an initializer as non-failable.



Swift SVN r21711
2014-09-04 17:26:34 +00:00
Doug Gregor
cdf94885ae Remove the SIL is_nonnull instruction. It's no longer useful.
Swift SVN r21707
2014-09-04 15:56:12 +00:00
Chris Lattner
0275a37935 enhance the SIL is_nonnull instruction to work with values of function type. This
isn't used yet.


Swift SVN r21636
2014-09-02 01:06:07 +00:00