Skip to content

Commit b2fae5b

Browse files
authored
[Mips] Remove custom "original type" handling (#154082)
Replace Mips custom logic for retaining information about original types in calling convention lowering by directly querying the OrigTy that is now available. There is one change in behavior here: If the return type is a struct containing fp128 plus additional members, the result is now different, as we no longer special case to a single fp128 member. I believe this is fine, because this is a fake ABI anyway: Such cases should actually use sret, and as such are a frontend responsibility, and Clang will indeed emit these as sret, not as a return value struct. So this only impacts manually written IR tests.
1 parent b44e47a commit b2fae5b

File tree

8 files changed

+25
-395
lines changed

8 files changed

+25
-395
lines changed

llvm/lib/Target/Mips/MipsCCState.cpp

Lines changed: 0 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -12,35 +12,6 @@
1212

1313
using namespace llvm;
1414

15-
/// This function returns true if Ty is fp128, {f128} or i128 which was
16-
/// originally a fp128.
17-
bool MipsCCState::originalTypeIsF128(const Type *Ty) {
18-
if (Ty->isFP128Ty())
19-
return true;
20-
21-
if (Ty->isStructTy() && Ty->getStructNumElements() == 1 &&
22-
Ty->getStructElementType(0)->isFP128Ty())
23-
return true;
24-
25-
return false;
26-
}
27-
28-
/// Return true if the original type was vXfXX.
29-
bool MipsCCState::originalEVTTypeIsVectorFloat(EVT Ty) {
30-
if (Ty.isVector() && Ty.getVectorElementType().isFloatingPoint())
31-
return true;
32-
33-
return false;
34-
}
35-
36-
/// Return true if the original type was vXfXX / vXfXX.
37-
bool MipsCCState::originalTypeIsVectorFloat(const Type *Ty) {
38-
if (Ty->isVectorTy() && Ty->isFPOrFPVectorTy())
39-
return true;
40-
41-
return false;
42-
}
43-
4415
MipsCCState::SpecialCallingConvType
4516
MipsCCState::getSpecialCallingConvForCallee(const SDNode *Callee,
4617
const MipsSubtarget &Subtarget) {
@@ -57,118 +28,3 @@ MipsCCState::getSpecialCallingConvForCallee(const SDNode *Callee,
5728
}
5829
return SpecialCallingConv;
5930
}
60-
61-
void MipsCCState::PreAnalyzeCallResultForF128(
62-
const SmallVectorImpl<ISD::InputArg> &Ins, const Type *RetTy) {
63-
for (unsigned i = 0; i < Ins.size(); ++i) {
64-
OriginalArgWasF128.push_back(originalTypeIsF128(RetTy));
65-
OriginalArgWasFloat.push_back(RetTy->isFloatingPointTy());
66-
}
67-
}
68-
69-
/// Identify lowered values that originated from f128 or float arguments and
70-
/// record this for use by RetCC_MipsN.
71-
void MipsCCState::PreAnalyzeCallReturnForF128(
72-
const SmallVectorImpl<ISD::OutputArg> &Outs, const Type *RetTy) {
73-
for (unsigned i = 0; i < Outs.size(); ++i) {
74-
OriginalArgWasF128.push_back(originalTypeIsF128(RetTy));
75-
OriginalArgWasFloat.push_back(
76-
RetTy->isFloatingPointTy());
77-
}
78-
}
79-
80-
/// Identify lower values that originated from vXfXX and record
81-
/// this.
82-
void MipsCCState::PreAnalyzeCallResultForVectorFloat(
83-
const SmallVectorImpl<ISD::InputArg> &Ins, const Type *RetTy) {
84-
for (unsigned i = 0; i < Ins.size(); ++i) {
85-
OriginalRetWasFloatVector.push_back(originalTypeIsVectorFloat(RetTy));
86-
}
87-
}
88-
89-
/// Identify lowered values that originated from vXfXX arguments and record
90-
/// this.
91-
void MipsCCState::PreAnalyzeReturnForVectorFloat(
92-
const SmallVectorImpl<ISD::OutputArg> &Outs) {
93-
for (unsigned i = 0; i < Outs.size(); ++i) {
94-
ISD::OutputArg Out = Outs[i];
95-
OriginalRetWasFloatVector.push_back(
96-
originalEVTTypeIsVectorFloat(Out.ArgVT));
97-
}
98-
}
99-
100-
void MipsCCState::PreAnalyzeReturnValue(EVT ArgVT) {
101-
OriginalRetWasFloatVector.push_back(originalEVTTypeIsVectorFloat(ArgVT));
102-
}
103-
104-
void MipsCCState::PreAnalyzeCallOperand(const Type *ArgTy) {
105-
OriginalArgWasF128.push_back(originalTypeIsF128(ArgTy));
106-
OriginalArgWasFloat.push_back(ArgTy->isFloatingPointTy());
107-
OriginalArgWasFloatVector.push_back(ArgTy->isVectorTy());
108-
}
109-
110-
/// Identify lowered values that originated from f128, float and sret to vXfXX
111-
/// arguments and record this.
112-
void MipsCCState::PreAnalyzeCallOperands(
113-
const SmallVectorImpl<ISD::OutputArg> &Outs,
114-
std::vector<TargetLowering::ArgListEntry> &FuncArgs) {
115-
for (unsigned i = 0; i < Outs.size(); ++i) {
116-
TargetLowering::ArgListEntry FuncArg = FuncArgs[Outs[i].OrigArgIndex];
117-
118-
OriginalArgWasF128.push_back(originalTypeIsF128(FuncArg.OrigTy));
119-
OriginalArgWasFloat.push_back(FuncArg.OrigTy->isFloatingPointTy());
120-
OriginalArgWasFloatVector.push_back(FuncArg.OrigTy->isVectorTy());
121-
}
122-
}
123-
124-
void MipsCCState::PreAnalyzeFormalArgument(const Type *ArgTy,
125-
ISD::ArgFlagsTy Flags) {
126-
// SRet arguments cannot originate from f128 or {f128} returns so we just
127-
// push false. We have to handle this specially since SRet arguments
128-
// aren't mapped to an original argument.
129-
if (Flags.isSRet()) {
130-
OriginalArgWasF128.push_back(false);
131-
OriginalArgWasFloat.push_back(false);
132-
OriginalArgWasFloatVector.push_back(false);
133-
return;
134-
}
135-
136-
OriginalArgWasF128.push_back(originalTypeIsF128(ArgTy));
137-
OriginalArgWasFloat.push_back(ArgTy->isFloatingPointTy());
138-
139-
// The MIPS vector ABI exhibits a corner case of sorts or quirk; if the
140-
// first argument is actually an SRet pointer to a vector, then the next
141-
// argument slot is $a2.
142-
OriginalArgWasFloatVector.push_back(ArgTy->isVectorTy());
143-
}
144-
145-
/// Identify lowered values that originated from f128, float and vXfXX arguments
146-
/// and record this.
147-
void MipsCCState::PreAnalyzeFormalArgumentsForF128(
148-
const SmallVectorImpl<ISD::InputArg> &Ins) {
149-
const MachineFunction &MF = getMachineFunction();
150-
for (unsigned i = 0; i < Ins.size(); ++i) {
151-
Function::const_arg_iterator FuncArg = MF.getFunction().arg_begin();
152-
153-
// SRet arguments cannot originate from f128 or {f128} returns so we just
154-
// push false. We have to handle this specially since SRet arguments
155-
// aren't mapped to an original argument.
156-
if (Ins[i].Flags.isSRet()) {
157-
OriginalArgWasF128.push_back(false);
158-
OriginalArgWasFloat.push_back(false);
159-
OriginalArgWasFloatVector.push_back(false);
160-
continue;
161-
}
162-
163-
assert(Ins[i].getOrigArgIndex() < MF.getFunction().arg_size());
164-
std::advance(FuncArg, Ins[i].getOrigArgIndex());
165-
166-
OriginalArgWasF128.push_back(originalTypeIsF128(FuncArg->getType()));
167-
OriginalArgWasFloat.push_back(FuncArg->getType()->isFloatingPointTy());
168-
169-
// The MIPS vector ABI exhibits a corner case of sorts or quirk; if the
170-
// first argument is actually an SRet pointer to a vector, then the next
171-
// argument slot is $a2.
172-
OriginalArgWasFloatVector.push_back(FuncArg->getType()->isVectorTy());
173-
}
174-
}

llvm/lib/Target/Mips/MipsCCState.h

Lines changed: 0 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -26,59 +26,7 @@ class MipsCCState : public CCState {
2626
getSpecialCallingConvForCallee(const SDNode *Callee,
2727
const MipsSubtarget &Subtarget);
2828

29-
static bool originalTypeIsF128(const Type *Ty);
30-
static bool originalEVTTypeIsVectorFloat(EVT Ty);
31-
static bool originalTypeIsVectorFloat(const Type *Ty);
32-
33-
void PreAnalyzeCallOperand(const Type *ArgTy);
34-
35-
void PreAnalyzeFormalArgument(const Type *ArgTy, ISD::ArgFlagsTy Flags);
36-
void PreAnalyzeReturnValue(EVT ArgVT);
37-
3829
private:
39-
/// Identify lowered values that originated from f128 arguments and record
40-
/// this for use by RetCC_MipsN.
41-
void PreAnalyzeCallResultForF128(const SmallVectorImpl<ISD::InputArg> &Ins,
42-
const Type *RetTy);
43-
44-
/// Identify lowered values that originated from f128 arguments and record
45-
/// this for use by RetCC_MipsN.
46-
void PreAnalyzeCallReturnForF128(const SmallVectorImpl<ISD::OutputArg> &Outs, const Type *RetTy);
47-
48-
/// Identify lowered values that originated from f128 arguments and record
49-
/// this.
50-
void
51-
PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
52-
std::vector<TargetLowering::ArgListEntry> &FuncArgs);
53-
54-
/// Identify lowered values that originated from f128 arguments and record
55-
/// this for use by RetCC_MipsN.
56-
void
57-
PreAnalyzeFormalArgumentsForF128(const SmallVectorImpl<ISD::InputArg> &Ins);
58-
59-
void
60-
PreAnalyzeCallResultForVectorFloat(const SmallVectorImpl<ISD::InputArg> &Ins,
61-
const Type *RetTy);
62-
63-
void PreAnalyzeFormalArgumentsForVectorFloat(
64-
const SmallVectorImpl<ISD::InputArg> &Ins);
65-
66-
void
67-
PreAnalyzeReturnForVectorFloat(const SmallVectorImpl<ISD::OutputArg> &Outs);
68-
69-
/// Records whether the value has been lowered from an f128.
70-
SmallVector<bool, 4> OriginalArgWasF128;
71-
72-
/// Records whether the value has been lowered from float.
73-
SmallVector<bool, 4> OriginalArgWasFloat;
74-
75-
/// Records whether the value has been lowered from a floating point vector.
76-
SmallVector<bool, 4> OriginalArgWasFloatVector;
77-
78-
/// Records whether the return value has been lowered from a floating point
79-
/// vector.
80-
SmallVector<bool, 4> OriginalRetWasFloatVector;
81-
8230
// Used to handle MIPS16-specific calling convention tweaks.
8331
// FIXME: This should probably be a fully fledged calling convention.
8432
SpecialCallingConvType SpecialCallingConv;
@@ -89,116 +37,6 @@ class MipsCCState : public CCState {
8937
SpecialCallingConvType SpecialCC = NoSpecialCallingConv)
9038
: CCState(CC, isVarArg, MF, locs, C), SpecialCallingConv(SpecialCC) {}
9139

92-
void
93-
PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
94-
CCAssignFn Fn,
95-
std::vector<TargetLowering::ArgListEntry> &FuncArgs) {
96-
OriginalArgWasF128.clear();
97-
OriginalArgWasFloat.clear();
98-
OriginalArgWasFloatVector.clear();
99-
PreAnalyzeCallOperands(Outs, FuncArgs);
100-
}
101-
102-
void
103-
AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
104-
CCAssignFn Fn,
105-
std::vector<TargetLowering::ArgListEntry> &FuncArgs) {
106-
PreAnalyzeCallOperands(Outs, Fn, FuncArgs);
107-
CCState::AnalyzeCallOperands(Outs, Fn);
108-
}
109-
110-
// The AnalyzeCallOperands in the base class is not usable since we must
111-
// provide a means of accessing ArgListEntry::IsFixed. Delete them from this
112-
// class. This doesn't stop them being used via the base class though.
113-
void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs,
114-
CCAssignFn Fn) = delete;
115-
void AnalyzeCallOperands(const SmallVectorImpl<MVT> &Outs,
116-
SmallVectorImpl<ISD::ArgFlagsTy> &Flags,
117-
CCAssignFn Fn) = delete;
118-
119-
void PreAnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,
120-
CCAssignFn Fn) {
121-
OriginalArgWasFloat.clear();
122-
OriginalArgWasF128.clear();
123-
OriginalArgWasFloatVector.clear();
124-
PreAnalyzeFormalArgumentsForF128(Ins);
125-
}
126-
127-
void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins,
128-
CCAssignFn Fn) {
129-
PreAnalyzeFormalArguments(Ins, Fn);
130-
CCState::AnalyzeFormalArguments(Ins, Fn);
131-
}
132-
133-
void PreAnalyzeCallResult(const Type *RetTy) {
134-
OriginalArgWasF128.push_back(originalTypeIsF128(RetTy));
135-
OriginalArgWasFloat.push_back(RetTy->isFloatingPointTy());
136-
OriginalRetWasFloatVector.push_back(originalTypeIsVectorFloat(RetTy));
137-
}
138-
139-
void PreAnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins,
140-
CCAssignFn Fn, const Type *RetTy) {
141-
OriginalArgWasFloat.clear();
142-
OriginalArgWasF128.clear();
143-
OriginalArgWasFloatVector.clear();
144-
PreAnalyzeCallResultForF128(Ins, RetTy);
145-
PreAnalyzeCallResultForVectorFloat(Ins, RetTy);
146-
}
147-
148-
void AnalyzeCallResult(const SmallVectorImpl<ISD::InputArg> &Ins,
149-
CCAssignFn Fn, const Type *RetTy) {
150-
PreAnalyzeCallResult(Ins, Fn, RetTy);
151-
CCState::AnalyzeCallResult(Ins, Fn);
152-
}
153-
154-
void PreAnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs,
155-
CCAssignFn Fn) {
156-
const MachineFunction &MF = getMachineFunction();
157-
OriginalArgWasFloat.clear();
158-
OriginalArgWasF128.clear();
159-
OriginalArgWasFloatVector.clear();
160-
PreAnalyzeCallReturnForF128(Outs, MF.getFunction().getReturnType());
161-
PreAnalyzeReturnForVectorFloat(Outs);
162-
}
163-
164-
void AnalyzeReturn(const SmallVectorImpl<ISD::OutputArg> &Outs,
165-
CCAssignFn Fn) {
166-
PreAnalyzeReturn(Outs, Fn);
167-
CCState::AnalyzeReturn(Outs, Fn);
168-
}
169-
170-
bool CheckReturn(const SmallVectorImpl<ISD::OutputArg> &ArgsFlags,
171-
CCAssignFn Fn) {
172-
const MachineFunction &MF = getMachineFunction();
173-
PreAnalyzeCallReturnForF128(ArgsFlags, MF.getFunction().getReturnType());
174-
PreAnalyzeReturnForVectorFloat(ArgsFlags);
175-
bool Return = CCState::CheckReturn(ArgsFlags, Fn);
176-
OriginalArgWasFloat.clear();
177-
OriginalArgWasF128.clear();
178-
OriginalArgWasFloatVector.clear();
179-
return Return;
180-
}
181-
182-
bool CheckCallReturn(const SmallVectorImpl<ISD::OutputArg> &ArgsFlags,
183-
CCAssignFn Fn, const Type *RetTy) {
184-
PreAnalyzeCallReturnForF128(ArgsFlags, RetTy);
185-
PreAnalyzeReturnForVectorFloat(ArgsFlags);
186-
bool Return = CCState::CheckReturn(ArgsFlags, Fn);
187-
OriginalArgWasFloat.clear();
188-
OriginalArgWasF128.clear();
189-
OriginalArgWasFloatVector.clear();
190-
return Return;
191-
}
192-
bool WasOriginalArgF128(unsigned ValNo) { return OriginalArgWasF128[ValNo]; }
193-
bool WasOriginalArgFloat(unsigned ValNo) {
194-
return OriginalArgWasFloat[ValNo];
195-
}
196-
bool WasOriginalArgVectorFloat(unsigned ValNo) const {
197-
return OriginalArgWasFloatVector[ValNo];
198-
}
199-
bool WasOriginalRetVectorFloat(unsigned ValNo) const {
200-
return OriginalRetWasFloatVector[ValNo];
201-
}
20240
SpecialCallingConvType getSpecialCallingConv() { return SpecialCallingConv; }
20341
};
20442
}

0 commit comments

Comments
 (0)