Commit Graph

352 Commits

Author SHA1 Message Date
qining
b891845b53 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()
2016-08-17 23:13:01 -04:00
qining
6c5bdc9a39 Get the width from integer and float type 2016-08-17 20:33:56 -04:00
qining
e8b7c7b210 Replace the SetOperand() with SetInOperand() and SetResultType() 2016-08-16 15:05:07 -04:00
Lei Zhang
b65124f097 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.
2016-08-16 11:21:08 -04:00
Lei Zhang
9747d33d08 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.
2016-08-15 16:29:56 -04:00
Lei Zhang
1eec0ed4b9 Make analyses RAII-like and turn disable copy/move constructors. 2016-08-15 13:41:47 -04:00
Lei Zhang
097ff25ea7 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.
2016-08-15 10:44:14 -04:00
qining
c814911904 Add another construtor for opt::ir::Instruction 2016-08-13 11:17:11 -04:00
qining
d065593404 Add iterator getter interface for types_values_ 2016-08-12 15:10:51 -04:00
Umar Arshad
b01755a5e2 OpUndef can appear in type declaration section 2016-08-12 14:28:17 -04:00
Lei Zhang
94912ad1ba Turn off modifying methods for const iterators. 2016-08-12 14:05:41 -04:00
qining
81532584cb Clear old def-use record when re-analyze an ID 2016-08-12 13:04:07 -04:00
Lei Zhang
95dc16d1ec Add make_range() & make_const_range() for creating iterator ranges. 2016-08-12 10:34:47 -04:00
Lei Zhang
4b3247feba Avoid non-oneliner definition in class and add missing iterators. 2016-08-12 10:34:47 -04:00
qining
7a94e66433 Move the def-use analysis for single inst to public 2016-08-12 10:25:37 -04:00
qining
e5bb46d274 Add getter for pointee, element type 2016-08-11 20:53:57 -04:00
Lei Zhang
645ee1d9e0 Create an iterator class for in-memory representation. 2016-08-11 18:35:12 -04:00
qining
f949e321f2 Make the lookup up of type id accepts const arg 2016-08-11 18:21:57 -04:00
David Neto
82405cf499 Reuse the iterator on Id and type lookup 2016-08-11 18:18:12 -04:00
qining
f4e3a905d4 Add the const version of AsXXtype() interface. 2016-08-11 17:13:43 -04:00
qining
cd6d6c0ccf Add GetId(Type* type) API to the type manager 2016-08-11 15:10:09 -04:00
Lei Zhang
dda9de965d Make type manager RAII-like w.r.t. the module to be analyzed. 2016-08-10 12:53:17 -04:00
Lei Zhang
c562e231e3 Optimization: Add type manager.
Type manager will construct a map of types gradually from
instructions.
2016-08-10 12:53:17 -04:00
Lei Zhang
6d4d15b9d0 Optimization: Add type class hierarchy. 2016-08-10 12:53:17 -04:00
Lei Zhang
80c94a4fa8 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.
2016-08-10 12:11:33 -04:00
Lei Zhang
485f513a29 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.
2016-08-09 19:27:13 -04:00
David Neto
677ae7fbe8 Fix compilation. My bad
The API changed, and I forgot to submit this patch.
2016-08-09 18:23:40 -04:00
Umar Arshad
489204cf03 Check dominance of OpPhi parent and variable pairs 2016-08-09 18:19:47 -04:00
Umar Arshad
8ea1268f84 Removed dead code/const_casts/lists 2016-08-09 18:09:38 -04:00
qining
60461428f4 Separate pass.h from passes.h
Future pass implementations should only need to include pass.h
2016-08-09 17:16:52 -04:00
Umar Arshad
816f29805b Refactor Id -> Instruction 2016-08-09 15:50:03 -04:00
qining
51a2484b36 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.
2016-08-08 17:17:15 -04:00
Umar Arshad
fd965c9e7e Remove unnecessary headers 2016-08-07 10:11:49 -04:00
Umar Arshad
ffa42994fd Remove needless copies. Delete copy constructor.
* Deletes the ValidationState_t copy constructor
* Removes needless copies of the copy constructor
2016-08-06 12:24:19 -04:00
David Neto
c296701964 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.
2016-08-05 18:19:30 -04:00
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
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
c6465fb220 Avoid redefining builtin dir. 2016-08-05 10:23:41 -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
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
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