# Copyright (C) 2005, The Perl Foundation.
# $Id: /parrotcode/trunk/compilers/imcc/ChangeLog 470 2006-12-05T03:30:45.414067Z svm  $

- 2005-12-07	particle
	* moved imcc/ directory to compilers/imcc/

- 2003-11-03	Bernhard Schmalhofer
	* Migrate TestCompiler.pm to Parrot/Test.pm

- 2003-11-03	melvin
	* move register allocation and spill related code to reg_alloc.c
	* cleanup some routine names
	* make imc_compile_unit the main entry point from parser -> compiler
	* Add some initial framework for collecting all compilation units
	  before compiling or emitting anything.

- 2003-10-13	leo
	* report error location inside macros too
	* allow macro defintions outsied of subs

- 2003-09-29	leo

	* new .nci_call directive
	* updated docs/calling_conventions for NCI
	* the return label after a pcc/nci_call is now optional
	* check param count of unprototyped P params too

- 2003-09-19	sfink
	* version number change to 0.0.11.0 for parrot 0.0.11 release

- 2003-08-23	leo

	* start moving globals tointerpreter->imcc_info

- 2003-08-23	leo

	* REMOVE THE DEPRECATED NESTED SUBS FEATURE.

	  All code must be contained now in .sub/.pcc_sub/.emit blocks.
	  For PASM source files an .emit/.eom is provided by the lexer.

- 2003-08-22	leo

	* HLL line and file information.
	  The lexer parses now:

	    #line\s(\d+)\s"([^"]*)"
	    setfile\s+"([^"])*"
	    setline\s+(\d+)

	  as HLL file/line information.
	  The setline and setfile opcodes are *not* emitted.

	  This information will go into some debug segment.

- 2003-08-12	leo

	* lexer: enable macros for PIR parsing mode

- 2003-08-11	leo

	* PCC: approaching life analysis for subroutine in/out variables
	       this breaks some imcpasm tests

- 2003-08-10	leo

	* PCC: experimental tail call optimization with -Oc

- 2003-08-09	leo

	* PCC: fix nested subs (preserve ret continuation)
	* PCC: fix multiple return blocks

	* SYNTAX:

	  NEW: unless arg1 relop arg2 goto label

	  works like if (with reversed relop), so that $HL can
	  directly translate:
	    if (a < b)
	      {block}
	    [skip:]
	  to
	    unless a < b goto skip
	      block
	      ...
	    skip:

- 2003-08-08	leo

	* try_find_op: e.g. add_n_i_n => add_n_n_i

- 2003-08-02	leo

	* DEPRECATE NESTED SUBROUTINES and CODE OUTSIDE OF SUBS

	* fix CFG for pcc invoke
	* use want_regno in register assignments for -Oc
	* pcc_optimize() experimental post_optimizer -Oc

- 2003-08-01	leo

	* version 0.0.10.3

	* unprototyped subroutines now check the amount and type
	  of parameters against their .param definitions at runtime
	* TestCompiler.pm: capture stderr too

	* added coroutine code courtesy of Kenneth A Graves
	  s. t/syn/pcc.t for an example and #23186 for a description

	* if a pcc sub calls another sub (or it yields), the passed
	  registers (I5...) are not used as parameters dirctly.
	* emit savetop/restoretop in a yield block

- 2003-07-30	leo

	* PCC stuff:
	* prototyped calling sequence
	* overflow array
	* put all in a separate file: pcc.c

- 2003-07-29	leo

	* version 0.0.10.2
	* first try on implementing PCC from docs/calling_conventions.pod
	  - no optimizations
	  - only upper half of registers are preserved
	  - s. t/imcpasm/pcc.t for generated code

	* ignore text between =$pod_marker and =cut

- 2003-07-09	leo

	* version 0.0.10.1
	* -E, --pre-process-only

- 2003-07-06	leo

	* new instruction:
	  $Preg = new classname, $Pinitializer

- 2003-07-03	leo

	* switch to PASM/PIR mode, when reading .pasm/.imc include files
	* search runtime/parrot/include too for includes

- 2003-07-02	leo

	* build imcc as parrot
	* bump version

	-------------------
	* various fixes
	* newsub opcode fixup
	* constant_propagation (-O2) (by Matt Fowles)

- 2003-02-22	leo / Juergen Boemmels

	* correct line numbers for debugger WRT macros
	  (thanks to Juergen Boemmels)
	* first try to get effects of clear?, pop?, restoreall
	  ops into register life info

- 2003-02-21	leo

	* version 0.0.9.15
	* opimized some ugly quadratic timings in cfg building
	  and branch optimizations by:
	* build bb_list earlier and use basic blocks
	  This improves e.g.  -O2 t/op/stacks_33 from >1m to 2s

	* absolute experimental and early stages for using imcc
	  as JIT optimizer (-Oj) this is broken WRT rx_ops, which
	  have an inout INT param and can branch, and WRT NCI/invoke
	  and probably a lot more.

- 2003-02-20	leo / Juergen Boemmels

	* version 0.0.9.14
	* macro preprocessor - thanks Juergen Boemmels
	  s. docs/macros.pod

	* lot of constants optimizations, like add I0, 10, 20
	* reorganized optimization levels
	* run allocate for PASM code too, if optimizing

- 2003-02-08 	leo
        * changed branch_branch to optimize a sequence of absolute
	  branches to branch to the final target
	* dead blocks removal
	* unreachable lines removal

	  *****************************************************
	  make the long announced rule fix:
	  o global labels MUST start with an underscore
	  o labels of bsr calls are global
	  o labels of set_addr op are global
	  o local labels SHOULD NOT start with an underscore
	  *****************************************************

- 2003-02-08 	leo
	* version 0.0.9.13
	* pass -Ox on to tests
	* remove dead code
	* remove branch to next ins
	* fix use_count for invoke and .local vars
	* don't remove unused global labels

- 2003-02-07 	leo
	* first step for bsr handling in the CFG
	  local bsrs (target in the same compilation unit) can
	  preserve registers.

	  s. docs/operation.pod

- 2003-02-07 	leo
	* version 0.0.9.12
	* changed -d (--debug) options and made more granular
	  debug output. s. docs/running.pod

- 2003-01-31 	leo
	* version 0.0.9.11
	* changed the until now global Parrot_Interp * to
	  a local one
	  This implies:
	  *****************************************************
	  CHANGES in many function prototypes, which now take a
	  interpreter param
	  *****************************************************

- 2003-01-20	leo
	* version 0.0.9.10
	* the -r command line option is now optional, default mode now
	  is running the program, except when a -o output is given
	* the -c option now means: assume PBC on stdin and run it.
	* imcc_compile
	* generate file/line info for programs and compile ops

- 2003-01-14	leo

	* version 0.0.9.9.
	* fix const integer multi keys
	* recognize op_fullnames
	* allow reserved word (i.e. parrot ops) as labels

- 2002-12-12	leo

	* version 0.0.9.8
	* .const directive
	* identifier and const scope

- 2002-12-09	leo

	* version 0.0.9.7
	* docs/*.pod
	* nested subs
	* _global label
	* imcpasm tests

- 2002-12-07	leo

	* version 0.0.9.6
	* split imcc.y -> main.c parser_util.c
	* INS takes now an additional param "emit"
	* make namespace running

- 2002-12-xx

	* added t/harness stuff

	* SYNTAX change:

	.sub / ret => .sub / .end

- 2002-09-15	leo

	* fixed GC bug, BUFFER_constant_FLAG!
	  imcc runs now all perl6 tests like parrot

- 2002-09-12	leo

	* pbc.c / packout.c / perl6

	  Write .pbc files.

	* imcc.y / imcc.l

	  Allow mixed usage of $I0, I0, and _Lexicals

	* imcc.y / symreg.[ch] / instruction.c / imc.c

	  Implement key structures P["key"; 0; $I42 ]

- 2002-09-11	leo

	* removed anyop.c/h. If we need more then one lib
	  the core should provide this functionality.

	* parrot core
	  proposed changes WRT op_lib, op_code() lookup,
	  and core_ops organization including patches
	  for prederefencing (ok now).

- 2002-09-10	leo

	Bigger changes to allow running PBC inside imcc,
	no external assembler, no parrot{,.exe} needed anymore.

	$ perl6 --test -r -RG

	runs _all_ perl6 tests w/o complaints

	Changes in execution sequence:

	* imcc.l

	- expect_eol is gone
	- expect_pasm, <emit>
	- STRINGCONSTANT patch from list
	- .emit reworked

	* imcc.y

	- infrastructure for parsing key structures
	- rewrote all instructions to go through iANY
	  (except some pseudos like labels)
	- rewrote iNEW + new macro helper
	- opfullname reworked
	- iANY implement keyed format P[]
	- moved branch flags to iANY

	- changed many %types from SymReg * to Instructions *,
	  what they actually are.
	- emit is now a sub like token
	- added pasm* syntax
	- nls between subs
	- keylist [ key ; key ]

	- use parrot compatible commandline options
	  (long options to come later)
	- additionally:
	  -G turn off GC
	  -c write .pbc
	  -r run PBC
	  -o outputfile (can't use second file as output,
	     this is a run argument for the first).

	* symreg.h

	- reorganized VT flags
	- ->nextkey field
	- low level hash functions taking a hash as param too

	* symreg.c

	- mk_pasm_reg, + low level funcs
	- check for uniq labels / subs
	- keys structures

	* instructions.c / .h

	- abstraction of emit_xx interface throug emitters[]
	- deprecate _mk_instruction (no opcode lookup!)

	* debug.c

	- add opnum and opsize to dump_instructions

	* imc.c, optimizer.c

	- use iANY

	* NEW pbc.c pbc,h

	- generate PBC in memory (a unpacked packfile)
	  This uses currently existing structures, like SymReg
	  to hold various information, so r->color might be e.g.
	  a index into the constants table.

	  UTSL for more

	* GONE anyop.c / .h

	  Many thanks to Sean, for providing these two files, plus
	  the first iANY instruction, this was really the kick, to get
	  above running.


2002-09-04	leo

	* pbc.c

	- start coding, first 3 liner get's executed in imcc
	- link to libparrot$(A)

	* symreg.c

	- data members for parrot ops

	* Makefile, imcc.y, anyop.c

	- use parrot structures for anyop

2002-09-04	leo

	* cfg.c

	- reworked find_basic_blocks
	- loop_info: remember size, depth...
	- dead code detection

	* instructions.h

	- removed redundant ->basic_block

	* optimizer.c

	- loop_optimization
	- branch_branch

	* symreg.c

	- detect duplicate labels


2002-09-02	leo

	* overall

	- cleanup, memory freeing
	- warning/info/fatal code for diagnostics
	- include file cleanup

	* anyop.c

	- integrated GC patch

	* cfg.c

	- find_basic_blocks() 2. branch of two consecutive
	- propagate_alias
	- remember loop_info

	* debug.c

	- fatal(), warning(), info(), ...
	- more info in dump_instructions()
	- dump_loops
	- more info in dump_symreg()

	* imc.c

	- register usage statistic
	- rearranged alloc() loop
	- separated reglist out of interference_graph
	- build_interference_graph() splitted and optimized
	- use always life_info
	- much simpler spill(), no additional symbols needed

	* imcc.l

	- {EOL} code for CR/LF systems (untested)

	* imcc.y

	- total rewrite of functions, using anyop where possible
	- cleanup
	- commandline switches --help, --version, -O

	* instructions.c

	- use a linked list instead an array of ins
	- allow 16 registers per instruction
	- delete_ins()
	- rewrote emit()

	* instructions.h

	- rearranged INSTYPE flags
	- ins->op

	* sets.c

	- bugfix und cleanup
	- set_clear()

	* symreg.c

	- cleanup
	- free_sym()

	* symreg.h

	- use_count, lhs_use_count

	* optimizer.c (NEW)

	- if_branch(): if x, L1 / branch L2 / L1: => unless x, L2 / L1:
	- unused_labels() removal



2002-09-02	leo

	* ChangeLog startet after parrot 0.0.8 release
	  above summarizes all changes from ~mid 0.07
