diff options
| author | Akira Hatanaka <ahatanaka@apple.com> | 2014-08-02 05:40:40 +0000 |
|---|---|---|
| committer | Akira Hatanaka <ahatanaka@apple.com> | 2014-08-02 05:40:40 +0000 |
| commit | dc08c30df9098b397a103d96999d7455d1a666bc (patch) | |
| tree | b4b46c6ffab28eaeb28f94e16651d94b4b958a86 | |
| parent | 70735351cac874a7d56bc03fe315d76c308130d0 (diff) | |
| download | bcm5719-llvm-dc08c30df9098b397a103d96999d7455d1a666bc.tar.gz bcm5719-llvm-dc08c30df9098b397a103d96999d7455d1a666bc.zip | |
[ARM] In dynamic-no-pic mode, ARM's post-RA pseudo expansion was incorrectly
expanding pseudo LOAD_STATCK_GUARD using instructions that are normally used
in pic mode. This patch fixes the bug.
<rdar://problem/17886592>
llvm-svn: 214614
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb1InstrInfo.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb2InstrInfo.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/stack_guard_remat.ll | 13 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb/stack_guard_remat.ll | 13 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb2/stack_guard_remat.ll | 6 |
6 files changed, 33 insertions, 17 deletions
diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.cpp b/llvm/lib/Target/ARM/ARMInstrInfo.cpp index 77002449016..484a5e452a1 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMInstrInfo.cpp @@ -92,10 +92,10 @@ unsigned ARMInstrInfo::getUnindexedOpcode(unsigned Opc) const { void ARMInstrInfo::expandLoadStackGuard(MachineBasicBlock::iterator MI, Reloc::Model RM) const { - if (RM == Reloc::Static) - expandLoadStackGuardBase(MI, ARM::LDRLIT_ga_abs, ARM::LDRi12, RM); - else + if (RM == Reloc::PIC_) expandLoadStackGuardBase(MI, ARM::LDRLIT_ga_pcrel, ARM::LDRi12, RM); + else + expandLoadStackGuardBase(MI, ARM::LDRLIT_ga_abs, ARM::LDRi12, RM); } namespace { diff --git a/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp b/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp index c66cc7b1a93..abde25081b0 100644 --- a/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp +++ b/llvm/lib/Target/ARM/Thumb1InstrInfo.cpp @@ -105,8 +105,8 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, void Thumb1InstrInfo::expandLoadStackGuard(MachineBasicBlock::iterator MI, Reloc::Model RM) const { - if (RM == Reloc::Static) - expandLoadStackGuardBase(MI, ARM::tLDRLIT_ga_abs, ARM::tLDRi, RM); - else + if (RM == Reloc::PIC_) expandLoadStackGuardBase(MI, ARM::tLDRLIT_ga_pcrel, ARM::tLDRi, RM); + else + expandLoadStackGuardBase(MI, ARM::tLDRLIT_ga_abs, ARM::tLDRi, RM); } diff --git a/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp b/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp index 1ae9f42732a..91973e1c463 100644 --- a/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp +++ b/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp @@ -212,10 +212,10 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, void Thumb2InstrInfo::expandLoadStackGuard(MachineBasicBlock::iterator MI, Reloc::Model RM) const { - if (RM == Reloc::Static) - expandLoadStackGuardBase(MI, ARM::t2MOVi32imm, ARM::t2LDRi12, RM); - else + if (RM == Reloc::PIC_) expandLoadStackGuardBase(MI, ARM::t2MOV_ga_pcrel, ARM::t2LDRi12, RM); + else + expandLoadStackGuardBase(MI, ARM::t2MOVi32imm, ARM::t2LDRi12, RM); } void llvm::emitT2RegPlusImmediate(MachineBasicBlock &MBB, diff --git a/llvm/test/CodeGen/ARM/stack_guard_remat.ll b/llvm/test/CodeGen/ARM/stack_guard_remat.ll index 3c69a9de52b..7dc18250d38 100644 --- a/llvm/test/CodeGen/ARM/stack_guard_remat.ll +++ b/llvm/test/CodeGen/ARM/stack_guard_remat.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -mtriple=arm-apple-ios -relocation-model=pic -no-integrated-as | FileCheck %s -check-prefix=PIC -; RUN: llc < %s -mtriple=arm-apple-ios -relocation-model=static -no-integrated-as | FileCheck %s -check-prefix=STATIC +; RUN: llc < %s -mtriple=arm-apple-ios -relocation-model=static -no-integrated-as | FileCheck %s -check-prefix=NO-PIC -check-prefix=STATIC +; RUN: llc < %s -mtriple=arm-apple-ios -relocation-model=dynamic-no-pic -no-integrated-as | FileCheck %s -check-prefix=NO-PIC -check-prefix=DYNAMIC-NO-PIC ;PIC: foo2 ;PIC: ldr [[R0:r[0-9]+]], [[LABEL0:LCPI[0-9_]+]] @@ -11,13 +12,17 @@ ;PIC: [[LABEL0]]: ;PIC-NEXT: .long L___stack_chk_guard$non_lazy_ptr-([[LABEL1]]+8) -;STATIC: foo2 -;STATIC: ldr [[R0:r[0-9]+]], [[LABEL0:LCPI[0-9_]+]] -;STATIC: ldr {{r[0-9]+}}, {{\[}}[[R0]]{{\]}} +;NO-PIC: foo2 +;NO-PIC: ldr [[R0:r[0-9]+]], [[LABEL0:LCPI[0-9_]+]] +;NO-PIC-NOT: LPC +;NO-PIC: ldr {{r[0-9]+}}, {{\[}}[[R0]]{{\]}} ;STATIC: [[LABEL0]]: ;STATIC-NEXT: .long ___stack_chk_guard +;DYNAMIC-NO-PIC: [[LABEL0]]: +;DYNAMIC-NO-PIC-NEXT: .long L___stack_chk_guard$non_lazy_ptr + ; Function Attrs: nounwind ssp define i32 @test_stack_guard_remat() #0 { %a1 = alloca [256 x i32], align 4 diff --git a/llvm/test/CodeGen/Thumb/stack_guard_remat.ll b/llvm/test/CodeGen/Thumb/stack_guard_remat.ll index 2bb690c06c7..e949cc181f1 100644 --- a/llvm/test/CodeGen/Thumb/stack_guard_remat.ll +++ b/llvm/test/CodeGen/Thumb/stack_guard_remat.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -mtriple=thumb-apple-darwin -relocation-model=pic -no-integrated-as | FileCheck %s -check-prefix=PIC -; RUN: llc < %s -mtriple=thumb-apple-darwin -relocation-model=static -no-integrated-as | FileCheck %s -check-prefix=STATIC +; RUN: llc < %s -mtriple=thumb-apple-darwin -relocation-model=static -no-integrated-as | FileCheck %s -check-prefix=NO-PIC -check-prefix=STATIC +; RUN: llc < %s -mtriple=thumb-apple-darwin -relocation-model=dynamic-no-pic -no-integrated-as | FileCheck %s -check-prefix=NO-PIC -check-prefix=DYNAMIC-NO-PIC ;PIC: foo2 ;PIC: ldr [[R0:r[0-9]+]], [[LABEL0:LCPI[0-9_]+]] @@ -11,13 +12,17 @@ ;PIC: [[LABEL0]]: ;PIC-NEXT: .long L___stack_chk_guard$non_lazy_ptr-([[LABEL1]]+4) -;STATIC: foo2 -;STATIC: ldr [[R0:r[0-9]+]], [[LABEL0:LCPI[0-9_]+]] -;STATIC: ldr {{r[0-9]+}}, {{\[}}[[R0]]{{\]}} +;NO-PIC: foo2 +;NO-PIC: ldr [[R0:r[0-9]+]], [[LABEL0:LCPI[0-9_]+]] +;NO-PIC-NOT: LPC +;NO-PIC: ldr {{r[0-9]+}}, {{\[}}[[R0]]{{\]}} ;STATIC: [[LABEL0]]: ;STATIC-NEXT: .long ___stack_chk_guard +;DYNAMIC-NO-PIC: [[LABEL0]]: +;DYNAMIC-NO-PIC-NEXT: .long L___stack_chk_guard$non_lazy_ptr + ; Function Attrs: nounwind ssp define i32 @test_stack_guard_remat() #0 { %a1 = alloca [256 x i32], align 4 diff --git a/llvm/test/CodeGen/Thumb2/stack_guard_remat.ll b/llvm/test/CodeGen/Thumb2/stack_guard_remat.ll index a0982be5f56..c8ea8714d31 100644 --- a/llvm/test/CodeGen/Thumb2/stack_guard_remat.ll +++ b/llvm/test/CodeGen/Thumb2/stack_guard_remat.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -mtriple=thumbv7-apple-ios -relocation-model=pic -no-integrated-as | FileCheck %s -check-prefix=PIC ; RUN: llc < %s -mtriple=thumbv7-apple-ios -relocation-model=static -no-integrated-as | FileCheck %s -check-prefix=STATIC +; RUN: llc < %s -mtriple=thumbv7-apple-ios -relocation-model=dynamic-no-pic -no-integrated-as | FileCheck %s -check-prefix=DYNAMIC-NO-PIC ;PIC: foo2 ;PIC: movw [[R0:r[0-9]+]], :lower16:(L___stack_chk_guard$non_lazy_ptr-([[LABEL0:LPC[0-9_]+]]+4)) @@ -14,6 +15,11 @@ ;STATIC: movt [[R0]], :upper16:___stack_chk_guard ;STATIC: ldr {{r[0-9]+}}, {{\[}}[[R0]]{{\]}} +;DYNAMIC-NO-PIC: foo2 +;DYNAMIC-NO-PIC: movw [[R0:r[0-9]+]], :lower16:L___stack_chk_guard$non_lazy_ptr +;DYNAMIC-NO-PIC: movt [[R0]], :upper16:L___stack_chk_guard$non_lazy_ptr +;DYNAMIC-NO-PIC: ldr {{r[0-9]+}}, {{\[}}[[R0]]{{\]}} + ; Function Attrs: nounwind ssp define i32 @test_stack_guard_remat() #0 { %a1 = alloca [256 x i32], align 4 |

