case MachineOperand::MO_MCSymbol:
Hash = hash_combine(Hash, Val.Disp->getMCSymbol());
break;
+ case MachineOperand::MO_MachineBasicBlock:
+ Hash = hash_combine(Hash, Val.Disp->getMBB());
+ break;
default:
llvm_unreachable("Invalid address displacement operand");
}
#ifndef NDEBUG
static bool isValidDispOp(const MachineOperand &MO) {
return MO.isImm() || MO.isCPI() || MO.isJTI() || MO.isSymbol() ||
- MO.isGlobal() || MO.isBlockAddress() || MO.isMCSymbol();
+ MO.isGlobal() || MO.isBlockAddress() || MO.isMCSymbol() || MO.isMBB();
}
#endif
(MO1.isBlockAddress() && MO2.isBlockAddress() &&
MO1.getBlockAddress() == MO2.getBlockAddress()) ||
(MO1.isMCSymbol() && MO2.isMCSymbol() &&
- MO1.getMCSymbol() == MO2.getMCSymbol());
+ MO1.getMCSymbol() == MO2.getMCSymbol()) ||
+ (MO1.isMBB() && MO2.isMBB() && MO1.getMBB() == MO2.getMBB());
}
static inline bool isLEA(const MachineInstr &MI) {
--- /dev/null
+; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=corei7 -relocation-model=pic | FileCheck %s
+
+; PR27502
+; UNREACHABLE: "Invalid address displacement operand"
+
+@buf = internal global [5 x i8*] zeroinitializer
+
+declare i32 @llvm.eh.sjlj.setjmp(i8*) nounwind
+
+define i32 @test() nounwind optsize {
+ %r = tail call i32 @llvm.eh.sjlj.setjmp(i8* bitcast ([5 x i8*]* @buf to i8*))
+ ret i32 %r
+; CHECK-LABEL: test:
+; CHECK: leaq .LBB0_3(%rip), %r[[REG:[a-z]+]]
+; CHECK: movq %r[[REG]], buf+8(%rip)
+; CHECK: #EH_SjLj_Setup .LBB0_3
+; CHECK: xorl %e[[REG]], %e[[REG]]
+; CHECK: jmp .LBB0_2
+; CHECK-LABEL: .LBB0_3: # Block address taken
+; CHECK-LABEL: .LBB0_2:
+}