summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/X86/X86OptimizeLEAs.cpp8
-rw-r--r--llvm/test/CodeGen/X86/lea-opt-memop-check-1.ll (renamed from llvm/test/CodeGen/X86/lea-opt-memop-check.ll)1
-rw-r--r--llvm/test/CodeGen/X86/lea-opt-memop-check-2.ll21
3 files changed, 27 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86OptimizeLEAs.cpp b/llvm/lib/Target/X86/X86OptimizeLEAs.cpp
index 5a7b562cb1d..3c83f5d64dc 100644
--- a/llvm/lib/Target/X86/X86OptimizeLEAs.cpp
+++ b/llvm/lib/Target/X86/X86OptimizeLEAs.cpp
@@ -146,6 +146,9 @@ template <> struct DenseMapInfo<MemOpKey> {
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");
}
@@ -185,7 +188,7 @@ static inline bool isIdenticalOp(const MachineOperand &MO1,
#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
@@ -203,7 +206,8 @@ static bool isSimilarDispOp(const MachineOperand &MO1,
(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) {
diff --git a/llvm/test/CodeGen/X86/lea-opt-memop-check.ll b/llvm/test/CodeGen/X86/lea-opt-memop-check-1.ll
index cdf99a14af0..08e510772a8 100644
--- a/llvm/test/CodeGen/X86/lea-opt-memop-check.ll
+++ b/llvm/test/CodeGen/X86/lea-opt-memop-check-1.ll
@@ -1,4 +1,3 @@
-; REQUIRES: asserts
; RUN: llc < %s -march=x86 -mtriple=i686-pc-win32 | FileCheck %s
; PR26575
diff --git a/llvm/test/CodeGen/X86/lea-opt-memop-check-2.ll b/llvm/test/CodeGen/X86/lea-opt-memop-check-2.ll
new file mode 100644
index 00000000000..f3fc95f8be3
--- /dev/null
+++ b/llvm/test/CodeGen/X86/lea-opt-memop-check-2.ll
@@ -0,0 +1,21 @@
+; 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:
+}
OpenPOWER on IntegriCloud