Zdenek Dvorak wrote:
Hello,
In principle, I don't see anything forbidding Zdenek's idea.
Unfortunately, what I avoided to mention is that TARGET_MEM_REF nodes
are also transformed into pointer arithmetics
and the equivalent
INDIRECT_REF memory access... therefore, this is not an option even only
because of that.
hmm... why you do that? Could you please describe more precisely what
are you trying to achieve?
Sure!
The short answer is that, though most GIMPLE tree codes closely match
what is representable in the CIL bytecode, some do not; hence, such
codes are "lowered" into equivalent expressions that directly match what
is representable in the bytecode.
this seems quite close to what TARGET_MEM_REFs are designed for. IMHO,
the best way would be to lower the memory references to TARGET_MEM_REFs
(*) just once, sometime quite late in the optimization pipeline (just after
loop optimizations, for example), so that high-level optimizers/alias
analysis see the easy to understand code, while at least the essential
cleanups are performed on the lower level code.
Hi Zdenek,
but the only kind of TARGET_MEM_REFs we would really allow would be
those with a base and no symbol, no index, no step, no offset... which
look to me like INDIRECT_REFs!
But if it were possible to make TARGET_MEM_REF carry alias information
that INDIRECT_REFs are not able to carry, then I think it would make
sense to transform non-zero index ARRAY_REFs into this very simple form
of TARGET_MEM_REFs plus some pointer arithmetics.
This is an excerpt of tree.def:
/* Low-level memory addressing. Operands are SYMBOL (static or global
variable), BASE (register), INDEX (register), STEP (integer constant),
OFFSET (integer constant). Corresponding address is
SYMBOL + BASE + STEP * INDEX + OFFSET. Only variations and values
valid on
the target are allowed.
The sixth argument is the reference to the original memory access, which
is preserved for the purposes of the RTL alias analysis. The seventh
argument is a tag representing results of the tree level alias
analysis. */
DEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 7)
Are you talking about the seventh argument?
Cheers,
Roberto
Zdenek
(*) or just the pointer arithmetics like you do now, if you have some
reasons for avoiding TMRs, although then you have to rerun the pass once
later to get rid of invalid forms that may be created by the optimizers.