================
@@ -5759,6 +5808,53 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo
&CallInfo,
case ABIArgInfo::Indirect:
case ABIArgInfo::IndirectAliased: {
assert(NumIRArgs == 1);
+
+ // Musttail Indirect: route via the matching incoming parameter.
+ // Prototype-match (Verifier V5/V6/V7) makes CurFn->arg_begin()+
+ // FirstIRArg a distinct destination for this slot that lives in the
+ // caller's caller's frame and survives the tail call. To handle
+ // permutations safely, the source value is captured into a scratch
+ // alloca here (Phase 1); the write to the incoming-param destination
+ // is deferred until after all sources have been read (Phase 2 below).
+ // IndirectAliased uses the existing fallback (different source-AS).
+ if (IsMustTail && ArgInfo.isIndirect()) {
+ llvm::Argument *IncomingArg = CurFn->arg_begin() + FirstIRArg;
+ llvm::Value *Dst = IncomingArg;
+ Address SrcAddr = Address::invalid();
+ if (I->hasLValue())
+ SrcAddr = I->getKnownLValue().getAddress();
+ else if (I->getKnownRValue().isAggregate())
+ SrcAddr = I->getKnownRValue().getAggregateAddress();
+ if (SrcAddr.isValid()) {
+ llvm::Value *Src = peelAddrSpaceCast(SrcAddr.emitRawPointer(*this));
+ if (Src != Dst) {
+ CharUnits Align = ArgInfo.getIndirectAlign();
+ QualType Ty = I->Ty;
+ llvm::Type *ElemTy = ConvertTypeForMem(Ty);
+ RawAddress Scratch =
+ CreateMemTempWithoutCast(Ty, Align, "musttail.copy");
+ LValue ScratchLV = MakeAddrLValue(Scratch, Ty);
+ LValue SrcLV = MakeAddrLValue(SrcAddr, Ty);
+ EmitAggregateCopy(ScratchLV, SrcLV, Ty,
+ AggValueSlot::DoesNotOverlap);
+ LValue DstLV = MakeAddrLValue(Address(Dst, ElemTy, Align), Ty);
+ MustTailIndirectCopies.push_back({ScratchLV, DstLV, Ty});
+ }
+ llvm::Value *Val = Dst;
+ if (ArgHasMaybeUndefAttr)
+ Val = Builder.CreateFreeze(Val);
----------------
xroche wrote:
Done. `Dst` is the incoming parameter pointer (an SSA `Argument`), so it can't
be poison; pass it directly without the freeze.
https://github.com/llvm/llvm-project/pull/199351
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits