
The @llvm.amdgcn.cs.chain intrinsic is essentially a call. The call parameters are bundled up into 2 intrinsic arguments, one for those that should go in the SGPRs (the 3rd intrinsic argument), and one for those that should go in the VGPRs (the 4th intrinsic argument). Both will often be some kind of aggregate. Both instruction selection frameworks have some internal representation for intrinsics (G_INTRINSIC[_WITH_SIDE_EFFECTS] for GlobalISel, ISD::INTRINSIC_[VOID|WITH_CHAIN] for DAGISel), but we can't use those because aggregates are dissolved very early on during ISel and we'd lose the inreg information. Therefore, this patch shortcircuits both the IRTranslator and SelectionDAGBuilder to lower this intrinsic as a call from the very start. It tries to use the existing infrastructure as much as possible, by calling into the code for lowering tail calls. This has already gone through a few rounds of review in Phab: Differential Revision: https://reviews.llvm.org/D153761
93 lines
3.7 KiB
C++
93 lines
3.7 KiB
C++
//===- lib/Target/AMDGPU/AMDGPUCallLowering.h - Call lowering -*- C++ -*---===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file describes how to lower LLVM calls to machine code calls.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUCALLLOWERING_H
|
|
#define LLVM_LIB_TARGET_AMDGPU_AMDGPUCALLLOWERING_H
|
|
|
|
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
|
|
|
|
namespace llvm {
|
|
|
|
class AMDGPUTargetLowering;
|
|
class GCNSubtarget;
|
|
class MachineInstrBuilder;
|
|
class SIMachineFunctionInfo;
|
|
|
|
class AMDGPUCallLowering final : public CallLowering {
|
|
void lowerParameterPtr(Register DstReg, MachineIRBuilder &B,
|
|
uint64_t Offset) const;
|
|
|
|
void lowerParameter(MachineIRBuilder &B, ArgInfo &AI, uint64_t Offset,
|
|
Align Alignment) const;
|
|
|
|
bool canLowerReturn(MachineFunction &MF, CallingConv::ID CallConv,
|
|
SmallVectorImpl<BaseArgInfo> &Outs,
|
|
bool IsVarArg) const override;
|
|
|
|
bool lowerReturnVal(MachineIRBuilder &B, const Value *Val,
|
|
ArrayRef<Register> VRegs, MachineInstrBuilder &Ret) const;
|
|
|
|
public:
|
|
AMDGPUCallLowering(const AMDGPUTargetLowering &TLI);
|
|
|
|
bool lowerReturn(MachineIRBuilder &B, const Value *Val,
|
|
ArrayRef<Register> VRegs,
|
|
FunctionLoweringInfo &FLI) const override;
|
|
|
|
bool lowerFormalArgumentsKernel(MachineIRBuilder &B, const Function &F,
|
|
ArrayRef<ArrayRef<Register>> VRegs) const;
|
|
|
|
bool lowerFormalArguments(MachineIRBuilder &B, const Function &F,
|
|
ArrayRef<ArrayRef<Register>> VRegs,
|
|
FunctionLoweringInfo &FLI) const override;
|
|
|
|
bool passSpecialInputs(MachineIRBuilder &MIRBuilder,
|
|
CCState &CCInfo,
|
|
SmallVectorImpl<std::pair<MCRegister, Register>> &ArgRegs,
|
|
CallLoweringInfo &Info) const;
|
|
|
|
bool
|
|
doCallerAndCalleePassArgsTheSameWay(CallLoweringInfo &Info,
|
|
MachineFunction &MF,
|
|
SmallVectorImpl<ArgInfo> &InArgs) const;
|
|
|
|
bool
|
|
areCalleeOutgoingArgsTailCallable(CallLoweringInfo &Info, MachineFunction &MF,
|
|
SmallVectorImpl<ArgInfo> &OutArgs) const;
|
|
|
|
/// Returns true if the call can be lowered as a tail call.
|
|
bool
|
|
isEligibleForTailCallOptimization(MachineIRBuilder &MIRBuilder,
|
|
CallLoweringInfo &Info,
|
|
SmallVectorImpl<ArgInfo> &InArgs,
|
|
SmallVectorImpl<ArgInfo> &OutArgs) const;
|
|
|
|
void handleImplicitCallArguments(
|
|
MachineIRBuilder &MIRBuilder, MachineInstrBuilder &CallInst,
|
|
const GCNSubtarget &ST, const SIMachineFunctionInfo &MFI,
|
|
CallingConv::ID CalleeCC,
|
|
ArrayRef<std::pair<MCRegister, Register>> ImplicitArgRegs) const;
|
|
|
|
bool lowerTailCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo &Info,
|
|
SmallVectorImpl<ArgInfo> &OutArgs) const;
|
|
bool lowerChainCall(MachineIRBuilder &MIRBuilder,
|
|
CallLoweringInfo &Info) const;
|
|
bool lowerCall(MachineIRBuilder &MIRBuilder,
|
|
CallLoweringInfo &Info) const override;
|
|
|
|
static CCAssignFn *CCAssignFnForCall(CallingConv::ID CC, bool IsVarArg);
|
|
static CCAssignFn *CCAssignFnForReturn(CallingConv::ID CC, bool IsVarArg);
|
|
};
|
|
} // End of namespace llvm;
|
|
#endif
|