[PATCH] D86024: [X86][FastISel] Support materializing floating-point constants for large code model & PIC

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 15 14:26:41 PDT 2020


MaskRay created this revision.
MaskRay added reviewers: craig.topper, ributzka.
Herald added subscribers: llvm-commits, dexonsmith, hiraditya.
Herald added a project: LLVM.
MaskRay requested review of this revision.

The following program will compile incorrectly because rL216012 <https://reviews.llvm.org/rL216012> added
static relocation model support but not PIC.

  // clang -fpic -mcmodel=large a.cc
  double foo() { return 42.0; }

This patch adds PIC support.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D86024

Files:
  llvm/lib/Target/X86/X86FastISel.cpp
  llvm/test/CodeGen/X86/fast-isel-constpool.ll


Index: llvm/test/CodeGen/X86/fast-isel-constpool.ll
===================================================================
--- llvm/test/CodeGen/X86/fast-isel-constpool.ll
+++ llvm/test/CodeGen/X86/fast-isel-constpool.ll
@@ -1,6 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc -mtriple=x86_64-apple-darwin -fast-isel -code-model=small < %s | FileCheck %s
 ; RUN: llc -mtriple=x86_64-apple-darwin -fast-isel -code-model=large < %s | FileCheck %s --check-prefix=LARGE
+; RUN: llc -mtriple=x86_64 -fast-isel -code-model=large -relocation-model=pic < %s | FileCheck %s --check-prefix=LARGE_PIC
 ; RUN: llc -mtriple=x86_64-apple-darwin -fast-isel -code-model=small -mattr=avx < %s | FileCheck %s --check-prefix=AVX
 ; RUN: llc -mtriple=x86_64-apple-darwin -fast-isel -code-model=large -mattr=avx < %s | FileCheck %s --check-prefix=LARGE_AVX
 ; RUN: llc -mtriple=x86_64-apple-darwin -fast-isel -code-model=small -mattr=avx512f < %s | FileCheck %s --check-prefix=AVX
@@ -25,6 +26,16 @@
 ; LARGE-NEXT:    addss (%rax), %xmm0
 ; LARGE-NEXT:    retq
 ;
+; LARGE_PIC-LABEL: constpool_float:
+; LARGE_PIC:       # %bb.0:
+; LARGE_PIC-NEXT:  .L0$pb:
+; LARGE_PIC-NEXT:    leaq .L0$pb(%rip), %rax
+; LARGE_PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
+; LARGE_PIC-NEXT:    addq %rax, %rcx
+; LARGE_PIC-NEXT:    movabsq $.LCPI0_0 at GOTOFF, %rax
+; LARGE_PIC-NEXT:    addss (%rax,%rcx), %xmm0
+; LARGE_PIC-NEXT:    retq
+;
 ; AVX-LABEL: constpool_float:
 ; AVX:       ## %bb.0:
 ; AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
Index: llvm/lib/Target/X86/X86FastISel.cpp
===================================================================
--- llvm/lib/Target/X86/X86FastISel.cpp
+++ llvm/lib/Target/X86/X86FastISel.cpp
@@ -3793,7 +3793,10 @@
       .addConstantPoolIndex(CPI, 0, OpFlag);
     MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
                                       TII.get(Opc), ResultReg);
-    addDirectMem(MIB, AddrReg);
+    if (TM.getRelocationModel() == Reloc::Static)
+      addDirectMem(MIB, AddrReg);
+    else
+      addRegReg(MIB, AddrReg, false, PICBase, false);
     MachineMemOperand *MMO = FuncInfo.MF->getMachineMemOperand(
         MachinePointerInfo::getConstantPool(*FuncInfo.MF),
         MachineMemOperand::MOLoad, DL.getPointerSize(), Alignment);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86024.285860.patch
Type: text/x-patch
Size: 2365 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200815/877aa101/attachment.bin>


More information about the llvm-commits mailing list