Commit Graph

1030 Commits

Author SHA1 Message Date
Andrey Tuganov
ea9d1d02b7 Removed todos from validate_id.cpp
Removed todos for validation of opcodes handles in other passes.
2017-10-19 19:51:31 -04:00
David Neto
863578a38d DeadBranchElim: Slightly more defensive coding 2017-10-19 19:28:45 -04:00
David Neto
8ec62deb23 The reviewed cfg_cleanup optimize pass 2017-10-19 15:28:09 -04:00
Diego Novillo
c75704ec08 CFG cleanup pass - Remove unreachable blocks.
- Adds a new pass CFGCleanupPass.  This serves as an umbrella pass to
  remove unnecessary cruft from a CFG.
- Currently, the only cleanup operation done is the removal of
  unreachable basic blocks.
- Adds unit tests.
- Adds a flag to spirvopt to execute the pass (--cfg-cleanup).
2017-10-19 15:16:29 -04:00
David Neto
f17326c9bd Android.mk: add source/opt/fold.cpp 2017-10-18 10:28:12 -04:00
Diego Novillo
4101cf4687 Merge pull request #885 from dnovillo/const-prop
Re-factor generic constant folding code out of fold spec constants pass
2017-10-18 08:37:00 -04:00
Diego Novillo
332a1f1422 Re-factor generic constant folding code out of FoldSpecConstantOpAndCompositePass
There are no functional changes in this patch.  The generic folding
routines in FoldSpecConstantOpAndCompositePass are now inside opt/fold.{cpp,h}.
This code will be used by the upcoming constant propagation pass.  In
time, we'll add more expression folding and simplification into these
two files.
2017-10-17 19:41:37 -04:00
GregF
1a9061a2be ADCE: Treat privates like locals in entry point with no calls
This is needed for ongoing legalization of HLSL. It allows removal
of accesses to textures/buffers that are not used.
2017-10-13 15:39:14 -04:00
GregF
1e7994c085 Opt: Move *NextId functionality into MemPass 2017-10-13 15:22:19 -04:00
David Neto
941a234132 Validator: Test OpReturnValue type check
The check already existed.  I added a test for it.

Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/876
2017-10-13 15:19:13 -04:00
Andrey Tuganov
8de8dd8c8c Reenable validate type unique pass
Vulkan CTS patch fixing the instances of non-unique type declaration in
autogenerated code has recently been submitted.
2017-10-12 15:46:06 -04:00
Andrey Tuganov
2401fc0a72 Refactored MARK-V API
- switched from C to C++
- moved MARK-V model creation from backend to frontend
- The same MARK-V model object can be used to encode/decode multiple
files
- Added MARK-V model factory (currently only one option)
- Added --validate option to spirv-markv (run validation while
encoding/decoding)
2017-10-12 15:40:40 -04:00
Andrey Tuganov
b54997e6eb Validator checks OpReturn called from void func
Added check into validate_cfg which checks that OpReturn is not called
from functions which are supposed to return a value.
2017-10-12 15:32:32 -04:00
Steven Perron
720beb161a Generic intrusive linked list class.
This commit is the initial implementation of the intrusive linked list
class.  It includes the implementation in the header files, and unit
test.

The iterators are circular: incrementing end() gives begin() and
decrementing begin() gives end().  Also made it valid to
decrement end().

Expliticly defines move constructor and move assignment
- Visual Studio 2013 does not implicitly generate the move constructor or
  move assignments.  So they need to be explicit, otherwise it will try to
  use the copy constructor, which we explicitly deleted.
- Can't use "= default" either.
  Seems like VS2013 does not support explicitly using the default move
  constructors and move assignments, so I wrote them out.
2017-10-12 12:40:18 -04:00
GregF
63064bd9eb DeadBranchElim: Add dead case elimination
Expands dead branch elimination to eliminate dead switch cases. It also
changes dbe to eliminate orphaned merge blocks and recursively eliminate
any blocks thereby orphaned.
2017-10-12 11:44:05 -04:00
Andrey Tuganov
99f20438f7 Add Android.mk to SPIRV-Tools
Android.mk was migrated from shaderc/third_party.

android_test is a stub, only builds spirv-tools libs.h to test build.
2017-10-12 10:45:42 -04:00
Diego Novillo
c90d7305e7 Add -O, -Os and -Oconfig flags.
These flags are expanded to a series of spirv-opt flags with the
following semantics:

-O: expands to passes that attempt to improve the performance of the
    generated code.

-Os: expands to passes that attempt to reduce the size of the generated
     code.

-Oconfig=<file> expands to the sequence of passes determined by the
                flags specified in the user-provided file.
2017-10-10 12:14:09 -04:00
Tim Diekmann
c26778fa99 Set cmake-policy CMP0048 to NEW 2017-10-10 14:23:42 +02:00
Pierre Moreau
86627f7b3f Implement Linker (module combiner)
Add extra iterators for ir::Module's sections
Add extra getters to ir::Function
Add a const version of BasicBlock::GetLabelInst()

Use the max of all inputs' version as version

Split debug in debug1 and debug2
- Debug1 instructions have to be placed before debug2 instructions.

Error out if different addressing or memory models are found

Exit early if no binaries were given

Error out if entry points are redeclared

Implement copy ctors for Function and BasicBlock
- Visual Studio ends up generating copy constructors that call deleted
  functions while compiling the linker code, while GCC and clang do not.
  So explicitly write those functions to avoid Visual Studio messing up.

Move removing duplicate capabilities to its own pass

Add functions running on all IDs present in an instruction

Remove duplicate SpvOpExtInstImport

Give default options value for link functions

Remove linkage capability if not making a library

Check types before allowing to link

Detect if two types/variables/functions have different decorations

Remove decorations of imported variables/functions and their types

Add a DecorationManager

Add a method for removing all decorations of id

Add methods for removing operands from instructions

Error out if one of the modules has a non-zero schema

Update README.md to talk about the linker

Do not freak out if an imported built-in variable has no export
2017-10-06 18:33:53 -04:00
Andrey Tuganov
4b1577a0cb Remove duplicate dead branch elim pass declaration
The function had two declarations in the same header with somewhat
different comments.
2017-10-06 17:05:46 -04:00
Andrew Woloszyn
d7f199b5d4 Hack around bug in gcc-4.8.1 templates.
This keeps the previous behavior for other compilers that will
throw warnings on a negative shift operation, but works around
the internal compiler error in GCC.
2017-10-06 10:26:17 -04:00
GregF
da04f5640e AggressiveDCE: Fix to not treat parameter memory refs as local
This fixes a bug that incorrectly deletes stores to parameters, which
can be used to return values from functions.
2017-10-05 10:59:45 -04:00
Pierre Moreau
c87e9671ab Compact-ids pass should update the header ID bound 2017-10-03 11:24:28 -04:00
David Neto
169266e9b8 DiagnosticStream move ctor moves output duties to new object
- Take over contents of the expiring message stream
- Prevent the expiring object from emitting anything during destruction
2017-10-03 11:23:54 -04:00
David Neto
17a843c6b0 Cache end iterators for speed
Helps scaling of DefUseManager on modules with many thousands
of instructions.
2017-09-29 16:13:55 -04:00
jcaraban
6526c42603 No use to check OpBitCount result width 2017-09-29 09:14:02 +03:00
Lei Zhang
d7ea99bc04 Skip checking copyright if SPIRV_SKIP_TESTS is enabled 2017-09-27 21:22:05 -04:00
David Neto
6eaaf7b5f2 Update CHANGES to reflect fix for #827 2017-09-27 10:03:20 -04:00
David Neto
77feb8dd03 Compact-ids pass should update instruction's result_id member
Also update the result type field.

Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/827
2017-09-27 08:31:05 -04:00
Lei Zhang
99cd25c413 Remove duplicated declaration of CreateAggressiveDCEPass(). 2017-09-26 15:39:00 -04:00
Andrey Tuganov
64d5e5214f Add bitwise operations validator pass
The pass checks correctness of operand types of all bitwise instructions
(opcode range from SpvOpShiftRightLogical to SpvOpBitCount).
2017-09-26 14:22:37 -04:00
Andrey Tuganov
dcf42433a6 Add remaining opcodes to arithmetics validation
Add validation rules for:
- OpIAddCarry
- OpISubBorrow
- OpUMulExtended
- OpSMulExtended

Includes some refactoring of old code.
2017-09-26 11:47:34 -04:00
David Neto
d84df94608 Update CHANGES with recent news 2017-09-26 11:30:57 -04:00
Steven Perron
e43c91046b Create the dead function elimination pass
Creates a pass called eliminate dead functions that looks for functions
that could never be called, and deletes them from the module.

To support this change a new function was added to the Pass class to
traverse the call trees from diffent starting points.

Includes a test to ensure that annotations are removed when deleting a
dead function.  They were not, so fixed that up as well.

Did some cleanup of the assembly for the test in pass_test.cpp.  Trying
to make them smaller and easier to read.
2017-09-26 11:18:06 -04:00
Andrey Tuganov
976e4218d5 Detach MARK-V from the validator
MARK-V codec was previously dependent on the validation state.
Now it doesn't need the validator to function, but can still optionally
create it and validate every instruction once it's decoded.
2017-09-26 11:10:23 -04:00
Lei Zhang
16981f87fe Avoid using global static variables
Previously we have several grammar tables defined as global static
variables and these grammar table entries contains non-POD struct
fields (CapabilitySet/ExtensionSet). The initialization of these
non-POD struct fields may require calling operator new. If used
as a library and the caller defines its own operator new, things
can screw up.

This pull request changes all global static variables into
function static variables, which is lazy evaluated in a thread
safe way as guaranteed by C++11.
2017-09-26 10:59:15 -04:00
Andrey Tuganov
c25b5bea35 Add SPIRV_SPIRV_COMPRESSION option to cmake
The option is off by default.
cmake -DSPIRV_BUILD_COMPRESSION=ON ..
enables the compression lib, executable, and test build.

Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/834
2017-09-25 14:37:08 -04:00
Ehsan
cf6c20ee06 Merge pull request #829 from atgoo/fix_val_logicals
Validator: fix logicals pass for OpSelect pointers
2017-09-21 18:50:09 -04:00
Andrey Tuganov
3f5e1a91ae Validator: fix logicals pass for OpSelect pointers
OpSelect works with pointers also when capability
VariablePointersStorageBuffer is declared (before worked only with
capability VariablePointers).
2017-09-21 16:12:14 -04:00
David Neto
33b879c105 elim-multi-store: only patch loop header phis that we created
There can already be OpPhi instructions in a loop header that
are unrelated to the optimization.  We should not be patching those.

Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/826
2017-09-21 10:01:30 -04:00
Andrey Tuganov
cf85ad1429 Add validate logicals pass to the validator
New pass checks operands of all instructions listed under
3.32.15. Relational and Logical Instructions
2017-09-20 10:37:12 -04:00
Andrey Tuganov
4e3cc2f57f Refactored validate_aritmetics.cpp
Improved error messages and readability.
2017-09-20 10:30:54 -04:00
Andrey Tuganov
9b14dd0cb4 Updated markv_autogen
- now includes a table of all descriptors with coding scheme
(improves performance by 5% by allowing to avoid creation of
move-to-front sequences which will never be used)
- increased the size of markv_autogen.inc, clang doesn't seem
to have the long compilation time problem now
(probably was inadvertently fixed by using Huffman codec
serialization)
2017-09-20 10:23:22 -04:00
Greg Fischer
8be28f7524 ElimLocalMultiStore: Reset structured successors for each function 2017-09-19 13:47:28 -06:00
Steven Perron
e4c7d8e748 Add strength reduction; for now replace multiply by power of 2
Create a new optimization pass, strength reduction, which will replace
integer multiplication by a constant power of 2 with an equivalent bit
shift.  More changes could be added later.

- Does not duplicate constants

- Adds vector |Concat| utility function to a common test header.
2017-09-18 17:01:36 -04:00
GregF
7be791aaaa ExtractInsert: Handle rudimentary CompositeConstruct and ConstantComposite
This optimizes a single index extract whose composite value terminates with a
CompositeConstruct (or ConstantComposite) by evaluating to the correct
component. This was needed for opaque legalization.

This highlights the need/opportunity to improve this optimization to deal
with more complex composite expressions including currently handled ops
plus Null ops and special vector composition. A TODO has been added.
2017-09-15 20:33:53 -04:00
David Neto
a91cecfefc Recognize SPV_AMD_shader_fragment_mask 2017-09-14 10:37:18 -04:00
Andrey Tuganov
c6dfc11880 Add new checks to validate arithmetics pass
New operations:
- OpDot
- OpVectorTimesScalar
- OpMatrixTimesScalar
- OpVectorTimesMatrix
- OpMatrixTimesVector
- OpMatrixTimesMatrix
- OpOuterProduct
2017-09-08 11:08:41 -04:00
David Neto
4442102247 Update CHANGES for OpModuleProcessed validation rule 2017-09-08 09:16:15 -04:00
David Neto
c843ef8ab5 validator: OpModuleProcessed allowed in layout section 7c
Recent spec fix from SPIR Working group:
  Allow OpModuleProcessed after debug names, but before any
  annotation instructions.
2017-09-07 17:45:51 -04:00