Optimized the comparison of a widestring variable with ''

This commit is contained in:
Sergey Larin 2022-01-27 15:35:15 +03:00 committed by FPK
parent 35db2b2da3
commit 60c967f255

View File

@ -3290,7 +3290,7 @@ implementation
var
p: tnode;
newstatement : tstatementnode;
tempnode (*,tempnode2*) : ttempcreatenode;
tempnode : ttempcreatenode;
cmpfuncname: string;
para: tcallparanode;
begin
@ -3399,8 +3399,6 @@ implementation
{ generate better code for comparison with empty string, we
only need to compare the length with 0 }
if (nodetype in [equaln,unequaln,gtn,gten,ltn,lten]) and
{ windows widestrings are too complicated to be handled optimized }
not(is_widestring(left.resultdef) and (target_info.system in systems_windows)) and
(((left.nodetype=stringconstn) and (tstringconstnode(left).len=0)) or
((right.nodetype=stringconstn) and (tstringconstnode(right).len=0))) then
begin
@ -3419,40 +3417,18 @@ implementation
result := caddnode.create(nodetype,
cinlinenode.create(in_length_x,false,left),
cordconstnode.create(0,s8inttype,false))
else
else { nodetype in [equaln,unequaln] }
begin
(*
if is_widestring(left.resultdef) and
(target_info.system in system_windows) then
if is_widestring(left.resultdef) and (tf_winlikewidestring in target_info.flags) then
begin
{ windows like widestrings requires that we also check the length }
result:=internalstatements(newstatement);
tempnode:=ctempcreatenode.create(voidpointertype,voidpointertype.size,tt_persistent,true);
tempnode2:=ctempcreatenode.create(resultdef,resultdef.size,tt_persistent,true);
addstatement(newstatement,tempnode);
addstatement(newstatement,tempnode2);
{ poor man's cse }
addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(tempnode),
ctypeconvnode.create_internal(left,voidpointertype))
);
addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(tempnode2),
caddnode.create(orn,
caddnode.create(nodetype,
ctemprefnode.create(tempnode),
cpointerconstnode.create(0,voidpointertype)
),
caddnode.create(nodetype,
ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(tempnode)),s32inttype),
cordconstnode.create(0,s32inttype,false)
)
)
));
addstatement(newstatement,ctempdeletenode.create_normal_temp(tempnode));
addstatement(newstatement,ctempdeletenode.create_normal_temp(tempnode2));
addstatement(newstatement,ctemprefnode.create(tempnode2));
result:=cinlinenode.create(in_length_x,false,left);
{ and compare its result with 0 }
result:=caddnode.create(equaln,result,cordconstnode.create(0,s8inttype,false));
if nodetype=unequaln then
result:=cnotnode.create(result);
end
else
*)
begin
{ compare the pointer with nil (for ansistrings etc), }
{ faster than getting the length (JM) }