[llvm-dev] Intrinsics InstrReadMem memory properties

Doerfert, Johannes via llvm-dev llvm-dev at lists.llvm.org
Wed Jul 24 08:27:55 PDT 2019


Hi Son Tuan Vu,

if not restricted by *writeonly*, *readonly*, or *readnone* (basically), a call can access any object for which the
callee could potentially know the address. That means, if the address of an object cannot be known to the callee,
it cannot access that object. An example is given below. Thus, a dead store can be eliminated if the memory cannot
be read by any subsequent operation. If you think there is a bug, could you provide a reproducer?

Example:

void unknown();
void foo() {
   int *A = malloc(100 * sizeof(A[0]));
   int B[100];
  for (int i = 0; i < 100; i++)
    A[i] = B[i] = i;

  // The addresses/objects A and B are not known to the unknown function and the stores above can be removed.
  unknown();

  free(A);
}

I hope this helps,
  Johannes


________________________________________
From: llvm-dev <llvm-dev-bounces at lists.llvm.org> on behalf of Son Tuan VU via llvm-dev <llvm-dev at lists.llvm.org>
Sent: Wednesday, July 24, 2019 08:20
To: llvm-devmemory
Subject: [llvm-dev] Intrinsics InstrReadMem memory properties

Hello,

According to include/llvm/IR/Intrinsics.td, InstrReadMem property indicates that the intrinsic only reads from and does not write to memory.

Does this mean that it can read anywhere in the memory? Because we already have 'InstrArgMemOnly' for intrinsics which only access memory that its argument(s) point(s) to.

If 'InstrReadMem' really means read from anywhere in the memory, this should imply that,  if there's an intrinsic having this property *after* a dead store, the latter should not be eliminated by optimizations?

This is not the current behavior of LLVM though, so it seems that my guesses are wrong... But at least, can someone show me the mistake here?

Thanks for your time,

Son Tuan Vu


More information about the llvm-dev mailing list