Skip to content

Commit ebc0e07

Browse files
authored
[AMDGPU] Use std::variant in ArgDescriptor. (#167992)
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 b2f1233 commit ebc0e07

File tree

2 files changed

+20
-28
lines changed

2 files changed

+20
-28
lines changed

llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h

Lines changed: 17 additions & 27 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,55 +28,44 @@ 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

70-
MCRegister getRegister() const {
71-
assert(!IsStack);
72-
return Reg;
73-
}
66+
MCRegister getRegister() const { return std::get<MCRegister>(Val); }
7467

75-
unsigned getStackOffset() const {
76-
assert(IsStack);
77-
return StackOffset;
78-
}
68+
unsigned getStackOffset() const { return std::get<unsigned>(Val); }
7969

8070
unsigned getMask() const {
8171
// None of the target SGPRs or VGPRs are expected to have a 'zero' mask.

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)