Lei Zhang [Fri, 2 Sep 2016 13:51:44 +0000 (09:51 -0400)]
Kill the spvCheckReturn macro.
Lei Zhang [Fri, 2 Sep 2016 13:49:56 +0000 (09:49 -0400)]
Kill diagnostic_helper & the wrapping DIAGNOSTIC macro.
Lei Zhang [Wed, 31 Aug 2016 23:37:13 +0000 (19:37 -0400)]
Tests for preserving line debug insts even killing its affecting targets.
qining [Wed, 17 Aug 2016 21:19:48 +0000 (17:19 -0400)]
Unify constants pass
De-duplicate constants and unifies the uses of constants for a SPIR-V
module. If two constants are defined exactly the same, only one of them
will be kept and all the uses of the removed constant will be redirected
to the kept one.
This pass handles normal constants (defined with
OpConstant{|True|False|Composite}), some spec constants (those defined
with OpSpecConstant{Op|Composite}) and null constants (defined with
OpConstantNull).
There are several cases not handled by this pass:
1) If there are decorations for the result id of a constant defining
instruction, that instruction will not be processed. This means the
instruction won't be used to replace other instructions and other
instructions won't be used to replace it either.
2) This pass does not unify null constants (defined with
OpConstantNull instruction) with their equivalent zero-valued normal
constants (defined with OpConstant{|False|Composite} with zero as the
operand values or component values).
David Neto [Wed, 31 Aug 2016 18:35:58 +0000 (14:35 -0400)]
Refactor CapabilitySet into templated class EnumSet
qining [Wed, 31 Aug 2016 16:44:49 +0000 (12:44 -0400)]
Add forwarding so that passes' ctor can have args.
Also removed the default argument value of `skip_nop` for function
`SinglePassRunAndCheck()` and `SinglePassRunAndDisassemble()`. This is
required to support variadic arguments.
David Neto [Mon, 29 Aug 2016 18:49:00 +0000 (14:49 -0400)]
Handle capabilities larger than value 63
Use libspirv::CapabilitySet instead of a 64-bit mask.
Remove dead function spvOpcodeRequiresCapability and its tests.
The JSON grammar parser is simplified since it just writes the
list of capabilities as a braced list, and takes advantage of
the CapabilitySet intializer-list constructor.
David Neto [Sat, 27 Aug 2016 18:49:53 +0000 (14:49 -0400)]
Add libspirv::CapabilitySet
It's optimized for the common case, where capabilities have value
at most 63.
qining [Mon, 29 Aug 2016 22:05:24 +0000 (18:05 -0400)]
Get annotation instructions of a given id.
qining [Mon, 29 Aug 2016 20:09:40 +0000 (16:09 -0400)]
Add AppendNames() interface for AssemblyBuilder
Lei Zhang [Mon, 29 Aug 2016 19:46:09 +0000 (15:46 -0400)]
Create a separate header and source file for each pass.
qining [Thu, 4 Aug 2016 17:24:08 +0000 (13:24 -0400)]
Fold spec constants to normal constants (values fixed)
For the spec constants defined by OpSpecConstantOp and
OpSpecContantComposite, if all of their operands are constants with
determined values (normal constants whose values are fixed), calculate
the correct values of the spec constants and re-define them as normal
constants.
In short, this pass replaces all the spec constants defined by
OpSpecContantOp and OpSpecConstantComposite with normal constants when
possible. So far not all valid operations of OpSpecConstantOp are
supported, we have several constriction here:
1) Only 32-bit integer and boolean (both scalar and vector) are
supported for any arithmetic operations. Integers in other width (like
64-bit) are not supported.
2) OpSConvert, OpFConvert, OpQuantizeToF16, and all the
operations under Kernel capability, are not supported.
3) OpCompositeInsert is not supported.
Note that this pass does not unify normal constants. This means it is
possible to have new generatd constants defining the same values.
David Neto [Thu, 25 Aug 2016 22:36:03 +0000 (18:36 -0400)]
Pass manager recomputes Id bound automatically.
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/371
in the sense that the id bound is correct after all the passes
have been run. But it might be inconsistent between passes.
Lei Zhang [Fri, 26 Aug 2016 20:52:16 +0000 (16:52 -0400)]
Create const overloads for begin() and end() in Instruction.
David Neto [Fri, 26 Aug 2016 20:25:40 +0000 (16:25 -0400)]
Fix typo in spirv-opt help
David Neto [Tue, 23 Aug 2016 15:41:28 +0000 (11:41 -0400)]
Add Module::ComputeIdBound
When IDs change, something should use this utility method
and Module::SetIdBound before writing out the binary.
Lei Zhang [Fri, 26 Aug 2016 18:02:40 +0000 (14:02 -0400)]
Add tests for decoration_empty().
qining [Fri, 26 Aug 2016 15:54:36 +0000 (11:54 -0400)]
Add a method in the types to check whether there is no decoration on a
type.
David Neto [Fri, 26 Aug 2016 14:33:41 +0000 (10:33 -0400)]
Test ir::Instruction::GetOperand and GetInOperand
David Neto [Thu, 25 Aug 2016 20:42:36 +0000 (16:42 -0400)]
IrLoader gracefully handles incomplete blocks and functions
This lets us write smaller test cases with the IrLoader, avoiding
boilerplate for function begin/end, and basic block begin/end.
Also ForEachInst is more forgiving of cases where a basic block
doesn't have a label, and when a function doesn't have a defining
or end instruction.
David Neto [Thu, 25 Aug 2016 21:45:08 +0000 (17:45 -0400)]
Add Instruction begin and end mutable iterators
Refactored the instuction test.
David Neto [Thu, 25 Aug 2016 16:55:44 +0000 (12:55 -0400)]
Add Instruction cbegin and cend to access operands
David Neto [Sat, 20 Aug 2016 13:47:00 +0000 (09:47 -0400)]
ForEachInst optionally runs on attached debug line insts
Also:
- Add const forms of ForEachInst
- Rewrite Module::ToBinary in terms of ForEachInst
- Add Instruction::ToBinaryWithoutAttachedDebugInsts
- Delete the ToBinary method on Function, BasicBlock, and Instruction
since it can now be implemented with ForEachInst in a less confusing
way, e.g. without recursion.
- Preserve debug line instructions on OpFunctionEnd (and store that
instruction as a unique-pointer, for regularity).
Lei Zhang [Wed, 17 Aug 2016 14:34:53 +0000 (10:34 -0400)]
Travis CI: add build configuration for Android NDK with cmake.
David Neto [Wed, 24 Aug 2016 15:18:16 +0000 (11:18 -0400)]
Start v2016.4-dev
David Neto [Wed, 24 Aug 2016 15:17:07 +0000 (11:17 -0400)]
Finalize v2016.3
David Neto [Mon, 22 Aug 2016 15:38:18 +0000 (11:38 -0400)]
Add spirv-lesspipe.sh
Idea suggested by @steve-lunarg in issue 359.
David Neto [Wed, 24 Aug 2016 13:47:49 +0000 (09:47 -0400)]
Mere mention of PointSize BuiltIn does not require Shader capability
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/365 which
was reopened for this.
Lei Zhang [Fri, 19 Aug 2016 03:16:21 +0000 (23:16 -0400)]
Add a home brewed make_unique to ease creating unique_ptrs.
Lei Zhang [Sat, 20 Aug 2016 15:12:57 +0000 (11:12 -0400)]
Remove some unused macros and functions.
David Neto [Tue, 23 Aug 2016 22:44:26 +0000 (18:44 -0400)]
CHANGES captures fix for issue 365
David Neto [Tue, 23 Aug 2016 22:18:17 +0000 (18:18 -0400)]
Relax ClipDistance, CullDistance capability check in all environments
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/365
David Neto [Sat, 20 Aug 2016 09:51:15 +0000 (05:51 -0400)]
Add opt::ir::Module::SetIdBound
qining [Tue, 23 Aug 2016 15:34:24 +0000 (11:34 -0400)]
Get the number of elements for Vector and Matrix type
qining [Tue, 16 Aug 2016 17:06:03 +0000 (13:06 -0400)]
Refine the DefUseManager
* Fix the behavior when analyzing an individual instruction:
* exisiting instruction:
Clear the original records and re-analyze it as a new instruction.
* new instruction with exisiting result id:
Clear the original records of the exisiting result id. This means
the records of the analyzed result-id-defining instruction will be
overwritten by the record of the new instruction with the same
result id.
* new instruction with new result id or without result id:
Just update the internal records to incorperate the new
instruction.
* Add tests for analyzing individual instruction w/o an exisiting module.
* Refactor ClearInst() implementation
* Remove ClearDef() function.
* Fixed a bug in DefUseManager::ReplaceAllUsesWith() that OpName
instruction may trigger the assertion incorrectly.
* update the blurbs for EraseUseRecordsOfOperandIds()
qining [Wed, 17 Aug 2016 20:44:38 +0000 (16:44 -0400)]
Get the width from integer and float type
qining [Tue, 16 Aug 2016 15:04:32 +0000 (11:04 -0400)]
Replace the SetOperand() with SetInOperand() and SetResultType()
Lei Zhang [Tue, 16 Aug 2016 15:19:34 +0000 (11:19 -0400)]
Make clear that we are using ptrdiff_t as the iterator difference type.
And ptrdiff_t is a implementation defined signed type. Comparing it
with unsigned number literal causes compiler warnings.
Lei Zhang [Mon, 15 Aug 2016 15:13:25 +0000 (11:13 -0400)]
Derive iterator from std::iterator to reap standarad algorithms.
By deriving from std::iterator, iterator_traits will be properly
set up for our custom iterator type, thus we can use algorithms
from STL with our custom iterators.
Lei Zhang [Mon, 15 Aug 2016 17:41:47 +0000 (13:41 -0400)]
Make analyses RAII-like and turn disable copy/move constructors.
David Neto [Mon, 15 Aug 2016 15:27:13 +0000 (11:27 -0400)]
Avoid integer modulo by 1, to avoid warning
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/349
David Neto [Fri, 12 Aug 2016 18:19:17 +0000 (14:19 -0400)]
Avoid race on mkdir
Should fix https://github.com/KhronosGroup/SPIRV-Tools/issues/340
Lei Zhang [Fri, 12 Aug 2016 18:59:56 +0000 (14:59 -0400)]
Allow OpUndef appearing in the type and global variable section.
Also clean up API functions for adding instructions into the
type and global values section.
qining [Fri, 12 Aug 2016 21:26:35 +0000 (17:26 -0400)]
Add another construtor for opt::ir::Instruction
David Neto [Fri, 12 Aug 2016 18:47:26 +0000 (14:47 -0400)]
Test INotEqual for OpSpecConstantOp in asm, disasm
qining [Fri, 12 Aug 2016 17:12:43 +0000 (13:12 -0400)]
Add iterator getter interface for types_values_
Umar Arshad [Fri, 12 Aug 2016 18:28:17 +0000 (14:28 -0400)]
OpUndef can appear in type declaration section
Lei Zhang [Thu, 11 Aug 2016 23:58:42 +0000 (19:58 -0400)]
Turn off modifying methods for const iterators.
qining [Fri, 12 Aug 2016 14:43:26 +0000 (10:43 -0400)]
Clear old def-use record when re-analyze an ID
Lei Zhang [Fri, 12 Aug 2016 14:04:23 +0000 (10:04 -0400)]
Add make_range() & make_const_range() for creating iterator ranges.
Lei Zhang [Fri, 12 Aug 2016 13:13:04 +0000 (09:13 -0400)]
Avoid non-oneliner definition in class and add missing iterators.
qining [Fri, 12 Aug 2016 14:05:58 +0000 (10:05 -0400)]
Move the def-use analysis for single inst to public
qining [Thu, 11 Aug 2016 23:32:43 +0000 (19:32 -0400)]
Add getter for pointee, element type
Lei Zhang [Wed, 10 Aug 2016 14:02:28 +0000 (10:02 -0400)]
Create an iterator class for in-memory representation.
qining [Thu, 11 Aug 2016 22:19:50 +0000 (18:19 -0400)]
Make the lookup up of type id accepts const arg
David Neto [Thu, 11 Aug 2016 19:34:26 +0000 (15:34 -0400)]
Reuse the iterator on Id and type lookup
qining [Thu, 11 Aug 2016 21:13:43 +0000 (17:13 -0400)]
Add the const version of AsXXtype() interface.
qining [Thu, 11 Aug 2016 19:10:09 +0000 (15:10 -0400)]
Add GetId(Type* type) API to the type manager
David Neto [Thu, 11 Aug 2016 16:11:36 +0000 (12:11 -0400)]
Avoid double-copy of NameMapper object.
David Neto [Wed, 10 Aug 2016 19:28:11 +0000 (15:28 -0400)]
Use friendly names for Ids
David Neto [Wed, 3 Aug 2016 15:55:14 +0000 (11:55 -0400)]
Add spirv-cfg to dump a GraphViz graph of the CFG
This is experimental, and has not tests.
It's been used to debug validation of structured control flow.
- Has a legend describing special arcs to merge blocks and continue
targets.
- Labels the function entry block, with the Id of the function.
qining [Wed, 10 Aug 2016 20:02:18 +0000 (16:02 -0400)]
Add back the missing msg about --eliminate-dead-const
Lei Zhang [Wed, 10 Aug 2016 20:10:14 +0000 (16:10 -0400)]
Fix build error about passing initializer-list to constructor.
VS2013 is not happy with using initializer-list to initialize
vector parameters to explicit constructors taking one vector.
Lei Zhang [Wed, 10 Aug 2016 16:37:19 +0000 (12:37 -0400)]
Make type manager RAII-like w.r.t. the module to be analyzed.
Lei Zhang [Thu, 28 Jul 2016 16:15:14 +0000 (12:15 -0400)]
Optimization: Add type manager.
Type manager will construct a map of types gradually from
instructions.
Lei Zhang [Thu, 28 Jul 2016 16:11:01 +0000 (12:11 -0400)]
Optimization: Add type class hierarchy.
Lei Zhang [Wed, 10 Aug 2016 14:12:14 +0000 (10:12 -0400)]
Appveyor: also test on Visual Studio 2013.
David Neto [Tue, 9 Aug 2016 21:57:18 +0000 (17:57 -0400)]
Fix paths in the README.
Lei Zhang [Tue, 9 Aug 2016 23:20:35 +0000 (19:20 -0400)]
Change the interfaces of in-memory representation to use pointers.
Previously we use vectors of objects and move semantics to handle
ownership. That approach has the flaw that inserting an object into
the middle of a vector, which may trigger a vector reallocation,
can invalidate some addresses taken from instructions.
Now the in-memory representation internally uses vector of unique
pointers to handle ownership. Since objects are explicitly heap-
allocated now, pointers to them won't be invalidated by vector
resizing anymore.
David Neto [Wed, 10 Aug 2016 14:40:59 +0000 (10:40 -0400)]
Update CHANGES to say issue 288 is fixed
Andrew Woloszyn [Wed, 10 Aug 2016 13:45:15 +0000 (09:45 -0400)]
Fixed the build for MSVC.
assembly_builder was missing an include for cstdint.
Lei Zhang [Tue, 9 Aug 2016 20:57:36 +0000 (16:57 -0400)]
Manually create move the constructor/assignment for Instruction.
This is because some old visual studio versions (e.g., 2013) do
not support automatically generating move constructors/assignments.
David Neto [Tue, 9 Aug 2016 22:23:40 +0000 (18:23 -0400)]
Fix compilation. My bad
The API changed, and I forgot to submit this patch.
Umar Arshad [Sat, 6 Aug 2016 17:40:01 +0000 (13:40 -0400)]
Check dominance of OpPhi parent and variable pairs
Umar Arshad [Tue, 9 Aug 2016 18:05:03 +0000 (14:05 -0400)]
Removed dead code/const_casts/lists
qining [Tue, 9 Aug 2016 20:02:21 +0000 (16:02 -0400)]
Separate pass.h from passes.h
Future pass implementations should only need to include pass.h
Lei Zhang [Mon, 8 Aug 2016 02:49:00 +0000 (22:49 -0400)]
Use NEW behavior for policy CMP0054.
The NEW behavior is to not dereference variables or interpret keywords
that have been quoted or bracketed.
For more information, see
https://cmake.org/cmake/help/v3.1/policy/CMP0054.html.
This is to suppress a warning when using CMake 3.1.3+.
Umar Arshad [Sat, 6 Aug 2016 17:29:33 +0000 (13:29 -0400)]
Refactor Id -> Instruction
qining [Tue, 9 Aug 2016 16:09:53 +0000 (12:09 -0400)]
Fix minor mistakes in the tests of dead-const-elim
qining [Mon, 8 Aug 2016 21:09:30 +0000 (17:09 -0400)]
Print the shader when module building failed
qining [Fri, 29 Jul 2016 15:35:58 +0000 (11:35 -0400)]
Dead constant elimination
A pass to remove dead constants, including both front-end constants and spec
constants.
This pass does not handle dead variables and types.
Umar Arshad [Sat, 6 Aug 2016 17:25:02 +0000 (13:25 -0400)]
Remove unnecessary headers
Umar Arshad [Sat, 6 Aug 2016 16:24:19 +0000 (12:24 -0400)]
Remove needless copies. Delete copy constructor.
* Deletes the ValidationState_t copy constructor
* Removes needless copies of the copy constructor
David Neto [Fri, 5 Aug 2016 22:19:30 +0000 (18:19 -0400)]
Add target envs for OpenCL, OpenGL
Covers: OpenCL 2.1, OpenCL 2.2
Covers: OpenGL 4.0, OpenGL 4.1, OpenGL 4.2, OpenGL 4.3, OpenGL 4.5.
The OpenGL environments assume the use of GL_ARB_gl_spirv, of course.
David Neto [Fri, 5 Aug 2016 21:10:36 +0000 (17:10 -0400)]
Start v2016.3-dev
David Neto [Fri, 5 Aug 2016 21:07:34 +0000 (17:07 -0400)]
Finalize v2016.2
Document recently fixed bugs.
David Neto [Fri, 5 Aug 2016 19:20:59 +0000 (15:20 -0400)]
Hide implementations of BasicBlock::dominates,postdominates
David Neto [Fri, 5 Aug 2016 20:05:44 +0000 (16:05 -0400)]
Track a construct by its entry block.
David Neto [Fri, 5 Aug 2016 15:14:21 +0000 (11:14 -0400)]
Validator cfg fixes
- Find unreachable continue targets. Look for back edges
with a DFS traversal separate from the dominance traversals,
where we count the OpLoopMerge from the header to the continue
target as an edge in the graph.
- It's ok for a loop to have multiple back edges, provided
they are all from the same block, and we call that the latch block.
This may require a clarification/fix in the SPIR-V spec.
- Compute postdominance correctly for infinite loop:
Bias *predecessor* traversal root finding so that you use
a later block in the original list. This ensures that
for certain simple infinite loops in the CFG where neither
block branches to a node without successors, that we'll
compute the loop header as dominating the latch block, and the
latch block as postdominating the loop header.
David Neto [Fri, 29 Jul 2016 15:24:57 +0000 (11:24 -0400)]
Add BasicBlock methods: dominates postdominates
David Neto [Tue, 26 Jul 2016 18:59:40 +0000 (14:59 -0400)]
Rename a variable so it's consistent with spec
In the spec "continue block" is a block with a branch
to the Continue Target. It's not the Continue Target.
Lei Zhang [Fri, 5 Aug 2016 17:46:45 +0000 (13:46 -0400)]
Check configuration and gmock existence when adding unit tests.
David Neto [Fri, 5 Aug 2016 14:09:06 +0000 (10:09 -0400)]
Fix dominance calculation
Fixes dominance calculation when there is a forward arc from an
unreachable block A to a reachable block B. Before this fix, we would
say that B is not dominated by the graph entry node, and instead say
that the immediate dominator of B is the psuedo-entry node of the
augmented CFG.
The fix:
- Dominance is defined in terms of a traversal from the entry block
of the CFG. So the forward DFS should start from the function
entry block, not the pseudo-entry-block.
- When following edges backward during dominance calculations, only go to
nodes that are actually reachable in the forward traversal.
Important: the sense of reachability flips around when computing
post-dominance.
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/297
qining [Fri, 5 Aug 2016 13:51:29 +0000 (09:51 -0400)]
Add blurbs for freeze-spec-const pass
Lei Zhang [Thu, 4 Aug 2016 22:26:22 +0000 (18:26 -0400)]
Create directory first if not existing and always refresh.
Lei Zhang [Thu, 4 Aug 2016 22:25:42 +0000 (18:25 -0400)]
Avoid redefining builtin dir.
qining [Tue, 2 Aug 2016 16:08:40 +0000 (12:08 -0400)]
Simple Assembly code builder for test uses
AssemblyBuilder contains boilplates.
Adds OpName instructions for all added defining instructions.
Adds OpDecorate SpecId for all spec constants added with OpSpecConstant,
OpSpecConstantTrue and OpSpecConstantFalse instructions.
David Neto [Thu, 4 Aug 2016 18:57:09 +0000 (14:57 -0400)]
Only check def dominance of reachable uses
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/295
David Neto [Tue, 2 Aug 2016 21:48:16 +0000 (17:48 -0400)]
Update CHANGES to reflect INotEqual update
qining [Tue, 26 Jul 2016 21:52:06 +0000 (17:52 -0400)]
Allow OpINotEqual in OpSpecConstantOp inst
Pendding for now until the spec is fixed.