[llvm] r362281 - [CodeGen] Fix hashing for MO_ExternalSymbol MachineOperands.
Eli Friedman via llvm-commits
llvm-commits at lists.llvm.org
Fri May 31 17:08:55 PDT 2019
Author: efriedma
Date: Fri May 31 17:08:54 2019
New Revision: 362281
URL: http://llvm.org/viewvc/llvm-project?rev=362281&view=rev
Log:
[CodeGen] Fix hashing for MO_ExternalSymbol MachineOperands.
We were hashing the string pointer, not the string, so two instructions
could be identical (isIdenticalTo), but have different hash codes.
This showed up as a very rare, non-deterministic assertion failure
rehashing a DenseMap constructed by MachineOutliner. So there's no
"real" testcase, just a unittest which checks that the hash function
behaves correctly.
I'm a little scared fixing this is going to cause a regression in
outlining or MachineCSE, but hopefully we won't run into any issues.
Differential Revision: https://reviews.llvm.org/D61975
Modified:
llvm/trunk/lib/CodeGen/MachineOperand.cpp
llvm/trunk/unittests/CodeGen/MachineOperandTest.cpp
Modified: llvm/trunk/lib/CodeGen/MachineOperand.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineOperand.cpp?rev=362281&r1=362280&r2=362281&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineOperand.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineOperand.cpp Fri May 31 17:08:54 2019
@@ -361,7 +361,7 @@ hash_code llvm::hash_value(const Machine
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
case MachineOperand::MO_ExternalSymbol:
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(),
- MO.getSymbolName());
+ StringRef(MO.getSymbolName()));
case MachineOperand::MO_GlobalAddress:
return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(),
MO.getOffset());
Modified: llvm/trunk/unittests/CodeGen/MachineOperandTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/MachineOperandTest.cpp?rev=362281&r1=362280&r2=362281&view=diff
==============================================================================
--- llvm/trunk/unittests/CodeGen/MachineOperandTest.cpp (original)
+++ llvm/trunk/unittests/CodeGen/MachineOperandTest.cpp Fri May 31 17:08:54 2019
@@ -398,4 +398,14 @@ TEST(MachineOperandTest, PrintPredicate)
ASSERT_TRUE(OS.str() == "intpred(eq)");
}
+TEST(MachineOperandTest, HashValue) {
+ char SymName1[] = "test";
+ char SymName2[] = "test";
+ MachineOperand MO1 = MachineOperand::CreateES(SymName1);
+ MachineOperand MO2 = MachineOperand::CreateES(SymName2);
+ ASSERT_NE(SymName1, SymName2);
+ ASSERT_EQ(hash_value(MO1), hash_value(MO2));
+ ASSERT_TRUE(MO1.isIdenticalTo(MO2));
+}
+
} // end namespace
More information about the llvm-commits
mailing list