Skip to content

Commit 1e52121

Browse files
wdx727ckoparkar
authored andcommitted
Fix the usage issue of getRegMask. (llvm#141215)
In the process of determining whether two MachineOperands are equal and calculating the hash of a MachineOperand, both MO_RegisterMask and MO_RegisterLiveOut types were uniformly handled. However, when the type is MO_RegisterLiveOut, calling getRegMask() triggers an assertion failure. This PR addresses this issue.
1 parent 4a5e47e commit 1e52121

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

llvm/lib/CodeGen/MachineOperand.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,9 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
363363
case MachineOperand::MO_RegisterMask:
364364
case MachineOperand::MO_RegisterLiveOut: {
365365
// Shallow compare of the two RegMasks
366-
const uint32_t *RegMask = getRegMask();
367-
const uint32_t *OtherRegMask = Other.getRegMask();
366+
const uint32_t *RegMask = isRegMask() ? getRegMask() : getRegLiveOut();
367+
const uint32_t *OtherRegMask =
368+
isRegMask() ? Other.getRegMask() : Other.getRegLiveOut();
368369
if (RegMask == OtherRegMask)
369370
return true;
370371

@@ -434,7 +435,8 @@ hash_code llvm::hash_value(const MachineOperand &MO) {
434435
if (const MachineFunction *MF = getMFIfAvailable(MO)) {
435436
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
436437
unsigned RegMaskSize = MachineOperand::getRegMaskSize(TRI->getNumRegs());
437-
const uint32_t *RegMask = MO.getRegMask();
438+
const uint32_t *RegMask =
439+
MO.isRegMask() ? MO.getRegMask() : MO.getRegLiveOut();
438440
std::vector<stable_hash> RegMaskHashes(RegMask, RegMask + RegMaskSize);
439441
return hash_combine(MO.getType(), MO.getTargetFlags(),
440442
stable_hash_combine(RegMaskHashes));

llvm/lib/CodeGen/MachineStableHash.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ stable_hash llvm::stableHashValue(const MachineOperand &MO) {
136136
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
137137
unsigned RegMaskSize =
138138
MachineOperand::getRegMaskSize(TRI->getNumRegs());
139-
const uint32_t *RegMask = MO.getRegMask();
139+
const uint32_t *RegMask =
140+
MO.isRegMask() ? MO.getRegMask() : MO.getRegLiveOut();
140141
std::vector<llvm::stable_hash> RegMaskHashes(RegMask,
141142
RegMask + RegMaskSize);
142143
return stable_hash_combine(MO.getType(), MO.getTargetFlags(),

llvm/unittests/CodeGen/MachineOperandTest.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,4 +424,24 @@ TEST(MachineOperandTest, HashValue) {
424424
ASSERT_TRUE(MO1.isIdenticalTo(MO2));
425425
}
426426

427+
TEST(MachineOperandTest, RegisterLiveOutHashValue) {
428+
LLVMContext Ctx;
429+
Module Mod("Module", Ctx);
430+
auto MF = createMachineFunction(Ctx, Mod);
431+
MachineBasicBlock *MBB = MF->CreateMachineBasicBlock();
432+
MCInstrDesc MCID = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
433+
auto *MI1 = MF->CreateMachineInstr(MCID, DebugLoc());
434+
auto *MI2 = MF->CreateMachineInstr(MCID, DebugLoc());
435+
MBB->insert(MBB->begin(), MI1);
436+
MBB->insert(MBB->begin(), MI2);
437+
uint32_t Mask1 = 0;
438+
uint32_t Mask2 = 0;
439+
MI1->addOperand(*MF, MachineOperand::CreateRegLiveOut(&Mask1));
440+
MI2->addOperand(*MF, MachineOperand::CreateRegLiveOut(&Mask2));
441+
auto MO1 = MI1->getOperand(0);
442+
auto MO2 = MI2->getOperand(0);
443+
EXPECT_EQ(hash_value(MO1), hash_value(MO2));
444+
EXPECT_TRUE(MO1.isIdenticalTo(MO2));
445+
}
446+
427447
} // end namespace

0 commit comments

Comments
 (0)