2011/12/31 Jonas Maebe <jonas.ma...@elis.ugent.be>: > * compiler/i386/daopt386.pas: data flow analysis (DFA, collects information > about what each register holds) > * compiler/i386/csopt386.pas: common subexpression elimination based on > information collected by DFA > * compiler/i386/rropt386.pas: register renaming based on the information > collected by DFA
Ok, this is a lot of code. I have removed it all ;-) I'm now playing around with this, trying to understand how the data looks like. I have replaced the original CSE() function with the following: function RemoveReload(asml: TAsmList; first, last: tai; pass: longint): boolean; var p : taicpu; begin if pass > 0 then exit; writeln; writeln('block:'); p := taicpu(first); repeat case p.typ of ait_label: begin writeln('label'); end; ait_instruction: begin writeln(p.GetString); end; end; if p <> last then p := taicpu(p.Next); until p = last; Result := False; end; This does nothing (I hope), only print something to the console: Compiling i386/testus.pas block: label [sub ???,???] label [mov ???,???] [mov ???,???] [mov ???,???] [mov ???,???] [dec ???] label [inc ???] [movsx ???,???] [mov ???,???] [sar ???,???] [mov ???,???] [mov ???,???] [movsx ???,???] [mov ???,???] [sar ???,???] [mov ???,???] [mov ???,???] [mov ???,???] [mov ???,???] [add ???,???] [adc ???,???] [mov ???,???] [mov ???,???] label [cmp ???,???] [j ???] label label [mov ???,???] [mov ???,???] [mov ???,???] [add ???,???] [ret] This looks good already ;-) I can even recognize my short test program (the for loop, the qword addition) even with all the question marks. This leads me to the first question: why are there question marks? Is it not yet known which registers will be used at this stage of compilation or am I just using the wrong method to dump it to the console? I have the following simple algorithm in mind: start at the beginning of the block, one instruction after the other, maintain a list of instructions, its empty at the beginning. repeat * if i come across a mov instruction and the exact same instruction is in my list already then remove it from the code. * if there comes a label then clear the list * if an instruction changes something (register or memory) that any of the instructions in my list depend upon then remove the affected instruction from the list. next instruction until end of block Would something like this work already? Now I need to find out the following things or how do I get them out of the properties of the taicpu class: * which registers does an instruction write to (if any) * which memory does it write to (if any) * which registers does it read from * which memory does it read from and: how can I for debugging purposes dump the instructions to the console, so that its easier for me so see what I have, are there any helper functions? more questions certainly to come... Bernd _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal