[llvm][MIRVRegNamer] Avoid collisions across constant pool indices.

When hashing on MachineOperand::MO_ConstantPoolIndex, now MIR-Canon and
MIRVRegNamer will no longer result in a hash collision.

Differential Revision: https://reviews.llvm.org/D74449
This commit is contained in:
Puyan Lotfi 2020-03-10 00:31:01 -04:00
parent 550be40515
commit 4b8af31f63
2 changed files with 21 additions and 1 deletions

View File

@ -69,6 +69,7 @@ std::string VRegRenamer::getInstructionOpcodeHash(MachineInstr &MI) {
case MachineOperand::MO_TargetIndex:
return MO.getOffset() | (MO.getTargetFlags() << 16);
case MachineOperand::MO_FrameIndex:
case MachineOperand::MO_ConstantPoolIndex:
return llvm::hash_value(MO);
// We could explicitly handle all the types of the MachineOperand,
@ -79,7 +80,6 @@ std::string VRegRenamer::getInstructionOpcodeHash(MachineInstr &MI) {
// TODO: Handle the following Index/ID/Predicate cases. They can
// be hashed on in a stable manner.
case MachineOperand::MO_ConstantPoolIndex:
case MachineOperand::MO_JumpTableIndex:
case MachineOperand::MO_CFIIndex:
case MachineOperand::MO_IntrinsicID:

View File

@ -0,0 +1,20 @@
# RUN: llc -o - -run-pass mir-canonicalizer -verify-machineinstrs %s | FileCheck %s
--- |
target triple = "aarch64-unknown-unknown"
define void @f() { unreachable }
...
---
name: f
constants:
- id: 0
value: '<1 x i8> <i8 0>'
- id: 1
value: '<1 x i8> <i8 1>'
body: |
bb.0:
; Test that we no longer have hash collisions between two different consts:
;CHECK: %bb{{[0-9]+}}_{{[0-9]+}}__1:gpr64common = ADR
;CHECK: %bb{{[0-9]+}}_{{[0-9]+}}__1:gpr64common = ADR
%vreg0:gpr64common = ADRP target-flags(aarch64-page) %const.0
%vreg1:gpr64common = ADRP target-flags(aarch64-page) %const.1
...