diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-10-01 20:33:03 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-10-01 20:33:03 +0000 |
commit | 30121efaf40706633b720f579885410d14e31ae0 (patch) | |
tree | 6e47fa2c79d2b13705ad0179e19bf8738673a197 /compiler/nadd.pas | |
parent | 52d78ceac799b825c9e2e54044104f5e547e424a (diff) | |
download | fpc-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.pas | 28 |
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 |