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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits