LLVM: remove use of getelementptr in make_simple_ref_ptr

We cannot safely infer whether it needs to be indirect or not there,
it should be done at a higher level if appropriate.
This commit is contained in:
Jonas Maebe 2023-01-07 22:11:36 +01:00
parent 51fdbb5524
commit 00a5d30300

View File

@ -2066,7 +2066,6 @@ implementation
hreg1, hreg1,
hreg2: tregister; hreg2: tregister;
tmpref: treference; tmpref: treference;
pointedsize: asizeint;
begin begin
if ref.alignment=0 then if ref.alignment=0 then
internalerror(2016072203); internalerror(2016072203);
@ -2079,41 +2078,9 @@ implementation
result:=ref; result:=ref;
exit; exit;
end; end;
case ptrdef.typ of { At this levevl, perform all calculations using plain pointer arithmetic.
pointerdef: Optimizations based on getelementptr for structured accesses need to be
begin performed at the node tree level.
pointedsize:=tpointerdef(ptrdef).pointeddef.size;
{ void, formaldef }
if pointedsize=0 then
pointedsize:=1;
end;
else
begin
{ pointedsize is only used if the offset <> 0, to see whether we
can use getelementptr if it's an exact multiple -> set pointedsize
to a value that will never be a multiple as we can't "index" other
types }
pointedsize:=ref.offset+1;
end;
end;
hreg2:=getaddressregister(list,ptrdef);
{ symbol+offset or base+offset with offset a multiple of the size ->
use getelementptr }
if (ref.index=NR_NO) and
(ref.offset mod pointedsize=0) then
begin
ptrindex:=ref.offset div pointedsize;
if assigned(ref.symbol) then
reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment,ref.volatility)
else
reference_reset_base(tmpref,ptrdef,ref.base,0,ref.temppos,ref.alignment,ref.volatility);
list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg2,ptrdef,tmpref,ptruinttype,ptrindex,assigned(ref.symbol)));
reference_reset_base(result,ptrdef,hreg2,0,ref.temppos,ref.alignment,ref.volatility);
exit;
end;
{ for now, perform all calculations using plain pointer arithmetic. Later
we can look into optimizations based on getelementptr for structured
accesses (if only to prevent running out of virtual registers).
Assumptions: Assumptions:
* symbol/base register: always type "ptrdef" * symbol/base register: always type "ptrdef"