[X86][FastISel] Support materializing floating-point constants for large code model...
authorFangrui Song <maskray@google.com>
Sun, 23 Aug 2020 15:35:59 +0000 (08:35 -0700)
committerFangrui Song <maskray@google.com>
Sun, 23 Aug 2020 15:36:18 +0000 (08:36 -0700)
The following program miscompiles because rL216012 added static
relocation model support but not for PIC.

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

This patch adds PIC support.

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D86024

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

index b305940..f0bd821 100644 (file)
@@ -3793,7 +3793,7 @@ unsigned X86FastISel::X86MaterializeFP(const ConstantFP *CFP, MVT VT) {
       .addConstantPoolIndex(CPI, 0, OpFlag);
     MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
                                       TII.get(Opc), ResultReg);
-    addDirectMem(MIB, AddrReg);
+    addRegReg(MIB, AddrReg, false, PICBase, false);
     MachineMemOperand *MMO = FuncInfo.MF->getMachineMemOperand(
         MachinePointerInfo::getConstantPool(*FuncInfo.MF),
         MachineMemOperand::MOLoad, DL.getPointerSize(), Alignment);
index f1aacc7..a2ce3d5 100644 (file)
@@ -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 @@ define float @constpool_float(float %x) {
 ; 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@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