Skip to content

Commit 82b95d0

Browse files
committed
[X86][GlobalISel] Enable G_BUILD_VECTOR and G_CONSTANT_POOL
* Add support for G_LOAD from G_CONSTANT_POOL on X86 and X64 * Add X86GlobalBaseRegPass to handle base register initialization for X86. * Fix vector type legalization for G_STORE and G_LOAD as well as enable scalarization for them. * Custom lower G_BUILD_VECTOR into G_LOAD from ConstantPool.
1 parent dce197a commit 82b95d0

File tree

7 files changed

+465
-15
lines changed

7 files changed

+465
-15
lines changed

llvm/lib/Target/X86/GISel/X86InstructionSelector.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ bool X86InstructionSelector::selectLoadStoreOp(MachineInstr &I,
548548
unsigned Opc = I.getOpcode();
549549

550550
assert((Opc == TargetOpcode::G_STORE || Opc == TargetOpcode::G_LOAD) &&
551-
"unexpected instruction");
551+
"Only G_STORE and G_LOAD are expected for selection");
552552

553553
const Register DefReg = I.getOperand(0).getReg();
554554
LLT Ty = MRI.getType(DefReg);
@@ -576,11 +576,32 @@ bool X86InstructionSelector::selectLoadStoreOp(MachineInstr &I,
576576
if (NewOpc == Opc)
577577
return false;
578578

579-
X86AddressMode AM;
580-
X86SelectAddress(*MRI.getVRegDef(I.getOperand(1).getReg()), MRI, AM);
581-
582579
I.setDesc(TII.get(NewOpc));
583580
MachineInstrBuilder MIB(MF, I);
581+
const MachineInstr *Ptr = MRI.getVRegDef(I.getOperand(1).getReg());
582+
583+
if (Ptr->getOpcode() == TargetOpcode::G_CONSTANT_POOL) {
584+
assert(Opc == TargetOpcode::G_LOAD &&
585+
"Only G_LOAD from constant pool is expected");
586+
// TODO: Need a separate move for Large model
587+
if (TM.getCodeModel() == CodeModel::Large)
588+
return false;
589+
590+
unsigned char OpFlag = STI.classifyLocalReference(nullptr);
591+
unsigned PICBase = 0;
592+
if (OpFlag == X86II::MO_GOTOFF)
593+
PICBase = STI.getInstrInfo()->getGlobalBaseReg(&MF);
594+
else if (STI.is64Bit())
595+
PICBase = X86::RIP;
596+
597+
I.removeOperand(1);
598+
addConstantPoolReference(MIB, Ptr->getOperand(1).getIndex(), PICBase,
599+
OpFlag);
600+
return constrainSelectedInstRegOperands(I, TII, TRI, RBI);
601+
}
602+
603+
X86AddressMode AM;
604+
X86SelectAddress(*Ptr, MRI, AM);
584605
if (Opc == TargetOpcode::G_LOAD) {
585606
I.removeOperand(1);
586607
addFullAddress(MIB, AM);

llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp

Lines changed: 100 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
#include "X86LegalizerInfo.h"
1414
#include "X86Subtarget.h"
1515
#include "X86TargetMachine.h"
16+
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
1617
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
18+
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
19+
#include "llvm/CodeGen/MachineConstantPool.h"
1720
#include "llvm/CodeGen/TargetOpcodes.h"
1821
#include "llvm/CodeGen/ValueTypes.h"
1922
#include "llvm/IR/DerivedTypes.h"
@@ -71,6 +74,11 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
7174
const LLT v16s32 = LLT::fixed_vector(16, 32);
7275
const LLT v8s64 = LLT::fixed_vector(8, 64);
7376

77+
const LLT s8MaxVector = HasAVX512 ? v64s8 : HasAVX ? v32s8 : v16s8;
78+
const LLT s16MaxVector = HasAVX512 ? v32s16 : HasAVX ? v16s16 : v8s16;
79+
const LLT s32MaxVector = HasAVX512 ? v16s32 : HasAVX ? v8s32 : v4s32;
80+
const LLT s64MaxVector = HasAVX512 ? v8s64 : HasAVX ? v4s64 : v2s64;
81+
7482
// todo: AVX512 bool vector predicate types
7583

7684
// implicit/constants
@@ -338,6 +346,8 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
338346

339347
getActionDefinitionsBuilder(G_INTTOPTR).legalFor({{p0, sMaxScalar}});
340348

349+
getActionDefinitionsBuilder(G_CONSTANT_POOL).legalFor({p0});
350+
341351
getActionDefinitionsBuilder(G_PTR_ADD)
342352
.legalIf([=](const LegalityQuery &Query) -> bool {
343353
return typePairInSet(0, 1, {{p0, s32}})(Query) ||
@@ -368,9 +378,10 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
368378
{s64, p0, s64, 1},
369379
{v2s32, p0, v2s32, 1}});
370380
if (HasSSE1)
381+
Action.legalForTypesWithMemDesc({{v4s32, p0, v4s32, 1}});
382+
if (HasSSE2)
371383
Action.legalForTypesWithMemDesc({{v16s8, p0, v16s8, 1},
372384
{v8s16, p0, v8s16, 1},
373-
{v4s32, p0, v4s32, 1},
374385
{v2s64, p0, v2s64, 1},
375386
{v2p0, p0, v2p0, 1}});
376387
if (HasAVX)
@@ -384,7 +395,9 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
384395
{v32s16, p0, v32s16, 1},
385396
{v16s32, p0, v16s32, 1},
386397
{v8s64, p0, v8s64, 1}});
387-
Action.widenScalarToNextPow2(0, /*Min=*/8).clampScalar(0, s8, sMaxScalar);
398+
Action.widenScalarToNextPow2(0, /*Min=*/8)
399+
.clampScalar(0, s8, sMaxScalar)
400+
.scalarize(0);
388401
}
389402

390403
for (unsigned Op : {G_SEXTLOAD, G_ZEXTLOAD}) {
@@ -406,10 +419,11 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
406419
(Query.Opcode == G_ANYEXT && Query.Types[0] == s128) ||
407420
(Is64Bit && Query.Types[0] == s64);
408421
})
409-
.widenScalarToNextPow2(0, /*Min=*/8)
410-
.clampScalar(0, s8, sMaxScalar)
411-
.widenScalarToNextPow2(1, /*Min=*/8)
412-
.clampScalar(1, s8, sMaxScalar);
422+
.widenScalarToNextPow2(0, /*Min=*/8)
423+
.clampScalar(0, s8, sMaxScalar)
424+
.widenScalarToNextPow2(1, /*Min=*/8)
425+
.clampScalar(1, s8, sMaxScalar)
426+
.scalarize(0);
413427

414428
getActionDefinitionsBuilder(G_SEXT_INREG).lower();
415429

@@ -484,6 +498,19 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
484498
.widenScalarToNextPow2(1);
485499

486500
// vector ops
501+
getActionDefinitionsBuilder(G_BUILD_VECTOR)
502+
.customIf([=](const LegalityQuery &Query) {
503+
return (HasSSE1 && typeInSet(0, {v4s32})(Query)) ||
504+
(HasSSE2 && typeInSet(0, {v2s64, v8s16, v16s8})(Query)) ||
505+
(HasAVX && typeInSet(0, {v4s64, v8s32, v16s16, v32s8})(Query)) ||
506+
(HasAVX512 && typeInSet(0, {v8s64, v16s32, v32s16, v64s8}));
507+
})
508+
.clampNumElements(0, v16s8, s8MaxVector)
509+
.clampNumElements(0, v8s16, s16MaxVector)
510+
.clampNumElements(0, v4s32, s32MaxVector)
511+
.clampNumElements(0, v2s64, s64MaxVector)
512+
.moreElementsToNextPow2(0);
513+
487514
getActionDefinitionsBuilder({G_EXTRACT, G_INSERT})
488515
.legalIf([=](const LegalityQuery &Query) {
489516
unsigned SubIdx = Query.Opcode == G_EXTRACT ? 0 : 1;
@@ -552,6 +579,73 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
552579
verify(*STI.getInstrInfo());
553580
}
554581

582+
bool X86LegalizerInfo::legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
583+
LostDebugLocObserver &LocObserver) const {
584+
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
585+
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
586+
switch (MI.getOpcode()) {
587+
default:
588+
// No idea what to do.
589+
return false;
590+
case TargetOpcode::G_BUILD_VECTOR:
591+
return legalizeBuildVector(MI, MRI, Helper);
592+
}
593+
llvm_unreachable("expected switch to return");
594+
}
595+
596+
bool X86LegalizerInfo::legalizeBuildVector(MachineInstr &MI,
597+
MachineRegisterInfo &MRI,
598+
LegalizerHelper &Helper) const {
599+
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
600+
const auto &BuildVector = cast<GBuildVector>(MI);
601+
Register Dst = BuildVector.getReg(0);
602+
LLT DstTy = MRI.getType(Dst);
603+
if (!isConstantOrConstantVector(MI, MRI, /* AllowFP */ true)) {
604+
return false;
605+
}
606+
607+
MachineFunction &MF = MIRBuilder.getMF();
608+
LLVMContext &Ctx = MF.getFunction().getContext();
609+
uint64_t DstTySize = DstTy.getScalarSizeInBits();
610+
611+
SmallVector<Constant *, 4> CstIdxs;
612+
for (unsigned i = 0; i < BuildVector.getNumSources(); ++i) {
613+
Register Source = BuildVector.getSourceReg(i);
614+
615+
auto ValueAndReg = getIConstantVRegValWithLookThrough(Source, MRI);
616+
if (ValueAndReg) {
617+
CstIdxs.emplace_back(ConstantInt::get(Ctx, ValueAndReg->Value));
618+
continue;
619+
}
620+
621+
auto FPValueAndReg = getFConstantVRegValWithLookThrough(Source, MRI);
622+
if (FPValueAndReg) {
623+
CstIdxs.emplace_back(ConstantFP::get(Ctx, FPValueAndReg->Value));
624+
continue;
625+
}
626+
627+
assert(getOpcodeDef<GImplicitDef>(BuildVector.getSourceReg(i), MRI) &&
628+
"Unexpected constant in G_BUILD_VECTOR of constants");
629+
CstIdxs.emplace_back(UndefValue::get(Type::getIntNTy(Ctx, DstTySize)));
630+
}
631+
632+
Constant *ConstVal = ConstantVector::get(CstIdxs);
633+
634+
const DataLayout &DL = MIRBuilder.getDataLayout();
635+
unsigned AddrSpace = DL.getDefaultGlobalsAddressSpace();
636+
Align Alignment(DL.getABITypeAlign(ConstVal->getType()));
637+
auto Addr = MIRBuilder.buildConstantPool(
638+
LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace)),
639+
MF.getConstantPool()->getConstantPoolIndex(ConstVal, Alignment));
640+
MachineMemOperand *MMO =
641+
MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF),
642+
MachineMemOperand::MOLoad, DstTy, Alignment);
643+
644+
MIRBuilder.buildLoad(Dst, Addr, *MMO);
645+
MI.eraseFromParent();
646+
return true;
647+
}
648+
555649
bool X86LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
556650
MachineInstr &MI) const {
557651
return true;

llvm/lib/Target/X86/GISel/X86LegalizerInfo.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,22 @@ class X86Subtarget;
2222
class X86TargetMachine;
2323

2424
class X86LegalizerInfo : public LegalizerInfo {
25-
private:
26-
/// Keep a reference to the X86Subtarget around so that we can
27-
/// make the right decision when generating code for different targets.
28-
const X86Subtarget &Subtarget;
29-
3025
public:
3126
X86LegalizerInfo(const X86Subtarget &STI, const X86TargetMachine &TM);
3227

28+
bool legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
29+
LostDebugLocObserver &LocObserver) const override;
30+
3331
bool legalizeIntrinsic(LegalizerHelper &Helper,
3432
MachineInstr &MI) const override;
33+
34+
private:
35+
bool legalizeBuildVector(MachineInstr &MI, MachineRegisterInfo &MRI,
36+
LegalizerHelper &Helper) const;
37+
38+
/// Keep a reference to the X86Subtarget around so that we can
39+
/// make the right decision when generating code for different targets.
40+
const X86Subtarget &Subtarget;
3541
};
3642
} // namespace llvm
3743
#endif

llvm/lib/Target/X86/X86TargetMachine.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,9 @@ bool X86PassConfig::addRegBankSelect() {
505505

506506
bool X86PassConfig::addGlobalInstructionSelect() {
507507
addPass(new InstructionSelect(getOptLevel()));
508+
// Add GlobalBaseReg in case there is no SelectionDAG passes afterwards
509+
if (isGlobalISelAbortEnabled())
510+
addPass(createX86GlobalBaseRegPass());
508511
return false;
509512
}
510513

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx %s -o - | FileCheck %s --check-prefixes AVX-ALL,AVX
3+
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx -fast-isel %s -o - | FileCheck %s --check-prefixes AVX-ALL,AVX
4+
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx -global-isel -global-isel-abort=1 %s -o - | FileCheck %s --check-prefixes AVX-ALL,AVX
5+
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f %s -o - | FileCheck %s --check-prefixes AVX-ALL,AVX512
6+
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f -fast-isel %s -o - | FileCheck %s --check-prefixes AVX-ALL,AVX512
7+
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f -global-isel -global-isel-abort=1 %s -o - | FileCheck %s --check-prefixes AVX-ALL,AVX512
8+
9+
;
10+
; 256 bit vectors
11+
;
12+
13+
define <32 x i8> @test_vector_v32i8() {
14+
; AVX-ALL-LABEL: test_vector_v32i8:
15+
; AVX-ALL: # %bb.0:
16+
; AVX-ALL-NEXT: vmovaps {{.*#+}} ymm0 = [99,2,7,77,56,5,48,73,36,63,68,13,59,34,36,117,43,11,61,97,104,113,46,89,42,12,97,41,73,7,55,73]
17+
; AVX-ALL-NEXT: retq
18+
ret <32 x i8> <i8 99, i8 2, i8 7, i8 77, i8 56, i8 5, i8 48, i8 73, i8 36, i8 63, i8 68, i8 13, i8 59, i8 34, i8 36, i8 117, i8 43, i8 11, i8 61, i8 97, i8 104, i8 113, i8 46, i8 89, i8 42, i8 12, i8 97, i8 41, i8 73, i8 7, i8 55, i8 73>
19+
}
20+
21+
define <16 x i16> @test_vector_v16i16() {
22+
; AVX-ALL-LABEL: test_vector_v16i16:
23+
; AVX-ALL: # %bb.0:
24+
; AVX-ALL-NEXT: vmovaps {{.*#+}} ymm0 = [2415,4748,23790,5373,22059,21582,12346,30507,9170,21469,12631,24765,31001,26396,24951,27843]
25+
; AVX-ALL-NEXT: retq
26+
ret <16 x i16> <i16 2415, i16 4748, i16 23790, i16 5373, i16 22059, i16 21582, i16 12346, i16 30507, i16 9170, i16 21469, i16 12631, i16 24765, i16 31001, i16 26396, i16 24951, i16 27843>
27+
}
28+
29+
define <5 x float> @test_vector_v5f32() {
30+
; AVX-ALL-LABEL: test_vector_v5f32:
31+
; AVX-ALL: # %bb.0:
32+
; AVX-ALL-NEXT: vmovaps {{.*#+}} ymm0 = [6.135E+3,2.179E+4,2.8365E+4,6.641E+3,2.6535E+4,u,u,u]
33+
; AVX-ALL-NEXT: retq
34+
ret <5 x float> <float 6135., float 21790., float 28365., float 6641., float 26535.>
35+
}
36+
37+
define <8 x float> @test_vector_v8f32() {
38+
; AVX-ALL-LABEL: test_vector_v8f32:
39+
; AVX-ALL: # %bb.0:
40+
; AVX-ALL-NEXT: vmovaps {{.*#+}} ymm0 = [6.135E+3,2.179E+4,2.8365E+4,6.641E+3,2.6535E+4,2.1447E+4,1.9619E+4,1.1916E+4]
41+
; AVX-ALL-NEXT: retq
42+
ret <8 x float> <float 6135., float 21790., float 28365., float 6641., float 26535., float 21447., float 19619., float 11916.>
43+
}
44+
45+
define <4 x i64> @test_vector_v4i64() {
46+
; AVX-ALL-LABEL: test_vector_v4i64:
47+
; AVX-ALL: # %bb.0:
48+
; AVX-ALL-NEXT: vmovaps {{.*#+}} ymm0 = [23430,24650,1,12]
49+
; AVX-ALL-NEXT: retq
50+
ret <4 x i64> <i64 23430, i64 24650, i64 1, i64 12>
51+
}
52+
53+
;
54+
; 512 bit vectors
55+
;
56+
57+
define <64 x i8> @test_vector_v64i8() {
58+
; AVX-X64-LABEL: test_vector_v64i8:
59+
; AVX-LABEL: test_vector_v64i8:
60+
; AVX: # %bb.0:
61+
; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [0,84,15,13,66,11,70,102,12,82,111,109,61,15,70,8,110,17,35,102,57,111,119,61,112,47,3,34,65,126,55,37]
62+
; AVX-NEXT: vmovaps {{.*#+}} ymm1 = [9,100,124,46,65,75,68,70,120,109,125,21,98,121,127,13,119,64,2,0,9,79,10,78,53,81,37,95,99,79,114,3]
63+
; AVX-NEXT: retq
64+
;
65+
; AVX512-LABEL: test_vector_v64i8:
66+
; AVX512: # %bb.0:
67+
; AVX512-NEXT: vmovaps {{.*#+}} zmm0 = [0,84,15,13,66,11,70,102,12,82,111,109,61,15,70,8,110,17,35,102,57,111,119,61,112,47,3,34,65,126,55,37,9,100,124,46,65,75,68,70,120,109,125,21,98,121,127,13,119,64,2,0,9,79,10,78,53,81,37,95,99,79,114,3]
68+
; AVX512-NEXT: retq
69+
ret <64 x i8> <i8 0, i8 84, i8 15, i8 13, i8 66, i8 11, i8 70, i8 102, i8 12, i8 82, i8 111, i8 109, i8 61, i8 15, i8 70, i8 8, i8 110, i8 17, i8 35, i8 102, i8 57, i8 111, i8 119, i8 61, i8 112, i8 47, i8 3, i8 34, i8 65, i8 126, i8 55, i8 37, i8 9, i8 100, i8 124, i8 46, i8 65, i8 75, i8 68, i8 70, i8 120, i8 109, i8 125, i8 21, i8 98, i8 121, i8 127, i8 13, i8 119, i8 64, i8 2, i8 0, i8 9, i8 79, i8 10, i8 78, i8 53, i8 81, i8 37, i8 95, i8 99, i8 79, i8 114, i8 3>
70+
}
71+
72+
define <32 x i16> @test_vector_v32i16() {
73+
; AVX-LABEL: test_vector_v32i16:
74+
; AVX: # %bb.0:
75+
; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [30901,2280,10793,13893,17914,6183,27317,29748,27420,12395,13504,18229,14700,11550,24714,26203]
76+
; AVX-NEXT: vmovaps {{.*#+}} ymm1 = [23668,3198,27016,12020,31057,19311,16505,24461,28451,19446,23816,10995,17209,5831,27666,21680]
77+
; AVX-NEXT: retq
78+
;
79+
; AVX512-LABEL: test_vector_v32i16:
80+
; AVX512: # %bb.0:
81+
; AVX512-NEXT: vmovaps {{.*#+}} zmm0 = [30901,2280,10793,13893,17914,6183,27317,29748,27420,12395,13504,18229,14700,11550,24714,26203,23668,3198,27016,12020,31057,19311,16505,24461,28451,19446,23816,10995,17209,5831,27666,21680]
82+
; AVX512-NEXT: retq
83+
ret <32 x i16> <i16 30901, i16 2280, i16 10793, i16 13893, i16 17914, i16 6183, i16 27317, i16 29748, i16 27420, i16 12395, i16 13504, i16 18229, i16 14700, i16 11550, i16 24714, i16 26203, i16 23668, i16 3198, i16 27016, i16 12020, i16 31057, i16 19311, i16 16505, i16 24461, i16 28451, i16 19446, i16 23816, i16 10995, i16 17209, i16 5831, i16 27666, i16 21680>
84+
}
85+
86+
define <16 x i32> @test_vector_v16i32() {
87+
; AVX-LABEL: test_vector_v16i32:
88+
; AVX: # %bb.0:
89+
; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [867316,75798,646113,495494,920699,901516,613751,811205]
90+
; AVX-NEXT: vmovaps {{.*#+}} ymm1 = [778508,933022,441446,241046,364018,527717,71828,337100]
91+
; AVX-NEXT: retq
92+
;
93+
; AVX512-LABEL: test_vector_v16i32:
94+
; AVX512: # %bb.0:
95+
; AVX512-NEXT: vmovaps {{.*#+}} zmm0 = [867316,75798,646113,495494,920699,901516,613751,811205,778508,933022,441446,241046,364018,527717,71828,337100]
96+
; AVX512-NEXT: retq
97+
ret <16 x i32> <i32 867316, i32 75798, i32 646113, i32 495494, i32 920699, i32 901516, i32 613751, i32 811205, i32 778508, i32 933022, i32 441446, i32 241046, i32 364018, i32 527717, i32 71828, i32 337100>
98+
}
99+
100+
define <8 x double> @test_vector_v8f64() {
101+
; AVX-LABEL: test_vector_v8f64:
102+
; AVX: # %bb.0:
103+
; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [6.1349999999999998E+0,2.1789999999999998E+0,2.8365E+0,6.641E+0]
104+
; AVX-NEXT: vmovaps {{.*#+}} ymm1 = [2.6535000000000002E+0,2.1446999999999998E+0,1.9619E+0,1.1916E+0]
105+
; AVX-NEXT: retq
106+
;
107+
; AVX512-LABEL: test_vector_v8f64:
108+
; AVX512: # %bb.0:
109+
; AVX512-NEXT: vmovaps {{.*#+}} zmm0 = [6.1349999999999998E+0,2.1789999999999998E+0,2.8365E+0,6.641E+0,2.6535000000000002E+0,2.1446999999999998E+0,1.9619E+0,1.1916E+0]
110+
; AVX512-NEXT: retq
111+
ret <8 x double> <double 6.135, double 2.1790, double 2.8365, double 6.641, double 2.6535, double 2.1447, double 1.9619, double 1.1916>
112+
}

0 commit comments

Comments
 (0)