* disable pass2inline

This commit is contained in:
peter 2004-12-02 19:26:14 +00:00
parent 0d1d1a2c1b
commit 959bdccc49
6 changed files with 141 additions and 74 deletions

View File

@ -24,6 +24,8 @@ unit ncal;
{$i fpcdefs.inc}
{ define NODEINLINE}
interface
uses
@ -67,8 +69,9 @@ interface
procedure order_parameters;
procedure createinlineparas(var createstatement, deletestatement: tstatementnode);
function replaceparaload(var n: tnode; arg: pointer): foreachnoderesult;
function replaceparaload(var n: tnode; arg: pointer): foreachnoderesult;
procedure createlocaltemps(p:TNamedIndexItem;arg:pointer);
function pass1_inline:tnode;
protected
pushedparasize : longint;
public
@ -85,8 +88,10 @@ interface
methodpointerinit,
methodpointerdone : tblocknode;
methodpointer : tnode;
{$ifdef PASS2INLINE}
{ inline function body }
inlinecode : tnode;
{$endif PASS2INLINE}
{ varargs parasyms }
varargsparas : tvarargsparalist;
{ node that specifies where the result should be put for calls }
@ -707,7 +712,9 @@ type
methodpointerdone:=nil;
procdefinition:=nil;
_funcretnode:=nil;
{$ifdef PASS2INLINE}
inlinecode:=nil;
{$endif PASS2INLINE}
paralength:=-1;
varargsparas:=nil;
end;
@ -724,7 +731,9 @@ type
procdefinition:=nil;
callnodeflags:=[cnf_return_value_used];
_funcretnode:=nil;
{$ifdef PASS2INLINE}
inlinecode:=nil;
{$endif PASS2INLINE}
paralength:=-1;
varargsparas:=nil;
end;
@ -823,7 +832,9 @@ type
methodpointerinit.free;
methodpointerdone.free;
_funcretnode.free;
{$ifdef PASS2INLINE}
inlinecode.free;
{$endif PASS2INLINE}
if assigned(varargsparas) then
begin
for i:=0 to varargsparas.count-1 do
@ -848,7 +859,9 @@ type
methodpointerinit:=tblocknode(ppuloadnode(ppufile));
methodpointerdone:=tblocknode(ppuloadnode(ppufile));
_funcretnode:=ppuloadnode(ppufile);
{$ifdef PASS2INLINE}
inlinecode:=ppuloadnode(ppufile);
{$endif PASS2INLINE}
end;
@ -862,7 +875,9 @@ type
ppuwritenode(ppufile,methodpointerinit);
ppuwritenode(ppufile,methodpointerdone);
ppuwritenode(ppufile,_funcretnode);
{$ifdef PASS2INLINE}
ppuwritenode(ppufile,inlinecode);
{$endif PASS2INLINE}
end;
@ -879,8 +894,10 @@ type
methodpointerdone.buildderefimpl;
if assigned(_funcretnode) then
_funcretnode.buildderefimpl;
{$ifdef PASS2INLINE}
if assigned(inlinecode) then
inlinecode.buildderefimpl;
{$endif PASS2INLINE}
end;
@ -901,8 +918,10 @@ type
methodpointerdone.derefimpl;
if assigned(_funcretnode) then
_funcretnode.derefimpl;
{$ifdef PASS2INLINE}
if assigned(inlinecode) then
inlinecode.derefimpl;
{$endif PASS2INLINE}
{ Connect parasyms }
pt:=tcallparanode(left);
while assigned(pt) and
@ -961,10 +980,12 @@ type
n._funcretnode:=_funcretnode.getcopy
else
n._funcretnode:=nil;
{$ifdef PASS2INLINE}
if assigned(inlinecode) then
n.inlinecode:=inlinecode.getcopy
else
n.inlinecode:=nil;
{$endif PASS2INLINE}
if assigned(varargsparas) then
begin
n.varargsparas:=tvarargsparalist.create;
@ -1955,7 +1976,7 @@ type
end
else
begin
tempnode := ctempcreatenode.create(tabstractvarsym(p).vartype,tabstractvarsym(p).vartype.def.size,tt_persistent,tparavarsym(p).varregable<>vr_none);
tempnode := ctempcreatenode.create(tabstractvarsym(p).vartype,tabstractvarsym(p).vartype.def.size,tt_persistent,tabstractvarsym(p).varregable<>vr_none);
addstatement(tempinfo^.createstatement,tempnode);
if assigned(tlocalvarsym(p).defaultconstsym) then
begin
@ -2049,13 +2070,48 @@ type
end;
function tcallnode.pass_1 : tnode;
function tcallnode.pass1_inline:tnode;
var
createstatement,deletestatement: tstatementnode;
createblock,deleteblock: tblocknode;
i: longint;
label
errorexit;
begin
if not assigned(tprocdef(procdefinition).inlininginfo^.code) then
internalerror(200412021);
{ inherit flags }
current_procinfo.flags := current_procinfo.flags + ((procdefinition as tprocdef).inlininginfo^.flags*inherited_inlining_flags);
{ create blocks for loading/deleting of local data }
createblock:=internalstatements(createstatement);
deleteblock:=internalstatements(deletestatement);
inlinelocals:=tlist.create;
{ replace complex parameters with temps }
createinlineparas(createstatement,deletestatement);
{ replace the parameter loads with the parameter values }
foreachnode(result,@replaceparaload,@fileinfo);
{ free the temps for the locals }
for i := 0 to inlinelocals.count-1 do
if assigned(inlinelocals[i]) then
tnode(inlinelocals[i]).free;
inlinelocals.free;
inlinelocals:=nil;
addstatement(createstatement,tprocdef(procdefinition).inlininginfo^.code.getcopy);
addstatement(createstatement,deleteblock);
{ set function result location if necessary }
if assigned(funcretnode) and
(cnf_return_value_used in callnodeflags) then
addstatement(createstatement,funcretnode.getcopy);
{ consider it must not be inlined if called
again inside the args or itself }
procdefinition.proccalloption:=pocall_default;
firstpass(createblock);
procdefinition.proccalloption:=pocall_inline;
{ return inlined block }
result := createblock;
end;
function tcallnode.pass_1 : tnode;
begin
result:=nil;
@ -2064,49 +2120,8 @@ type
{ can we inline this procedure at the node level? }
(tprocdef(procdefinition).inlininginfo^.inlinenode) then
begin
{ inherit flags }
current_procinfo.flags := current_procinfo.flags + ((procdefinition as tprocdef).inlininginfo^.flags*inherited_inlining_flags);
if assigned(methodpointer) then
CGMessage(cg_e_unable_inline_object_methods);
if assigned(right) then
CGMessage(cg_e_unable_inline_procvar);
if assigned(inlinecode) then
internalerror(2004071110);
if assigned(tprocdef(procdefinition).inlininginfo^.code) then
result:=tprocdef(procdefinition).inlininginfo^.code.getcopy
else
CGMessage(cg_e_no_code_for_inline_stored);
if assigned(result) then
begin
createblock := internalstatements(createstatement);
deleteblock := internalstatements(deletestatement);
inlinelocals:=tlist.create;
{ replace complex parameters with temps }
createinlineparas(createstatement,deletestatement);
{ replace the parameter loads with the parameter values }
foreachnode(result,@replaceparaload,@fileinfo);
{ free the temps for the locals }
for i := 0 to inlinelocals.count-1 do
if assigned(inlinelocals[i]) then
tnode(inlinelocals[i]).free;
inlinelocals.free;
inlinelocals:=nil;
addstatement(createstatement,result);
addstatement(createstatement,deleteblock);
{ set function result location if necessary }
if assigned(funcretnode) and
(cnf_return_value_used in callnodeflags) then
addstatement(createstatement,funcretnode.getcopy);
result := createblock;
{ consider it must not be inlined if called
again inside the args or itself }
procdefinition.proccalloption:=pocall_default;
firstpass(result);
procdefinition.proccalloption:=pocall_inline;
exit;
end;
result:=pass1_inline;
exit;
end;
{$endif NODEINLINE}
@ -2157,6 +2172,7 @@ type
begin
if procdefinition.deftype<>procdef then
internalerror(200411071);
{$ifdef PASS2INLINE}
{ calc the correture value for the register }
{ handle predefined procedures }
if (procdefinition.proccalloption=pocall_inline) then
@ -2184,6 +2200,7 @@ type
end;
end
else
{$endif PASS2INLINE}
begin
if not (block_type in [bt_const,bt_type]) then
include(current_procinfo.flags,pi_do_call);
@ -2292,16 +2309,18 @@ type
end;
end;
{$ifdef PASS2INLINE}
{ determine the registers of the procedure variable }
{ is this OK for inlined procs also ?? (PM) }
if assigned(inlinecode) then
begin
registersfpu:=max(inlinecode.registersfpu,registersfpu);
registersint:=max(inlinecode.registersint,registersint);
{$ifdef SUPPORT_MMX}
{$ifdef SUPPORT_MMX}
registersmmx:=max(inlinecode.registersmmx,registersmmx);
{$endif SUPPORT_MMX}
{$endif SUPPORT_MMX}
end;
{$endif PASS2INLINE}
{ determine the registers of the procedure variable }
{ is this OK for inlined procs also ?? (PM) }
if assigned(right) then
@ -2321,9 +2340,10 @@ type
registersmmx:=max(left.registersmmx,registersmmx);
{$endif SUPPORT_MMX}
end;
errorexit:
{$ifdef PASS2INLINE}
if assigned(inlinecode) then
procdefinition.proccalloption:=pocall_inline;
{$endif PASS2INLINE}
end;
{$ifdef state_tracking}
@ -2409,7 +2429,10 @@ begin
end.
{
$Log$
Revision 1.265 2004-11-28 14:34:59 jonas
Revision 1.266 2004-12-02 19:26:14 peter
* disable pass2inline
Revision 1.265 2004/11/28 14:34:59 jonas
* only try to replace locals from the inlined procedure with temps,
cycle now works with -dNODEINLINE

View File

@ -68,7 +68,7 @@ interface
uses
globtype,systems,
cutils,verbose,cpuinfo,
cutils,verbose,
aasmbase,aasmtai,aasmcpu,symsym,symconst,
defutil,
nflw,pass_2,
@ -324,9 +324,17 @@ interface
procedure tcgblocknode.pass_2;
var
hp : tstatementnode;
oldexitlabel : tasmlabel;
begin
location_reset(location,LOC_VOID,OS_NO);
{ replace exitlabel? }
if nf_block_with_exit in flags then
begin
oldexitlabel:=current_procinfo.aktexitlabel;
objectlibrary.getlabel(current_procinfo.aktexitlabel);
end;
{ do second pass on left node }
if assigned(left) then
begin
@ -342,6 +350,13 @@ interface
hp:=tstatementnode(hp.right);
end;
end;
{ write exitlabel }
if nf_block_with_exit in flags then
begin
cg.a_label(exprasmlist,current_procinfo.aktexitlabel);
current_procinfo.aktexitlabel:=oldexitlabel;
end;
end;
@ -491,7 +506,10 @@ begin
end.
{
$Log$
Revision 1.71 2004-11-11 19:31:33 peter
Revision 1.72 2004-12-02 19:26:15 peter
* disable pass2inline
Revision 1.71 2004/11/11 19:31:33 peter
* fixed compile of powerpc,sparc,arm
Revision 1.70 2004/11/08 22:09:59 peter

View File

@ -48,7 +48,9 @@ interface
private
procedure release_para_temps;
procedure normal_pass_2;
{$ifdef PASS2INLINE}
procedure inlined_pass_2;
{$endif PASS2INLINE}
procedure pushparas;
procedure freeparas;
protected
@ -364,10 +366,12 @@ implementation
objectlibrary.getlabel(falselabel);
secondpass(left);
if not(assigned(aktcallnode.inlinecode)) then
paramanager.createtempparaloc(exprasmlist,aktcallnode.procdefinition.proccalloption,parasym,tempcgpara)
{$ifdef PASS2INLINE}
if assigned(aktcallnode.inlinecode) then
paramanager.duplicateparaloc(exprasmlist,aktcallnode.procdefinition.proccalloption,parasym,tempcgpara)
else
paramanager.duplicateparaloc(exprasmlist,aktcallnode.procdefinition.proccalloption,parasym,tempcgpara);
{$endif PASS2INLINE}
paramanager.createtempparaloc(exprasmlist,aktcallnode.procdefinition.proccalloption,parasym,tempcgpara);
{ handle varargs first, because parasym is not valid }
if (cpf_varargs_para in callparaflags) then
@ -698,7 +702,9 @@ implementation
{ better check for the real location of the parameter here, when stack passed parameters
are saved temporary in registers, checking for the tmpparaloc.loc is wrong
}
{$ifdef PASS2INLINE}
if not assigned(inlinecode) then
{$endif PASS2INLINE}
paramanager.freeparaloc(exprasmlist,ppn.tempcgpara);
tmpparaloc:=ppn.tempcgpara.location;
callerparaloc:=ppn.parasym.paraloc[callerside].location;
@ -738,7 +744,9 @@ implementation
end;
LOC_REFERENCE:
begin
{$ifdef PASS2INLINE}
if not assigned(inlinecode) then
{$endif PASS2INLINE}
begin
{$ifdef cputargethasfixedstack}
reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset);
@ -781,7 +789,10 @@ implementation
ppn:=tcgcallparanode(left);
while assigned(ppn) do
begin
if not assigned(inlinecode) or
if
{$ifdef PASS2INLINE}
not assigned(inlinecode) or
{$endif PASS2INLINE}
(ppn.parasym.paraloc[callerside].location^.loc <> LOC_REFERENCE) then
paramanager.freeparaloc(exprasmlist,ppn.parasym.paraloc[callerside]);
ppn:=tcgcallparanode(ppn.right);
@ -1030,6 +1041,7 @@ implementation
end;
{$ifdef PASS2INLINE}
procedure tcgcallnode.inlined_pass_2;
var
oldaktcallnode : tcallnode;
@ -1224,6 +1236,7 @@ implementation
current_procinfo:=oldprocinfo;
inlining_procedure:=oldinlining_procedure;
end;
{$endif PASS2INLINE}
procedure tcgcallnode.pass_2;
@ -1231,9 +1244,11 @@ implementation
if assigned(methodpointerinit) then
secondpass(methodpointerinit);
{$ifdef PASS2INLINE}
if assigned(inlinecode) then
inlined_pass_2
else
{$endif PASS2INLINE}
normal_pass_2;
if assigned(methodpointerdone) then
@ -1247,7 +1262,10 @@ begin
end.
{
$Log$
Revision 1.188 2004-11-21 18:13:31 peter
Revision 1.189 2004-12-02 19:26:15 peter
* disable pass2inline
Revision 1.188 2004/11/21 18:13:31 peter
* fixed funcretloc for sparc
Revision 1.187 2004/11/21 17:54:59 peter

View File

@ -240,7 +240,10 @@ interface
nf_inlineconst,
{ tasmnode }
nf_get_asm_position
nf_get_asm_position,
{ tblocknode }
nf_block_with_exit
);
tnodeflags = set of tnodeflag;
@ -1136,7 +1139,10 @@ implementation
end.
{
$Log$
Revision 1.90 2004-11-02 12:55:16 peter
Revision 1.91 2004-12-02 19:26:15 peter
* disable pass2inline
Revision 1.90 2004/11/02 12:55:16 peter
* nf_internal flag for internal inserted typeconvs. This will
supress the generation of warning/hints

View File

@ -101,7 +101,9 @@ implementation
begin
{ not in one statement, won't work because of b- }
result := foreachnode(tcallnode(n).methodpointer,f,arg) or result;
{$ifdef PASS2INLINE}
result := foreachnode(tcallnode(n).inlinecode,f,arg) or result;
{$endif PASS2INLINE}
end;
ifn, whilerepeatn, forn:
begin
@ -147,7 +149,9 @@ implementation
calln:
begin
result := foreachnodestatic(tcallnode(n).methodpointer,f,arg) or result;
{$ifdef PASS2INLINE}
result := foreachnodestatic(tcallnode(n).inlinecode,f,arg) or result;
{$endif PASS2INLINE}
end;
ifn, whilerepeatn, forn:
begin
@ -526,7 +530,10 @@ end.
{
$Log$
Revision 1.22 2004-11-28 19:29:45 jonas
Revision 1.23 2004-12-02 19:26:15 peter
* disable pass2inline
Revision 1.22 2004/11/28 19:29:45 jonas
* loadvmtaddrn and loadparentfpn both have complexity 1 (the latter
fixes compilation of tw0935 with nodeinlining)

View File

@ -937,15 +937,6 @@ implementation
end;
function containsforbiddennode(var n: tnode; arg: pointer): foreachnoderesult;
begin
if (n.nodetype <> exitn) then
result := fen_false
else
result := fen_norecurse_true;
end;
function checknodeinlining(procdef: tprocdef): boolean;
var
i : integer;
@ -966,8 +957,7 @@ implementation
is_special_array(currpara.vartype.def) then
exit;
end;
{ we currently can't handle exit-statements (would exit the caller) }
result := not foreachnodestatic(procdef.inlininginfo^.code,@containsforbiddennode,nil);
result:=true;
end;
@ -1057,6 +1047,8 @@ implementation
procdef.inlininginfo^.code:=code.getcopy;
procdef.inlininginfo^.flags:=current_procinfo.flags;
procdef.inlininginfo^.inlinenode:=checknodeinlining(procdef);
if procdef.inlininginfo^.code.nodetype=blockn then
include(procdef.inlininginfo^.code.flags,nf_block_with_exit);
end
else
procdef.inlininginfo^.code:=code;
@ -1438,7 +1430,10 @@ implementation
end.
{
$Log$
Revision 1.220 2004-11-29 18:50:15 peter
Revision 1.221 2004-12-02 19:26:15 peter
* disable pass2inline
Revision 1.220 2004/11/29 18:50:15 peter
* os2 fixes for import
* asmsymtype support for intel reader