diff options
-rw-r--r-- | llvm/lib/Target/X86/X86OptimizeLEAs.cpp | 8 | ||||
-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.ll | 21 |
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: +} |