[PATCH] D100591: [Clang][AArch64] Disable rounding of return values for AArch64

John McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 15 12:17:49 PDT 2021


rjmccall added a comment.

Hmm.  I think the right thing to do here is to recognize generally that we're emitting a mandatory tail call, and so suppress *all* the normal transformations on the return value.  The conditions on mandatory tail calls should make that possible, and it seems like it would be necessary for a lot of types.  Aggregates especially come to mind — if an aggregate is returned in registers, we're probably going to generate code like

  %0 = alloca %struct.foo
  %1 = call {i64,i64} @function()
  %2 = bitcast %0 to {i64,i64}*
  store %1, %2
  %3 = bitcast %0 to {i64,i64}*
  %4 = load %3
  ret %4

(Actually, probably much worse, with a lot of extract_values and so on.)  I assume that is going to completely break TCO, and we really need to generate

  %0 = call {i64,i64} @function()
  ret %0

The *only* way we can do that is to recognize that the call has to be done differently in IRGen.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D100591



More information about the cfe-commits mailing list