Skip to content

Commit 843ea98

Browse files
authored
[X86] Allow constant pool references under medium code model in X86InstrInfo::foldMemoryOperandImpl() (#75011)
The medium code model assumes that the constant pool is referenceable with 32-bit relocations.
1 parent 30b9430 commit 843ea98

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8026,9 +8026,8 @@ MachineInstr *X86InstrInfo::foldMemoryOperandImpl(
80268026
// Folding a V_SET0 or V_SETALLONES as a load, to ease register pressure.
80278027
// Create a constant-pool entry and operands to load from it.
80288028

8029-
// Medium and large mode can't fold loads this way.
8030-
if (MF.getTarget().getCodeModel() != CodeModel::Small &&
8031-
MF.getTarget().getCodeModel() != CodeModel::Kernel)
8029+
// Large code model can't fold loads this way.
8030+
if (MF.getTarget().getCodeModel() == CodeModel::Large)
80328031
return nullptr;
80338032

80348033
// x86-32 PIC requires a PIC base register for constant pools.

llvm/test/CodeGen/X86/mmx-fold-zero.ll

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+mmx,+sse2 | FileCheck %s --check-prefix=X86
3-
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse2 | FileCheck %s --check-prefix=X64
3+
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse2 -code-model=small | FileCheck %s --check-prefix=X64
4+
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse2 -code-model=medium | FileCheck %s --check-prefix=X64
5+
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse2 -code-model=large | FileCheck %s --check-prefix=X64-LARGE
46

57
define double @mmx_zero(double, double, double, double) nounwind {
68
; X86-LABEL: mmx_zero:
@@ -78,6 +80,41 @@ define double @mmx_zero(double, double, double, double) nounwind {
7880
; X64-NEXT: paddw %mm2, %mm0
7981
; X64-NEXT: movq2dq %mm0, %xmm0
8082
; X64-NEXT: retq
83+
;
84+
; X64-LARGE-LABEL: mmx_zero:
85+
; X64-LARGE: # %bb.0:
86+
; X64-LARGE-NEXT: movdq2q %xmm0, %mm0
87+
; X64-LARGE-NEXT: movdq2q %xmm1, %mm5
88+
; X64-LARGE-NEXT: movq %mm5, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
89+
; X64-LARGE-NEXT: movq %mm0, %mm3
90+
; X64-LARGE-NEXT: paddd %mm5, %mm3
91+
; X64-LARGE-NEXT: pxor %mm1, %mm1
92+
; X64-LARGE-NEXT: movq %mm3, %mm6
93+
; X64-LARGE-NEXT: pmuludq %mm1, %mm6
94+
; X64-LARGE-NEXT: movdq2q %xmm2, %mm4
95+
; X64-LARGE-NEXT: movq %mm6, %mm2
96+
; X64-LARGE-NEXT: paddd %mm4, %mm2
97+
; X64-LARGE-NEXT: paddw %mm2, %mm0
98+
; X64-LARGE-NEXT: movq %mm5, %mm1
99+
; X64-LARGE-NEXT: paddw %mm0, %mm1
100+
; X64-LARGE-NEXT: movdq2q %xmm3, %mm5
101+
; X64-LARGE-NEXT: movq %mm1, %mm7
102+
; X64-LARGE-NEXT: pmuludq %mm5, %mm7
103+
; X64-LARGE-NEXT: paddw %mm4, %mm7
104+
; X64-LARGE-NEXT: paddw %mm7, %mm5
105+
; X64-LARGE-NEXT: paddw %mm5, %mm2
106+
; X64-LARGE-NEXT: paddw %mm2, %mm0
107+
; X64-LARGE-NEXT: paddw %mm6, %mm0
108+
; X64-LARGE-NEXT: pmuludq %mm3, %mm0
109+
; X64-LARGE-NEXT: pxor %mm3, %mm3
110+
; X64-LARGE-NEXT: paddw %mm3, %mm0
111+
; X64-LARGE-NEXT: paddw %mm1, %mm0
112+
; X64-LARGE-NEXT: pmuludq %mm7, %mm0
113+
; X64-LARGE-NEXT: pmuludq {{[-0-9]+}}(%r{{[sb]}}p), %mm0 # 8-byte Folded Reload
114+
; X64-LARGE-NEXT: paddw %mm5, %mm0
115+
; X64-LARGE-NEXT: paddw %mm2, %mm0
116+
; X64-LARGE-NEXT: movq2dq %mm0, %xmm0
117+
; X64-LARGE-NEXT: retq
81118
%5 = bitcast double %0 to x86_mmx
82119
%6 = bitcast double %1 to x86_mmx
83120
%7 = tail call x86_mmx @llvm.x86.mmx.padd.d(x86_mmx %5, x86_mmx %6)

0 commit comments

Comments
 (0)