| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
Would hit the limit on very large functions (thanks csmith).
|
| | |
|
| |
|
|
|
|
| |
With `i64 %a = copy 0xabcdef12345`, if `%a` was spilled, this would turn
into a `storei64` instruction with an unencondable immediate operand
(larger than 32 bits in x86, non-zero in aarch64).
|
| | |
|
| |
|
|
|
|
| |
Previously if an inlined function has a return statement with no value
(control flow reaching the closing brace of the function), would use an
invalid null reference in the inlined body. Turn it into undef.
|
| |
|
|
|
| |
The extra work of using a hashtable to intern them is probably
unnecessary.
|
| |
|
|
|
|
|
| |
These didn't show up atp before but with inlining, for example, a
noreturn function, they could be introduced. And the pass ordering means
they wouldn't have been cleaned up before filldom(). An unreachable
block having no dominator makes sense too.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
I'll figure it out later, but I better not have a broken trunk
|
| | |
|
| |
|
|
| |
hackish..
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
| |
Also change xcon to have a flagset for symbols (whether it's a function,
locally defined; later: thread local, etc).
|
| |
|
|
|
| |
Is much simpler than the growable buffers, seems to be just as efficient
if not a little faster when benchmarked.
|
| |
|
|
| |
Vestigial, wasn't enough and we're sorting uses in mem2reg now.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
Reuse irbinop() and irunop() for the constant results cases.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
It was all over the place for temporary data structures used by
individual passes. Now there is an arena specifically for that, which is
nicer.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
| |
There's plenty of code duplication like this around I'm looking to
reduce.
|
| |
|
|
|
|
|
| |
Was used for situation where we needed to spill more than 1 temporary
and have to use a register that is already used. Instead of push/pop, we
can just allocate and set aside specific stack slots for this purpose.
Also, reworked linearscan() interval sets to separate FPR/GPR intervals.
|
| | |
|
| |
|
|
| |
Also, in regalloc ensure fixed intervals are sorted
|
| | |
|
| |
|
|
| |
Also changed the type to size_t for portability
|
| |
|
|
|
|
|
| |
deltrivialphis() was iterating over every variably instead of just
looking at the variable being examined. And I'd been wondering why
mem2reg was such a bottleneck for a testcase like sqlite3 amalgamation..
it's easy to miss the forest for the trees.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Interned strings are used pervasively, so it's a good idea to add a
layer of type safety to differentiate them from general cstrs and avoid
potential bugs from comparing non-interned and interned strings. Not
that that's happened so far that I can remember, but it could.
I'm 90% sure it's legal to alias `struct {char c;}` pointers with `char`
pointers. This specific typedef gives type safety but with a simple
one-way `internstr -> const char *` typecast (with `&istr->c`).
Converting the other way around is more intentional: a straight up cast
`(internstr)cstr` which sticks out as unchecked and probably wrong, or
calling the intern(cstr) function, which is the right way.
|
| |
|
|
|
| |
Being in lex.c was vestigial, since it was being used all over the
frontend and backend.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously, given something like
```
1 a = ...
2 loop { // outer
3 b = do something with a
4 loop { // inner
5 ...
6 if (b < 0)
7 break 'inner;
8 if (b == 0)
9 return;
10 ...
11 }
12 }
```
Regalloc thought outer goes from 2..6, because 6 is the last place where
flow jumps directly back to 2. So `a` would have the lifetime [1,7).
However if neither the break nor return are taken, the inner loop
repeats and then control could flow back to 7 -> 3. But now the physical
location for `a` might have been clobbered between 8..10, which is
wrong. This fixes that by making sure the outer loop is considered to
span 2..10.
The way I went about it might not be the best way of doing it. I'm not
100% certain that it's fully correct and will always find the correct
loopend, either. It's surprising it took this long to hit this edge
case.
|
| | |
|