Commit Graph

612 Commits

Author SHA1 Message Date
David Neto
e712f826b6 Hide implementations of BasicBlock::dominates,postdominates 2016-08-05 16:55:21 -04:00
David Neto
605847f15b Track a construct by its entry block. 2016-08-05 16:05:44 -04:00
David Neto
b51b80980c 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.
2016-08-05 15:15:37 -04:00
David Neto
3bf4dc102f Add BasicBlock methods: dominates postdominates 2016-08-05 15:14:18 -04:00
David Neto
bb4c0b1af6 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.
2016-08-05 15:12:47 -04:00
Lei Zhang
71fac5a29c Check configuration and gmock existence when adding unit tests. 2016-08-05 14:38:18 -04:00
David Neto
3184687714 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
2016-08-05 11:09:29 -04:00
qining
5be1ee173f Add blurbs for freeze-spec-const pass 2016-08-05 10:39:50 -04:00
Lei Zhang
0d8ddd0b75 Create directory first if not existing and always refresh. 2016-08-05 10:23:41 -04:00
Lei Zhang
c6465fb220 Avoid redefining builtin dir. 2016-08-05 10:23:41 -04:00
qining
d37ecb924a 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.
2016-08-04 16:45:59 -04:00
David Neto
621fa3961f Only check def dominance of reachable uses
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/295
2016-08-04 14:58:27 -04:00
David Neto
50707a1257 Update CHANGES to reflect INotEqual update 2016-08-02 17:48:16 -04:00
qining
256c56db89 Allow OpINotEqual in OpSpecConstantOp inst
Pendding for now until the spec is fixed.
2016-08-02 15:11:27 -04:00
David Neto
9acc0f1401 Never generate % for a friendly disassembled Id
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/290
2016-08-02 11:59:10 -04:00
David Neto
e7a9e00738 Add disabled test for phi variable def-use check
Disabled because doing a proper check requires much more
code, and it can wait.
2016-07-29 20:00:38 -04:00
David Neto
1408aea260 Avoid checking def-use dominance for OpPhi value operands
The def-use dominance checker doesn't have enough info to know
that a particular use is in an OpPhi, so skip tracking those uses
for now.  Add a TODO to do a proper OpPhi variable-argument check
in the future.

Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/286
2016-07-29 20:00:38 -04:00
Lei Zhang
64ff3c6dc1 Optimization: Add def use analysis. 2016-07-29 15:45:14 -04:00
Lei Zhang
1db4cb456b Use default copy/move constructors/assignments for Instruction. 2016-07-29 00:58:09 -04:00
Lei Zhang
dcf28bf6ce Allow missing memory model instructions in modules. 2016-07-29 00:58:09 -04:00
David Neto
c978b72477 Fix infinite loop in dominance calculation.
Ensure the dominance calculation visits all nodes in the CFG.
The successor list of the pseudo-entry node is augmented with
a single node in each cycle that otherwise would not be visited.
Similarly, the predecssors list of the pseduo-exit node is augmented
with the a single node in each cycle that otherwise would not
be visited.

Pulls DepthFirstSearch out so it's accessible outside of the dominator
calculation.

Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/279
2016-07-28 16:40:55 -04:00
Qining
74eb532a1d Merge pull request #284 from Qining/fix-freeze-spec-const-pass-test
Fix a test failure in pass manager test
2016-07-28 15:33:16 -04:00
qining
4750895943 Fix a test failure in pass manager test
Change "Null" to "null" in pass manager test
2016-07-28 15:30:37 -04:00
qining
a24506266b Freeze spec constants to their default values
Add a pass to freeze spec constants to their default values. This pass does
not fold the frozen spec constants and does not handle SpecConstantOp
instructions and SpecConstantComposite instructions.
2016-07-28 15:23:30 -04:00
qining
ac46512b05 Add an utility: in-place string replacement 2016-07-28 12:11:34 -04:00
qining
d503d75cc3 Use friendly disassembly output 2016-07-28 09:39:42 -04:00
Umar Arshad
efc782d743 Check definitions appear in dominator of use
Also address use and def of ID in same instruction
2016-07-26 16:09:16 -04:00
Umar Arshad
66c94928a3 Refactor IDs definition and use tracking
* Creates an ID class which manages definition and use of IDs
* Moved tracking code from validate.cpp to validate_id.cpp
* Rename and combine SsaPass and ProcessIds into IdPass
* Remove module dependency in Function
2016-07-26 13:36:41 -04:00
Umar Arshad
6c61bf2dfa Fixes segfault for loops without back-edges
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/270
2016-07-25 13:21:44 -04:00
Lei Zhang
45af1dd83d Start v2016.2. 2016-07-19 16:50:34 -04:00
Lei Zhang
1e7c5cbe90 Finalize v2016.1. 2016-07-19 16:50:34 -04:00
David Neto
0bdcc23f7e Disassembling: map IDs to friendly names.
Add a FriendlyNameMapper to deduce friendly names for IDs based on
OpName, type structure, etc.
2016-07-19 16:28:17 -04:00
Lei Zhang
1a9385bbd0 Track changes in SPIRV-Headers for SPIR-V 1.1 rev 2.
* The `Input` StorageClass doesn't require the `Shader` capability
  anymore.
* The `Sampled1D` and `SampledBuffer` capabilities don't require
  the `Shader` capability anymore. So they do not indirectly
  depend on the `Matrix` capability. So are the `Image1D` and
  `ImageBuffer` capabilities, which depend on `Sampled1D` and
  `SampledBuffer`.

A new GLSL grammar file is uploaded for SPIR-V 1.1, but it's the
same as the existing one for SPIR-V 1.0.

Now tracking commit 3814effb879ab5a98a7b9288a4b4c7849d2bc8ac in
SPIRV-Headers.
2016-07-18 11:55:16 -04:00
David Neto
06581f5ce6 Turn off ClipDistance CullDistance cap checks for Vulkan
Turn them off until resolution of the debate over how they should be checked.
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/261
2016-07-08 11:47:40 -04:00
Lei Zhang
cbdba0323c Mention the steps to pull dependencies when building in README. 2016-07-07 15:07:31 -04:00
David Neto
e59007320e Test v1.1 loop dependency support
For DependencyInfinite and DependencyLength, test
that they don't require a capability to be turned on.
Also, that they are assembled, binary parsed, and disassembled
correctly.
2016-07-05 12:05:00 -04:00
David Neto
ce7ced138f Start v2016.1-dev 2016-07-04 18:12:08 -04:00
David Neto
84058939b0 Finalize v2016.0 2016-07-04 16:02:52 -04:00
Lei Zhang
23a3c2f762 DRY file writing code in tools. 2016-06-30 15:56:47 -04:00
Lei Zhang
7fd27e737a DRY file reading code in tools. 2016-06-30 15:56:20 -04:00
Lei Zhang
2f84ffc99c Rework CMake configuration for tools. 2016-06-30 13:56:34 -04:00
Lei Zhang
310bc84cf7 Add the spirv-opt command line tool. 2016-06-30 13:20:40 -04:00
Lei Zhang
2c4c73cf37 Add Pass, PassManager, and StripDebugInfoPass. 2016-06-29 17:32:00 -04:00
David Neto
e461cbe268 Avoid capability checks on ID values. They are not literals
Works around issue 248 by weakening the test:
https://github.com/KhronosGroup/SPIRV-Tools/issues/248

The validator should try to track (32-bit) constant values, and then
for capability checks on IDs, check the referenced value, not the
raw ID number.
2016-06-29 10:39:21 -04:00
Lei Zhang
f760d115b9 Add tests for the cpp interface. 2016-06-28 14:52:35 -04:00
Lei Zhang
abf8f6413c Promote ir namespace and create draft libspirv.{h|c}pp. 2016-06-28 14:52:34 -04:00
Lei Zhang
8590f9cc81 Add IrBuilder for constructing SPIR-V in-memory representation. 2016-06-27 16:57:42 -04:00
Lei Zhang
200e897887 Add an option to spvBinaryToText() to ignore header output. 2016-06-27 15:25:24 -04:00
Umar Arshad
886dd352d5 Fix several violations of the style guide 2016-06-27 10:45:46 -04:00
Lei Zhang
3df8f7cebd Add classes for representing SPIR-V language constructs in memory. 2016-06-24 20:54:06 -04:00