1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[Alignment][NFC] Migrate HandleByVal to Align

Summary: Note to downstream target maintainers: this might silently change the semantics of your code if you override `TargetLowering::HandleByVal` without marking it `override`.

This patch is part of a series to introduce an Alignment type.
See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html
See this patch for the introduction of the type: https://reviews.llvm.org/D64790

Reviewers: courbet

Subscribers: sdardis, hiraditya, jrtc27, atanasyan, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D81365
This commit is contained in:
Guillaume Chatelet 2020-06-08 08:48:49 +00:00
parent fed13a4cb4
commit 1a5597f4eb
9 changed files with 21 additions and 24 deletions

View File

@ -461,9 +461,9 @@ public:
// HandleByVal - Allocate a stack slot large enough to pass an argument by // HandleByVal - Allocate a stack slot large enough to pass an argument by
// value. The size and alignment information of the argument is encoded in its // value. The size and alignment information of the argument is encoded in its
// parameter attribute. // parameter attribute.
void HandleByVal(unsigned ValNo, MVT ValVT, void HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT,
MVT LocVT, CCValAssign::LocInfo LocInfo, CCValAssign::LocInfo LocInfo, int MinSize, Align MinAlign,
int MinSize, int MinAlign, ISD::ArgFlagsTy ArgFlags); ISD::ArgFlagsTy ArgFlags);
// Returns count of byval arguments that are to be stored (even partly) // Returns count of byval arguments that are to be stored (even partly)
// in registers. // in registers.

View File

@ -3837,7 +3837,7 @@ public:
} }
/// Target-specific cleanup for formal ByVal parameters. /// Target-specific cleanup for formal ByVal parameters.
virtual void HandleByVal(CCState *, unsigned &, unsigned) const {} virtual void HandleByVal(CCState *, unsigned &, Align) const {}
/// This hook should be implemented to check whether the return values /// This hook should be implemented to check whether the return values
/// described by the Outs array can fit into the return registers. If false /// described by the Outs array can fit into the return registers. If false

View File

@ -42,8 +42,7 @@ CCState::CCState(CallingConv::ID CC, bool isVarArg, MachineFunction &mf,
/// its parameter attribute. /// its parameter attribute.
void CCState::HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT, void CCState::HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo, int MinSize, CCValAssign::LocInfo LocInfo, int MinSize,
int MinAlignment, ISD::ArgFlagsTy ArgFlags) { Align MinAlign, ISD::ArgFlagsTy ArgFlags) {
Align MinAlign(MinAlignment);
Align Alignment = ArgFlags.getNonZeroByValAlign(); Align Alignment = ArgFlags.getNonZeroByValAlign();
unsigned Size = ArgFlags.getByValSize(); unsigned Size = ArgFlags.getByValSize();
if (MinSize > (int)Size) if (MinSize > (int)Size)
@ -51,8 +50,7 @@ void CCState::HandleByVal(unsigned ValNo, MVT ValVT, MVT LocVT,
if (MinAlign > Alignment) if (MinAlign > Alignment)
Alignment = MinAlign; Alignment = MinAlign;
ensureMaxAlignment(Alignment); ensureMaxAlignment(Alignment);
MF.getSubtarget().getTargetLowering()->HandleByVal(this, Size, MF.getSubtarget().getTargetLowering()->HandleByVal(this, Size, Alignment);
Alignment.value());
Size = unsigned(alignTo(Size, MinAlign)); Size = unsigned(alignTo(Size, MinAlign));
unsigned Offset = AllocateStack(Size, Alignment.value()); unsigned Offset = AllocateStack(Size, Alignment.value());
addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo)); addLoc(CCValAssign::getMem(ValNo, ValVT, Offset, LocVT, LocInfo));

View File

@ -2563,15 +2563,15 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
/// and then confiscate the rest of the parameter registers to insure /// and then confiscate the rest of the parameter registers to insure
/// this. /// this.
void ARMTargetLowering::HandleByVal(CCState *State, unsigned &Size, void ARMTargetLowering::HandleByVal(CCState *State, unsigned &Size,
unsigned Align) const { Align Alignment) const {
// Byval (as with any stack) slots are always at least 4 byte aligned. // Byval (as with any stack) slots are always at least 4 byte aligned.
Align = std::max(Align, 4U); Alignment = std::max(Alignment, Align(4));
unsigned Reg = State->AllocateReg(GPRArgRegs); unsigned Reg = State->AllocateReg(GPRArgRegs);
if (!Reg) if (!Reg)
return; return;
unsigned AlignInRegs = Align / 4; unsigned AlignInRegs = Alignment.value() / 4;
unsigned Waste = (ARM::R4 - Reg) % AlignInRegs; unsigned Waste = (ARM::R4 - Reg) % AlignInRegs;
for (unsigned i = 0; i < Waste; ++i) for (unsigned i = 0; i < Waste; ++i)
Reg = State->AllocateReg(GPRArgRegs); Reg = State->AllocateReg(GPRArgRegs);

View File

@ -826,7 +826,7 @@ class VectorType;
SmallVectorImpl<SDValue> &InVals) const override; SmallVectorImpl<SDValue> &InVals) const override;
/// HandleByVal - Target-specific cleanup for ByVal support. /// HandleByVal - Target-specific cleanup for ByVal support.
void HandleByVal(CCState *, unsigned &, unsigned) const override; void HandleByVal(CCState *, unsigned &, Align) const override;
/// IsEligibleForTailCallOptimization - Check whether the call is eligible /// IsEligibleForTailCallOptimization - Check whether the call is eligible
/// for tail call optimization. Targets which want to do tail call /// for tail call optimization. Targets which want to do tail call

View File

@ -514,7 +514,7 @@ static void AnalyzeArguments(CCState &State,
// Handle byval arguments // Handle byval arguments
if (ArgFlags.isByVal()) { if (ArgFlags.isByVal()) {
State.HandleByVal(ValNo++, ArgVT, LocVT, LocInfo, 2, 2, ArgFlags); State.HandleByVal(ValNo++, ArgVT, LocVT, LocInfo, 2, Align(2), ArgFlags);
continue; continue;
} }

View File

@ -4522,12 +4522,12 @@ void MipsTargetLowering::writeVarArgRegs(std::vector<SDValue> &OutChains,
} }
void MipsTargetLowering::HandleByVal(CCState *State, unsigned &Size, void MipsTargetLowering::HandleByVal(CCState *State, unsigned &Size,
unsigned Align) const { Align Alignment) const {
const TargetFrameLowering *TFL = Subtarget.getFrameLowering(); const TargetFrameLowering *TFL = Subtarget.getFrameLowering();
assert(Size && "Byval argument's size shouldn't be 0."); assert(Size && "Byval argument's size shouldn't be 0.");
Align = std::min(Align, TFL->getStackAlignment()); Alignment = std::min(Alignment, TFL->getStackAlign());
unsigned FirstReg = 0; unsigned FirstReg = 0;
unsigned NumRegs = 0; unsigned NumRegs = 0;
@ -4541,17 +4541,17 @@ void MipsTargetLowering::HandleByVal(CCState *State, unsigned &Size,
// We used to check the size as well but we can't do that anymore since // We used to check the size as well but we can't do that anymore since
// CCState::HandleByVal() rounds up the size after calling this function. // CCState::HandleByVal() rounds up the size after calling this function.
assert(!(Align % RegSizeInBytes) && assert(
"Byval argument's alignment should be a multiple of" Alignment >= Align(RegSizeInBytes) &&
"RegSizeInBytes."); "Byval argument's alignment should be a multiple of RegSizeInBytes.");
FirstReg = State->getFirstUnallocated(IntArgRegs); FirstReg = State->getFirstUnallocated(IntArgRegs);
// If Align > RegSizeInBytes, the first arg register must be even. // If Alignment > RegSizeInBytes, the first arg register must be even.
// FIXME: This condition happens to do the right thing but it's not the // FIXME: This condition happens to do the right thing but it's not the
// right way to test it. We want to check that the stack frame offset // right way to test it. We want to check that the stack frame offset
// of the register is aligned. // of the register is aligned.
if ((Align > RegSizeInBytes) && (FirstReg % 2)) { if ((Alignment > RegSizeInBytes) && (FirstReg % 2)) {
State->AllocateReg(IntArgRegs[FirstReg], ShadowRegs[FirstReg]); State->AllocateReg(IntArgRegs[FirstReg], ShadowRegs[FirstReg]);
++FirstReg; ++FirstReg;
} }

View File

@ -346,7 +346,7 @@ class TargetRegisterClass;
void AdjustInstrPostInstrSelection(MachineInstr &MI, void AdjustInstrPostInstrSelection(MachineInstr &MI,
SDNode *Node) const override; SDNode *Node) const override;
void HandleByVal(CCState *, unsigned &, unsigned) const override; void HandleByVal(CCState *, unsigned &, Align) const override;
Register getRegisterByName(const char* RegName, LLT VT, Register getRegisterByName(const char* RegName, LLT VT,
const MachineFunction &MF) const override; const MachineFunction &MF) const override;

View File

@ -275,9 +275,8 @@ void CallingConvEmitter::EmitAction(Record *Action,
} else if (Action->isSubClassOf("CCPassByVal")) { } else if (Action->isSubClassOf("CCPassByVal")) {
int Size = Action->getValueAsInt("Size"); int Size = Action->getValueAsInt("Size");
int Align = Action->getValueAsInt("Align"); int Align = Action->getValueAsInt("Align");
O << IndentStr O << IndentStr << "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, "
<< "State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, " << Size << ", Align(" << Align << "), ArgFlags);\n";
<< Size << ", " << Align << ", ArgFlags);\n";
O << IndentStr << "return false;\n"; O << IndentStr << "return false;\n";
} else if (Action->isSubClassOf("CCCustom")) { } else if (Action->isSubClassOf("CCCustom")) {
O << IndentStr O << IndentStr