From 8ddb8b4b8d7452000305442117d3e470e0a1803a Mon Sep 17 00:00:00 2001 From: Andrey Turetskiy Date: Tue, 26 Apr 2016 12:18:12 +0000 Subject: [PATCH] [X86] PR27502: Fix the LEA optimization pass. Handle MachineBasicBlock as a memory displacement operand in the LEA optimization pass. Differential Revision: http://reviews.llvm.org/D19409 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267551 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86OptimizeLEAs.cpp | 8 ++++++-- ...-opt-memop-check.ll => lea-opt-memop-check-1.ll} | 1 - test/CodeGen/X86/lea-opt-memop-check-2.ll | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) rename test/CodeGen/X86/{lea-opt-memop-check.ll => lea-opt-memop-check-1.ll} (99%) create mode 100644 test/CodeGen/X86/lea-opt-memop-check-2.ll diff --git a/lib/Target/X86/X86OptimizeLEAs.cpp b/lib/Target/X86/X86OptimizeLEAs.cpp index 5a7b562cb1d..3c83f5d64dc 100644 --- a/lib/Target/X86/X86OptimizeLEAs.cpp +++ b/lib/Target/X86/X86OptimizeLEAs.cpp @@ -146,6 +146,9 @@ template <> struct DenseMapInfo { 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/test/CodeGen/X86/lea-opt-memop-check.ll b/test/CodeGen/X86/lea-opt-memop-check-1.ll similarity index 99% rename from test/CodeGen/X86/lea-opt-memop-check.ll rename to test/CodeGen/X86/lea-opt-memop-check-1.ll index cdf99a14af0..08e510772a8 100644 --- a/test/CodeGen/X86/lea-opt-memop-check.ll +++ b/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/test/CodeGen/X86/lea-opt-memop-check-2.ll b/test/CodeGen/X86/lea-opt-memop-check-2.ll new file mode 100644 index 00000000000..f3fc95f8be3 --- /dev/null +++ b/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: +} -- 2.11.0