hliao added a comment.

In D89980#2368506 <https://reviews.llvm.org/D89980#2368506>, @arsenm wrote:

> I think this is a dead end approach. I don't see the connection to the 
> original problem you are trying to solve. Can you send me an IR testcase that 
> this is supposed to help?

That's probably commonly known. If we pass an aggregate parameter directly by 
value and dynamically index it late, that `alloca` cannot be promoted as that 
aggregate value in LLVM IR cannot be dynamically indexed. For example,

  struct S {
     int a[100];
     int n;
  };
  
  int foo(S s) {
    return s.a[s.n];
  }

If the underlying ABI chooses to pass `s` directly by value, we have the 
following pseudo IR.

  %s = alloca S
  ; store `s` value into %s as the parameter is treated as a local variable by 
filling its initial value from LLVM IR parameter.
  ...
  ; regular parameter access through %s with dynamic indices

that `store` from the parameter from LLVM IR is an aggregate value store. 
Later, when %s is to be promoted, as it's once dynamically indexed, we cannot 
promote it as dynamic index on aggregate values is not representable in LLVM IR.

In contrast, if a parameter is passed by value indirectly, that `store` is 
replaced with a `memcpy`. It's straightforward to promote '%s' as they are all 
memory operands of the same layout.

If you need detailed IR, I may post here for your reference.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D89980/new/

https://reviews.llvm.org/D89980

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to