Bill Currie
a0c28a5ac5
[qfcc] Support pointers to temp operands
...
This is necessary for correctly taking the address of operands.
2020-03-16 14:24:47 +09:00
Bill Currie
2f07d9a310
[qfcc] Improve accuracy of some more diagnostics
2020-03-16 10:42:18 +09:00
Bill Currie
51a30de9c5
[qfcc] Print accurate linenos for more ICEs
2020-03-14 16:51:54 +09:00
Bill Currie
4a8854d9ed
[qfcc] Add expression tracking to operands
...
Not much uses it yet, but it will make for better diagnostics.
2020-03-11 12:51:34 +09:00
Bill Currie
bcf75b541a
[qfcc] Build movep dest pointer correctly
...
This fixes the mangled pointer in struct-init-param.r.
2020-03-08 17:40:38 +09:00
Bill Currie
b996fb7aa4
Make operand->type actual type instead of low-level
...
And clean up the resulting mess. This fixes struct copy, but uncovers
another bug :/
2019-06-17 23:38:34 +09:00
Bill Currie
d6d3027411
Mark the correct operand as live
...
This fixes vecexpr (and possibly other cases).
2019-06-16 19:21:02 +09:00
Bill Currie
6e21c3ae2e
Treat func statements similarly to flow statements
...
func statements need their operands marked live like flow statements do
because usage is more indirect.
2019-06-16 19:20:21 +09:00
Bill Currie
db4a7a139e
Use the alias code when making vars live
...
Not sure the live forcing flag is needed anymore (need to test).
2019-06-16 19:17:45 +09:00
Bill Currie
2977c145d0
Clean up dag live alias code a little
...
Mainly, this makes it possible to reuse the alias code.
2019-06-16 19:17:01 +09:00
Bill Currie
c40f4194e9
Use tempop_visit_all for flow and dags
...
Fixes t3 of vecexpr, but t2 is broken (lost first assignment).
2019-06-16 16:56:39 +09:00
Bill Currie
3c4903245a
Fix some curly space
2019-06-16 16:55:54 +09:00
Bill Currie
fa69aeef0f
Improve handling of temp aliases
...
This makes all tests pass when not optimizing. More work needs to be
done in dags.
2019-06-12 00:37:02 +09:00
Bill Currie
cc27949a34
Ensure pointer values always have a type
...
The dags generator was creating a pointer value with no type which
caused print_statement to segfault.
2019-06-10 23:52:39 +09:00
Bill Currie
78e0a8dc52
Support assigning non-constant vector expressions.
2018-10-12 22:05:17 +09:00
Bill Currie
34bcf7faab
Do a pure/const/noreturn/format attribute pass.
...
I always wanted these, but as gcc now provides warnings for functions that
could do with such attributes, finding all the functions is much easier.
2018-10-09 12:42:21 +09:00
Bill Currie
2fcda44ab0
Kill dag leaf nodes on assignment.
...
Fixes the failing swap test caused by a's original value being used (via t)
after being written.
2018-08-23 20:07:22 +09:00
Bill Currie
ca0b03687f
Change the naming of ALLOC's free-list.
...
Rather than prefixing free_ to the supplied name, suffix _freelist to the
supplied name. The biggest advantage of this is it allows the free-list to
be a structure member. It also cleans up the name-space a little.
2013-03-08 22:16:31 +09:00
Bill Currie
e27d7cbd2d
Handle alloca "correctly".
...
Use AC_FUNC_ALLOCA and the #ifdef mess suggested by the autoconf docs
(hidden in qfalloca.h).
2013-01-22 21:02:50 +09:00
Bill Currie
412fb4aacd
Fix a static out of bounds error.
...
I really must compile with optimizations more often :P
2012-12-26 11:51:40 +09:00
Bill Currie
386a729209
Remove dead nodes from dags.
...
Dead nodes are those that generate unused values (unassigned leaf nodes,
expressions or destinationless move(p) nodes). The revoval is done by the
flow analysis code (via the dags code) so that any pre and post removal
flow analysis and manipulation may be done (eg, available expressions).
2012-12-25 17:07:58 +09:00
Bill Currie
33bb422849
Force .param_N to be live when adding the edge to its node.
...
This fixes the segfault/null pointer access in sendv.r. While I wanted to
use the edge setting code to set the live bit, I didn't expect it to be
this easy. def_visit_all is proving to be worth every bit it consumes :)
2012-12-22 14:38:38 +09:00
Bill Currie
84a68b139e
Rename set_iter_t's value to element.
...
Correct terminology and all :)
2012-12-21 14:09:00 +09:00
Bill Currie
6c2d0b04d3
Directly generate MOVEP for variable destination pointers.
...
When the destination pointer is variable, the MOVEP node will not have any
identifiers attached to it, so generate_moveps must not be used.
2012-12-20 21:28:34 +09:00
Bill Currie
7b1850917d
Force RETURN's operand to be live.
...
This seems to be the final fix to get return-ivar.r working.
2012-12-20 21:18:27 +09:00
Bill Currie
13f09b10d6
Generate MOVEPs for attached identifiers.
...
The "address operator" has been stripped from the identifer so it needs to
be rebuilt, and the identifier itself is returned as the destination.
2012-12-20 20:58:19 +09:00
Bill Currie
453dacb356
Nuke dag_set_live_vars.
...
It is no longer needed thanks to the exit dummy node used for making
globals live.
2012-12-20 20:57:11 +09:00
Bill Currie
cc0373cdca
Correct a pair of spelling mistakes.
...
Hopefully, noone would ever see them anyway.
2012-12-20 20:55:25 +09:00
Bill Currie
5ec4598fce
Fix a double out-by-one error.
...
This fixes the aliasing problem brought to light by the recent dead-code
removal work.
* taniwha dons a brown paper bag.
2012-12-20 16:33:01 +09:00
Bill Currie
dc55034708
Mark aliases as live when a label is attached to a leaf node.
...
This fixes the lost return values in the menus.
2012-12-13 21:20:21 +09:00
Bill Currie
a7b7a114bc
Don't kill the node to which an alias is being assigned.
...
This does not fix the lost return value the menus as that is caused by the
alias not being marked live when it should be.
2012-12-13 21:06:04 +09:00
Bill Currie
decc3845c5
Kill any aliases when assigning to an aliased def.
...
Temps aren't supported yet :P
The alias defs themselves aren't killed (still want any assignments to
occur) but rather, their nodes are. Also, edges to the alias defs' nodes
are added to the assigning node. Fixes structlive.r :)
2012-12-13 14:43:43 +09:00
Bill Currie
d990a956c0
More label count paranoia.
...
MOVEP can generate 4 daglabels.
2012-12-13 12:48:07 +09:00
Bill Currie
c295a0473e
Add edges from call nodes to their param nodes.
...
Assinments to .param_N (0-7 for call, 2-7 for rcall) must occur before the
call, or weird things will happen.
2012-12-13 09:55:28 +09:00
Bill Currie
c477191488
Be a little more paranoid about daglabel counts.
...
I'm still a little worried about the number of labels needed with heavy
alias usage.
2012-12-13 09:50:18 +09:00
Bill Currie
028b19888f
Check aliases for liveness when removing dead vars.
...
The live var flow analysis doesn't check for aliases. Rather than changing
it to check for aliases (which might break uninitialized var analysis, as
it uses "use" from the live var analysis), make dag_remove_dead_vars do the
check. Fixes the misplaced text in the menus.
2012-12-12 23:15:55 +09:00
Bill Currie
48821f379f
Set edges/live for addressed variables.
...
This fixes (again:P) the messup with .super.
2012-12-12 12:55:17 +09:00
Bill Currie
03fdbe9b86
Ensure the def is aliasing before adding edges.
...
Getting two nodes doubly connected for *to = *from++; was interesting.
2012-12-12 12:52:01 +09:00
Bill Currie
75be251d65
Create and use def_visit_all.
...
Even though it turned out there were only two copies of the def alias
handling code, I got tired of writing it. The code is easier to read, too
:)
2012-12-12 12:01:31 +09:00
Bill Currie
76c9aa2930
Handle alias defs when building a dag.
...
When an alais def (or aliased def) is used, any overlapping aliases that
have previously been assigned need to be marked as live, and edges to the
aliases added to the new node. However, when assigned to, live-forcing
needs to be turned off.
This fixes the lost assignments to .super.
2012-12-11 19:57:19 +09:00
Bill Currie
7607c7d649
Resurrect alias operands.
...
It turns out they are necessary for the code output from dags. This fixes
the ice for *to = *from++;
2012-12-11 15:52:37 +09:00
Bill Currie
8452f69a21
Use only the real temp for daglabels.
...
This fixes the bogus temps for "*to = *from++;", but qfcc ices due to the
operand types being lost. It seems alias operands need to be resurrected,
if only for code output by dags.
2012-12-11 15:20:52 +09:00
Bill Currie
e0c92b6089
Rename set_iter_t's member to value.
...
Makes more sense now that the membership of the value depends on the
inversion of the set.
2012-12-06 21:11:38 +09:00
Bill Currie
eb8fd55677
Move set.c into libQFutil.
...
Also move the ALLOC/FREE macros from qfcc.h to QF/alloc.h (needed to for
set.c).
Both modules are more generally useful than just for qfcc (eg, set
builtins for ruamoko).
2012-12-06 20:52:53 +09:00
Bill Currie
3f3b501c58
Move flowvar/deflabel from symbol_t to def_t.
...
With the need to handle aliasing in the optimizer, it has become apparent
that having the flow data attached to symbols is not nearly as useful as
having it attached to defs (which are views of the actual variables).
This also involves a bit of a cleanup of operand types: op_pointer and
op_alias are gone (this seems to greatly simplify the optimizer)
There is a bit of a problem with enums in switch statements, but this might
actually be a sign that something is not quite right in the switch code
(other than enums not being recognized as ints for jump table
optimization).
2012-12-05 19:47:22 +09:00
Bill Currie
5e9d7d3567
Don't use the expr type for assignments.
...
Instead, the type is taken from the source operand (this means the computed
type of .return for that var). ctf now builds :)
2012-11-30 21:06:08 +09:00
Bill Currie
738fc65e0f
Treat global vars as always live.
...
This fixes the infloop.r test.
2012-11-24 14:56:30 +09:00
Bill Currie
bdafdad0d5
Treat flow control statements separately.
...
I'm not convinced this is the correct fix for while (count--), but it does
work.
2012-11-24 12:53:51 +09:00
Bill Currie
607d7dd45e
Simplify the child match in dagnode_match.
...
I have no idea why I did it that way when all that's needed is to check the
child pointers. Well, that's modulo.r fixed :)
2012-11-22 21:59:01 +09:00
Bill Currie
4b5e00afdf
Do a bunch of refactoring.
...
The dag creation loop was getting too messy.
2012-11-21 18:30:44 +09:00