Commit Graph

10731 Commits

Author SHA1 Message Date
Jakob Stoklund Olesen
c040a495c0 Simplify check_arg_types().
Iterator tricks.
2017-04-19 14:59:02 -07:00
Jakob Stoklund Olesen
49c1209572 Fix broken test. 2017-04-17 15:45:55 -07:00
Jakob Stoklund Olesen
74595c6623 Fix broken test. 2017-04-17 15:45:55 -07:00
Jakob Stoklund Olesen
d424589daa Allow for special purpose function arguments and return values.
Enumerate a set of special purposes for function arguments that general
purpose code needs to know about. Some of these argument purposes will
only appear in the signature of the current function, representing
things the prologue and epilogues need to know about like the link
register and callee-saved registers.

Get rid of the 'inreg' argument flag. Arguments can be pre-assigned to a
specific register instead.
2017-04-17 15:06:30 -07:00
Jakob Stoklund Olesen
7e9bdcf059 Allow for special purpose function arguments and return values.
Enumerate a set of special purposes for function arguments that general
purpose code needs to know about. Some of these argument purposes will
only appear in the signature of the current function, representing
things the prologue and epilogues need to know about like the link
register and callee-saved registers.

Get rid of the 'inreg' argument flag. Arguments can be pre-assigned to a
specific register instead.
2017-04-17 15:06:30 -07:00
Jakob Stoklund Olesen
b151e942d9 Stop tracking if instruction formats have multiple results.
All instruction formats can represent multiple results now, so a few
redundant formats can be removed: UnarySplit and BinaryOverflow.
2017-04-13 12:27:39 -07:00
Jakob Stoklund Olesen
d3235eb81f Stop tracking if instruction formats have multiple results.
All instruction formats can represent multiple results now, so a few
redundant formats can be removed: UnarySplit and BinaryOverflow.
2017-04-13 12:27:39 -07:00
Jakob Stoklund Olesen
e5115d7793 Remove detach_secondary_results() and other cleanups.
- The detach_secondary_results() is a leftover from the two-plane value
  representation. Use detach_results() instead to remove all instruction
  results.
- Make the append_* DFG methods more direct. Don't depend on calling the
  corresponding attach_* methods. Just create a new value directly,
  using the values.next_key() trick.
2017-04-13 10:37:58 -07:00
Jakob Stoklund Olesen
bf74445eac Remove detach_secondary_results() and other cleanups.
- The detach_secondary_results() is a leftover from the two-plane value
  representation. Use detach_results() instead to remove all instruction
  results.
- Make the append_* DFG methods more direct. Don't depend on calling the
  corresponding attach_* methods. Just create a new value directly,
  using the values.next_key() trick.
2017-04-13 10:37:58 -07:00
Jakob Stoklund Olesen
3c8bdba15e Don't create value aliases when legalizing ABI boundaries.
When converting from ABI types to original program types, the final
conversion instruction can place its result into the original value, so
it doesn't need to be changed to an alias.
2017-04-13 10:16:58 -07:00
Jakob Stoklund Olesen
f9d3e65419 Don't create value aliases when legalizing ABI boundaries.
When converting from ABI types to original program types, the final
conversion instruction can place its result into the original value, so
it doesn't need to be changed to an alias.
2017-04-13 10:16:58 -07:00
Jakob Stoklund Olesen
7ad882c154 Avoid creating value aliases in legalizer/split.rs.
When we're splitting an EBB argument, we insert a iconcat/vconcat
instruction that computes the original value from the new split
arguments.

The concat instruction can now define the original value directly, it is
not necessary to define a new value and alias the old one.
2017-04-13 09:45:36 -07:00
Jakob Stoklund Olesen
c716d86c8d Avoid creating value aliases in legalizer/split.rs.
When we're splitting an EBB argument, we insert a iconcat/vconcat
instruction that computes the original value from the new split
arguments.

The concat instruction can now define the original value directly, it is
not necessary to define a new value and alias the old one.
2017-04-13 09:45:36 -07:00
Jakob Stoklund Olesen
d48f79aa72 Avoid creating aliases when expanding legalizer patterns.
Now that we can detach and reuse all values, there is no longer a need
to create a lot of alias values during pattern expansion. Instead, reuse
the values from the source pattern when emitting instructions in the
destination pattern.

If a destination instruction produces the exact same values as a source
instruction, simply leave the values attached and replace the
instruction it. Otherwise, detach the source values, reuse them in the
expansion, and remove the source instruction afterwards.
2017-04-13 09:30:21 -07:00
Jakob Stoklund Olesen
3ae0fe6e2b Avoid creating aliases when expanding legalizer patterns.
Now that we can detach and reuse all values, there is no longer a need
to create a lot of alias values during pattern expansion. Instead, reuse
the values from the source pattern when emitting instructions in the
destination pattern.

If a destination instruction produces the exact same values as a source
instruction, simply leave the values attached and replace the
instruction it. Otherwise, detach the source values, reuse them in the
expansion, and remove the source instruction afterwards.
2017-04-13 09:30:21 -07:00
Jakob Stoklund Olesen
48b2f421b4 Add a with_results() method to the InsertBuilder.
This makes it possible to reuse one or more result values in the
instruction that is being inserted.

Also add a with_result(v) method for the common case of reusing a single
result value. This could be specialized in the future.
2017-04-13 08:55:18 -07:00
Jakob Stoklund Olesen
e582183619 Add a with_results() method to the InsertBuilder.
This makes it possible to reuse one or more result values in the
instruction that is being inserted.

Also add a with_result(v) method for the common case of reusing a single
result value. This could be specialized in the future.
2017-04-13 08:55:18 -07:00
Jakob Stoklund Olesen
3197f240ff Add a make_inst_results_reusing() generic method.
This is a generalization of the existing make_inst_results() which lets
you provide some or all of the result values instead of creating all new
ones.
2017-04-13 08:18:52 -07:00
Jakob Stoklund Olesen
8252b05b92 Add a make_inst_results_reusing() generic method.
This is a generalization of the existing make_inst_results() which lets
you provide some or all of the result values instead of creating all new
ones.
2017-04-13 08:18:52 -07:00
Jakob Stoklund Olesen
d4f511ecfc Return the removed instruction from Cursor::remove_inst().
This is convenient for asserting that the right instruction was removed.
2017-04-13 08:18:52 -07:00
Jakob Stoklund Olesen
2e64bb88ba Return the removed instruction from Cursor::remove_inst().
This is convenient for asserting that the right instruction was removed.
2017-04-13 08:18:52 -07:00
Jakob Stoklund Olesen
801f4ade66 Add remove_inst() methods to Cursor and Layout.
We didn't have a way of removing instructions again.
2017-04-12 17:06:27 -07:00
Jakob Stoklund Olesen
bcb3882ef6 Add remove_inst() methods to Cursor and Layout.
We didn't have a way of removing instructions again.
2017-04-12 17:06:27 -07:00
Jakob Stoklund Olesen
84c15e0e66 Add some safety checks for detached values.
These methods are used to reattach detached values:

- change_to_alias
- attach_result
- attach_ebb_arg

Add an assertion to all of them to ensure that the provided value is not
already attached somewhere else. Use a new value_is_attached() method
for the test.

Also include a verifier check for uses of detached values.
2017-04-12 15:19:26 -07:00
Jakob Stoklund Olesen
e2f8924c30 Add some safety checks for detached values.
These methods are used to reattach detached values:

- change_to_alias
- attach_result
- attach_ebb_arg

Add an assertion to all of them to ensure that the provided value is not
already attached somewhere else. Use a new value_is_attached() method
for the test.

Also include a verifier check for uses of detached values.
2017-04-12 15:19:26 -07:00
Jakob Stoklund Olesen
18b567f88e Flatten the Value reference representation.
All values are now references into the value table, so drop the
distinction between direct and table values. Direct values don't exist
any more.

Also remove the parser support for the 'vxNN' syntax. Only 'vNN' values
can be parsed now.
2017-04-12 14:45:22 -07:00
Jakob Stoklund Olesen
23ae70cacf Flatten the Value reference representation.
All values are now references into the value table, so drop the
distinction between direct and table values. Direct values don't exist
any more.

Also remove the parser support for the 'vxNN' syntax. Only 'vNN' values
can be parsed now.
2017-04-12 14:45:22 -07:00
Jakob Stoklund Olesen
b165d9a313 Remove the first_type() methods from InstructionData.
Also remove the type field from all the variants. The type of the first
result value can be recovered from the value table now.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
7cac9dcb41 Remove the first_type() methods from InstructionData.
Also remove the type field from all the variants. The type of the first
result value can be recovered from the value table now.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
28ff7b7925 Move the ctrl_typevar function into dfg.
Soon, InstructionData won't have sufficient information to compute this.

Give TargetIsa::encode() an explicit ctrl_typevar argument. This
function does not require the instruction to be inserted in the DFG
tables.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
9c6a36d36d Move the ctrl_typevar function into dfg.
Soon, InstructionData won't have sufficient information to compute this.

Give TargetIsa::encode() an explicit ctrl_typevar argument. This
function does not require the instruction to be inserted in the DFG
tables.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
e653d44f39 Stop linking result values together.
Since results are in a value list, they don't need to form a linked
list any longer.

- Simplify make_inst_results() to create values in the natural order.
- Eliminate the last use of next_secondary_value().
- Delete unused result manipulation methods.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
00ee850e33 Stop linking result values together.
Since results are in a value list, they don't need to form a linked
list any longer.

- Simplify make_inst_results() to create values in the natural order.
- Eliminate the last use of next_secondary_value().
- Delete unused result manipulation methods.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
8a2398be08 Stop calling Value::new_direct.
We only ever create table values now.

Simplify legalizer::legalize_inst_results. Instead of calling
detach_secondary_results, just detach all the results and don't treat
the first result specially.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
b9808bedc4 Stop calling Value::new_direct.
We only ever create table values now.

Simplify legalizer::legalize_inst_results. Instead of calling
detach_secondary_results, just detach all the results and don't treat
the first result specially.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
d133606fe7 Don't assume all first results are direct values.
We're about to change that.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
06b52744db Don't assume all first results are direct values.
We're about to change that.
2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
94e26a845a Make tests less sensitive to specific value numbers. 2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
0be78f970c Make tests less sensitive to specific value numbers. 2017-04-12 14:32:13 -07:00
Jakob Stoklund Olesen
f8b473c428 Add detach_results(), attach_result(), and append_result() methods.
These low-level methods for manipulating instruction result value lists
will replace the existing secondary_result methods.
2017-04-12 11:50:59 -07:00
Jakob Stoklund Olesen
96cc0242a6 Add detach_results(), attach_result(), and append_result() methods.
These low-level methods for manipulating instruction result value lists
will replace the existing secondary_result methods.
2017-04-12 11:50:59 -07:00
Jakob Stoklund Olesen
0897d43c88 Don't attach a first result in make_inst().
That is now the job of make_inst_results().
2017-04-12 09:45:21 -07:00
Jakob Stoklund Olesen
08b4c5f524 Don't attach a first result in make_inst().
That is now the job of make_inst_results().
2017-04-12 09:45:21 -07:00
Jakob Stoklund Olesen
78a036fa51 Remove the second_result field from instructions.
Now that result values are stored in value lists in the DFG, these
head-of-list pointers are no longer needed.
2017-04-12 09:14:39 -07:00
Jakob Stoklund Olesen
8b840e0a9a Remove the second_result field from instructions.
Now that result values are stored in value lists in the DFG, these
head-of-list pointers are no longer needed.
2017-04-12 09:14:39 -07:00
Jakob Stoklund Olesen
71338bb31f Simplify the back-end of InstBuilder.
We don't want to distinguish between single-result and multiple-result
instructions any longer.

- Merge the simple_instruction() and complex_instruction() builder
  methods into a single build() that can handle all cases.
- All format constructors now take a ctrl_type argument. Previously,
  some would take a result_type argument.
- Instruction constructors no longer attempt to compute a single result
  type. Just pass a ctrl_type and let the backend decide.

Fix one format constructor call in legalizer/split.rs which now takes a
ctrl_type instead of a result type.
2017-04-12 08:56:20 -07:00
Jakob Stoklund Olesen
69180a2f84 Simplify the back-end of InstBuilder.
We don't want to distinguish between single-result and multiple-result
instructions any longer.

- Merge the simple_instruction() and complex_instruction() builder
  methods into a single build() that can handle all cases.
- All format constructors now take a ctrl_type argument. Previously,
  some would take a result_type argument.
- Instruction constructors no longer attempt to compute a single result
  type. Just pass a ctrl_type and let the backend decide.

Fix one format constructor call in legalizer/split.rs which now takes a
ctrl_type instead of a result type.
2017-04-12 08:56:20 -07:00
Jakob Stoklund Olesen
322a8db839 Change dfg.inst_results to return a slice.
Now we can access instruction results and arguments as well as EBB
arguments as slices.

Delete the Values iterator which was traversing the linked lists of
values. It is no longer needed.
2017-04-11 16:57:15 -07:00
Jakob Stoklund Olesen
3c99dc0eb4 Change dfg.inst_results to return a slice.
Now we can access instruction results and arguments as well as EBB
arguments as slices.

Delete the Values iterator which was traversing the linked lists of
values. It is no longer needed.
2017-04-11 16:57:15 -07:00
Jakob Stoklund Olesen
3a36435c3b Maintain a ValueList with the results of each instruction.
This is the first step of a larger refactoring to represent instruction
results as value lists instead of using linked lists. The refactoring
will also eliminate the special treatment of first results such that all
result values can be detached and redefined.

This change put us in a temporary state where results are represented
both as linked lists and ValueList vectors.

- Add a dfg.results table.
- Add the first result in make_inst(). This behavior will change.
- Recompute the result list in make_inst_results().
- Make dfg.first_result(inst) crash if the instruction has no results.
2017-04-11 16:21:41 -07:00