Skip to content

Commit 2d7ea71

Browse files
committed
[AMDGPU] Use std::variant in ArgDescriptor.
This replaces the 2 bool flags and the anonymous union. This also removes an implicit conversion from Register to unsigned and a call to MCRegister::id(). The ArgDescriptor constructor was always assigning the union through the MCRegister field even for stack offsets. The change to SIMachineFunctionInfo.h fixes a case where getRegister was being called on an unset ArgDescriptor. Since it was only this case, it seemed cleaner to fix it at the caller. The other option would be to make getRegister() return MCRegister() for an unset ArgDescriptor.
1 parent 630dfc9 commit 2d7ea71

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "llvm/ADT/DenseMap.h"
1414
#include "llvm/CodeGen/Register.h"
1515
#include "llvm/Pass.h"
16+
#include <variant>
1617

1718
namespace llvm {
1819

@@ -27,54 +28,49 @@ struct ArgDescriptor {
2728
friend struct AMDGPUFunctionArgInfo;
2829
friend class AMDGPUArgumentUsageInfo;
2930

30-
union {
31-
MCRegister Reg;
32-
unsigned StackOffset;
33-
};
31+
std::variant<std::monostate, MCRegister, unsigned> Val;
3432

3533
// Bitmask to locate argument within the register.
3634
unsigned Mask;
3735

38-
bool IsStack : 1;
39-
bool IsSet : 1;
40-
4136
public:
42-
ArgDescriptor(unsigned Val = 0, unsigned Mask = ~0u, bool IsStack = false,
43-
bool IsSet = false)
44-
: Reg(Val), Mask(Mask), IsStack(IsStack), IsSet(IsSet) {}
37+
ArgDescriptor(unsigned Mask = ~0u) : Mask(Mask) {}
4538

4639
static ArgDescriptor createRegister(Register Reg, unsigned Mask = ~0u) {
47-
return ArgDescriptor(Reg, Mask, false, true);
40+
ArgDescriptor Ret(Mask);
41+
Ret.Val = Reg.asMCReg();
42+
return Ret;
4843
}
4944

5045
static ArgDescriptor createStack(unsigned Offset, unsigned Mask = ~0u) {
51-
return ArgDescriptor(Offset, Mask, true, true);
46+
ArgDescriptor Ret(Mask);
47+
Ret.Val = Offset;
48+
return Ret;
5249
}
5350

5451
static ArgDescriptor createArg(const ArgDescriptor &Arg, unsigned Mask) {
55-
return ArgDescriptor(Arg.Reg.id(), Mask, Arg.IsStack, Arg.IsSet);
52+
// Copy the descriptor, then change the mask.
53+
ArgDescriptor Ret(Arg);
54+
Ret.Mask = Mask;
55+
return Ret;
5656
}
5757

58-
bool isSet() const {
59-
return IsSet;
60-
}
58+
bool isSet() const { return !std::holds_alternative<std::monostate>(Val); }
6159

6260
explicit operator bool() const {
6361
return isSet();
6462
}
6563

66-
bool isRegister() const {
67-
return !IsStack;
68-
}
64+
bool isRegister() const { return std::holds_alternative<MCRegister>(Val); }
6965

7066
MCRegister getRegister() const {
71-
assert(!IsStack);
72-
return Reg;
67+
assert(isRegister());
68+
return std::get<MCRegister>(Val);
7369
}
7470

7571
unsigned getStackOffset() const {
76-
assert(IsStack);
77-
return StackOffset;
72+
assert(std::holds_alternative<unsigned>(Val));
73+
return std::get<unsigned>(Val);
7874
}
7975

8076
unsigned getMask() const {

llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,9 @@ class SIMachineFunctionInfo final : public AMDGPUMachineFunction,
10141014
void setNumWaveDispatchVGPRs(unsigned Count) { NumWaveDispatchVGPRs = Count; }
10151015

10161016
Register getPrivateSegmentWaveByteOffsetSystemSGPR() const {
1017-
return ArgInfo.PrivateSegmentWaveByteOffset.getRegister();
1017+
if (ArgInfo.PrivateSegmentWaveByteOffset)
1018+
return ArgInfo.PrivateSegmentWaveByteOffset.getRegister();
1019+
return MCRegister();
10181020
}
10191021

10201022
/// Returns the physical register reserved for use as the resource

0 commit comments

Comments
 (0)