summary refs log tree commit diff
AgeCommit message (Collapse)Author
2016-12-12new tests for the load optimizationQuentin Carbonneaux
2016-12-12implement a simple load elimination passQuentin Carbonneaux
2016-12-12implement a simple alias analysisQuentin Carbonneaux
2016-12-12create cfg.c for cfg-related functionsQuentin Carbonneaux
2016-12-12make newtmp() return zeroed out temporariesQuentin 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-12new eight queens testQuentin Carbonneaux
2016-12-08use a queue for copy eliminationQuentin Carbonneaux
2016-12-05move some liveness code where it belongsQuentin Carbonneaux
2016-12-05disable pie (default on some os)Quentin Carbonneaux
2016-11-09doc nitsQuentin Carbonneaux
2016-10-24return non-zero when tests failQuentin Carbonneaux
2016-10-24fix bug in folding of w comparisonsQuentin 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-22fix bug in copy propagationQuentin 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-19improve tests output for contbuildQuentin Carbonneaux
2016-10-19add magic for mobile viewing of docQuentin Carbonneaux
2016-09-27accept "ret" for functions with a return typeQuentin 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-17silent a few warningsQuentin Carbonneaux
2016-08-16update help message of unit testerQuentin Carbonneaux
2016-08-16add support for unions in sysv abiQuentin Carbonneaux
2016-08-16parse union typesQuentin Carbonneaux
2016-08-15specify the allocation function in vnewQuentin Carbonneaux
2016-08-14couple of case fixes in tokensQuentin Carbonneaux
2016-08-14use an enum for aggregate segmentsQuentin Carbonneaux
2016-08-14get rid of old Alt enumQuentin Carbonneaux
2016-04-25fix type size computations in parserQuentin 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-23correctly update nuse for jump argumentsQuentin Carbonneaux
2016-04-22use short for classes (so it is signed for sure)Quentin Carbonneaux
2016-04-22update documentation with new fp conversionsQuentin Carbonneaux
2016-04-22refine fp conversion instructionsQuentin Carbonneaux
2016-04-22make sure type sizes never overflowQuentin Carbonneaux
2016-04-21oops fix wrong instruction names in docQuentin Carbonneaux
2016-04-21cosmetics in all.hQuentin Carbonneaux
2016-04-21make mcc runable from anywhereQuentin Carbonneaux
2016-04-20disallow phi nodes in the start blockQuentin Carbonneaux
AFL found this bug.
2016-04-20support calls with no returnQuentin 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-20normalize case in token namesQuentin Carbonneaux
2016-04-20match jumps/ops with il textQuentin Carbonneaux
2016-04-19add compilation instructionsQuentin Carbonneaux
2016-04-19use assert for ssa invariants in fold/copyQuentin Carbonneaux
2016-04-19check for trivial undefined uses in ssacheckQuentin Carbonneaux
2016-04-19rename only live phi arguments in foldQuentin Carbonneaux
AFL found that.
2016-04-18add tool to process afl resultsQuentin Carbonneaux
2016-04-18factor some subtyping logic in clsmerge()Quentin Carbonneaux
2016-04-18phis can assign slots after spillQuentin Carbonneaux
2016-04-18make sure non-register temporaries get a slotQuentin 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-18output debug to stderr in spillerQuentin Carbonneaux
2016-04-18do not rewrite overwritten slots in memoptQuentin Carbonneaux
2016-04-17compute dead phi args correctly in foldQuentin Carbonneaux
The code computing if "the" edge of a phi argument is live or dead was wrong. AFL found that.
2016-04-16use unsigned long long for bitsQuentin Carbonneaux
2016-04-16support trailing , in types/args/paramsOri Bernstein