summaryrefslogtreecommitdiff
path: root/compiler/nadd.pas
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-10-01 20:33:03 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-10-01 20:33:03 +0000
commit30121efaf40706633b720f579885410d14e31ae0 (patch)
tree6e47fa2c79d2b13705ad0179e19bf8738673a197 /compiler/nadd.pas
parent52d78ceac799b825c9e2e54044104f5e547e424a (diff)
downloadfpc-30121efaf40706633b720f579885410d14e31ae0.tar.gz
+ optimize comparisons of constant pointers
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@47031 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/nadd.pas')
-rw-r--r--compiler/nadd.pas28
1 files changed, 28 insertions, 0 deletions
diff --git a/compiler/nadd.pas b/compiler/nadd.pas
index 5bff79cc74..1e3b5f203c 100644
--- a/compiler/nadd.pas
+++ b/compiler/nadd.pas
@@ -506,6 +506,7 @@ implementation
b : boolean;
cr, cl : Tconstexprint;
v2p, c2p, c1p, v1p: pnode;
+ p1,p2: TConstPtrUInt;
begin
result:=nil;
l1:=0;
@@ -1330,6 +1331,33 @@ implementation
exit;
end;
+ if is_constpointernode(left) and is_constpointernode(right) then
+ begin
+ p1:=0;
+ p2:=0;
+ if left.nodetype=pointerconstn then
+ p1:=tpointerconstnode(left).value;
+ if right.nodetype=pointerconstn then
+ p2:=tpointerconstnode(right).value;
+ case nodetype of
+ equaln:
+ result:=cordconstnode.create(ord(p1=p2),bool8type,false);
+ unequaln:
+ result:=cordconstnode.create(ord(p1<>p2),bool8type,false);
+ gtn:
+ result:=cordconstnode.create(ord(p1>p2),bool8type,false);
+ ltn:
+ result:=cordconstnode.create(ord(p1<p2),bool8type,false);
+ gten:
+ result:=cordconstnode.create(ord(p1>=p2),bool8type,false);
+ lten:
+ result:=cordconstnode.create(ord(p1<=p2),bool8type,false);
+ else
+ Internalerror(2020100101);
+ end;
+ exit;
+ end;
+
{ slow simplifications }
if cs_opt_level2 in current_settings.optimizerswitches then
begin