Age | Commit message (Collapse) | Author | |
---|---|---|---|
2016-12-12 | new tests for the load optimization | Quentin Carbonneaux | |
2016-12-12 | implement a simple load elimination pass | Quentin Carbonneaux | |
2016-12-12 | implement a simple alias analysis | Quentin Carbonneaux | |
2016-12-12 | create cfg.c for cfg-related functions | Quentin Carbonneaux | |
2016-12-12 | make newtmp() return zeroed out temporaries | Quentin Carbonneaux | |
This was not necessary as temporaries were never freed and returned from an array zero initialized. But in the coming load optimization, we sometimes free temporaries by resetting fn->ntmp. | |||
2016-12-12 | new eight queens test | Quentin Carbonneaux | |
2016-12-08 | use a queue for copy elimination | Quentin Carbonneaux | |
2016-12-05 | move some liveness code where it belongs | Quentin Carbonneaux | |
2016-12-05 | disable pie (default on some os) | Quentin Carbonneaux | |
2016-11-09 | doc nits | Quentin Carbonneaux | |
2016-10-24 | return non-zero when tests fail | Quentin Carbonneaux | |
2016-10-24 | fix bug in folding of w comparisons | Quentin Carbonneaux | |
The casting to uint32_t made the code for comparing two signed words invalid. Interestingly, this can be fixed by casting to int32_t instead. Because sign extension is monotonic, all the unsigned comparisons remain valid. CVC4 can even check that for us: x, y : BITVECTOR(32); QUERY BVLT(SX(x, 64), SX(y, 64)) <=> BVLT(x, y); QUERY BVLE(SX(x, 64), SX(y, 64)) <=> BVLE(x, y); QUERY BVGT(SX(x, 64), SX(y, 64)) <=> BVGT(x, y); QUERY BVGE(SX(x, 64), SX(y, 64)) <=> BVGE(x, y); | |||
2016-10-22 | fix bug in copy propagation | Quentin Carbonneaux | |
The pass was not doing anything incorrect, but it missed some opportunities to optimize. On a copy heavy example I observed that, in the output of the pass a phi of the following shape remained: %a =w phi @A %c, @B %a Originally the phi for %a was: %a =w phi @A %b, @B %a Since %b was discovered a copy of %c, %a should have been eliminated and replaced with %c. I think the problem is that knowledge on the first argument of the phi %a changes as the algorithm progresses, a more detailed walk- through follows. In the first round of the algoritm, %a is discovered to be a copy of its first argument %b. phi(%b, %a) -> %b In the second round, %a is computed as the phi of %c (since the first argument changed) and %b (the result of the first iteration), in our lattice, the glb of those two is bottom. phi(%c, %b) -> %a (Bottom) Finally, there is a third round in which we compute %a as the phi of %a and %c, which again, gives bottom. phi(%c, %a) -> %a (Bottom) The bug is not tied to a phi of a copy, for example, if the first argument is speculated to be a copy of 0 and then, this knowledge is retracted; we will compute in sequence: phi(0, %a) -> 0 phi(%b, 0) -> %a (Bottom) phi(%b, %a) -> %a (Bottom) The way I fixed this is by ignoring arguments of the phi that were discovered to be copies of the phi node itself. This will make the last rounds above do the correct thing. | |||
2016-10-19 | improve tests output for contbuild | Quentin Carbonneaux | |
2016-10-19 | add magic for mobile viewing of doc | Quentin Carbonneaux | |
2016-09-27 | accept "ret" for functions with a return type | Quentin Carbonneaux | |
This happens to be needed for C. The standard mandates that a return value is used if the caller uses it. Surprisingly, if the return "value" is not used, the callee can use "return;". A better solution is to add an "undef" value and return it, "undef" would also have other use cases for compiling C. | |||
2016-08-17 | silent a few warnings | Quentin Carbonneaux | |
2016-08-16 | update help message of unit tester | Quentin Carbonneaux | |
2016-08-16 | add support for unions in sysv abi | Quentin Carbonneaux | |
2016-08-16 | parse union types | Quentin Carbonneaux | |
2016-08-15 | specify the allocation function in vnew | Quentin Carbonneaux | |
2016-08-14 | couple of case fixes in tokens | Quentin Carbonneaux | |
2016-08-14 | use an enum for aggregate segments | Quentin Carbonneaux | |
2016-08-14 | get rid of old Alt enum | Quentin Carbonneaux | |
2016-04-25 | fix type size computations in parser | Quentin Carbonneaux | |
The type sizes are important to get right because the ABI relies on them when it emits memory blits to pass/return structs. | |||
2016-04-23 | correctly update nuse for jump arguments | Quentin Carbonneaux | |
2016-04-22 | use short for classes (so it is signed for sure) | Quentin Carbonneaux | |
2016-04-22 | update documentation with new fp conversions | Quentin Carbonneaux | |
2016-04-22 | refine fp conversion instructions | Quentin Carbonneaux | |
2016-04-22 | make sure type sizes never overflow | Quentin Carbonneaux | |
2016-04-21 | oops fix wrong instruction names in doc | Quentin Carbonneaux | |
2016-04-21 | cosmetics in all.h | Quentin Carbonneaux | |
2016-04-21 | make mcc runable from anywhere | Quentin Carbonneaux | |
2016-04-20 | disallow phi nodes in the start block | Quentin Carbonneaux | |
AFL found this bug. | |||
2016-04-20 | support calls with no return | Quentin Carbonneaux | |
I thought it would be harder (and maybe it is). My fear was that a call must be always followed by a parallel move from machine registers (this is an assumption in both spill and rega). This however remains true, because the ABI code generates a dummy "copy RAX" by accident! | |||
2016-04-20 | normalize case in token names | Quentin Carbonneaux | |
2016-04-20 | match jumps/ops with il text | Quentin Carbonneaux | |
2016-04-19 | add compilation instructions | Quentin Carbonneaux | |
2016-04-19 | use assert for ssa invariants in fold/copy | Quentin Carbonneaux | |
2016-04-19 | check for trivial undefined uses in ssacheck | Quentin Carbonneaux | |
2016-04-19 | rename only live phi arguments in fold | Quentin Carbonneaux | |
AFL found that. | |||
2016-04-18 | add tool to process afl results | Quentin Carbonneaux | |
2016-04-18 | factor some subtyping logic in clsmerge() | Quentin Carbonneaux | |
2016-04-18 | phis can assign slots after spill | Quentin Carbonneaux | |
2016-04-18 | make sure non-register temporaries get a slot | Quentin Carbonneaux | |
Inside the main instruction-processing loop, it is taken care of by limit. However at block boundaries we are doing fancy bitset operations without calling limit. | |||
2016-04-18 | output debug to stderr in spiller | Quentin Carbonneaux | |
2016-04-18 | do not rewrite overwritten slots in memopt | Quentin Carbonneaux | |
2016-04-17 | compute dead phi args correctly in fold | Quentin Carbonneaux | |
The code computing if "the" edge of a phi argument is live or dead was wrong. AFL found that. | |||
2016-04-16 | use unsigned long long for bits | Quentin Carbonneaux | |
2016-04-16 | support trailing , in types/args/params | Ori Bernstein | |