Skip to content

Commit 2ad782f

Browse files
authored
[VP] Kill VP_PROPERTY_(MEMOP,CASTOP) and simplify _CONSTRAINEDFP [nfc] (#105574)
These lists are quite static. Heavy use of macros is undesirable, and not idiomatic in LLVM, so let's just use the naive switch cases. Note that the first two fields in the CONSTRAINEDFP property were utterly unused (aside from a C++ test). In the same vien as #105551. Once both changes have landed, we'll be left with _BINARYOP which needs a bit of additional untangling, and the actual opcode mappings.
1 parent ecd65e6 commit 2ad782f

File tree

3 files changed

+33
-80
lines changed

3 files changed

+33
-80
lines changed

llvm/include/llvm/IR/VPIntrinsics.def

+15-43
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,10 @@
9595
#define VP_PROPERTY_FUNCTIONAL_OPC(OPC)
9696
#endif
9797

98-
// Whether the intrinsic may have a rounding mode or exception behavior operand
99-
// bundle.
100-
// \p HASROUND '1' if the intrinsic can have a rounding mode operand bundle,
101-
// '0' otherwise.
102-
// \p HASEXCEPT '1' if the intrinsic can have an exception behavior operand
103-
// bundle, '0' otherwise.
104-
// \p INTRINID The constrained fp intrinsic this VP intrinsic corresponds to.
98+
// If operation can have rounding or fp exceptions, maps to corresponding
99+
// constrained fp intrinsic.
105100
#ifndef VP_PROPERTY_CONSTRAINEDFP
106-
#define VP_PROPERTY_CONSTRAINEDFP(HASROUND, HASEXCEPT, INTRINID)
101+
#define VP_PROPERTY_CONSTRAINEDFP(INTRINID)
107102
#endif
108103

109104
// The intrinsic and/or SDNode has the same function as this ISD Opcode.
@@ -123,22 +118,11 @@
123118
#define VP_PROPERTY_NO_FUNCTIONAL
124119
#endif
125120

126-
// This VP Intrinsic is a memory operation
127-
// The pointer arg is at POINTERPOS and the data arg is at DATAPOS.
128-
#ifndef VP_PROPERTY_MEMOP
129-
#define VP_PROPERTY_MEMOP(POINTERPOS, DATAPOS)
130-
#endif
131-
132121
// A property to infer VP binary-op SDNode opcodes automatically.
133122
#ifndef VP_PROPERTY_BINARYOP
134123
#define VP_PROPERTY_BINARYOP
135124
#endif
136125

137-
// A property to infer VP type casts automatically.
138-
#ifndef VP_PROPERTY_CASTOP
139-
#define VP_PROPERTY_CASTOP
140-
#endif
141-
142126
/// } Property Macros
143127

144128
///// Integer Arithmetic {
@@ -327,7 +311,7 @@ END_REGISTER_VP(vp_usub_sat, VP_USUBSAT)
327311
#define HELPER_REGISTER_BINARY_FP_VP(OPSUFFIX, VPSD, IROPC, SDOPC) \
328312
BEGIN_REGISTER_VP(vp_##OPSUFFIX, 2, 3, VPSD, -1) \
329313
VP_PROPERTY_FUNCTIONAL_OPC(IROPC) \
330-
VP_PROPERTY_CONSTRAINEDFP(1, 1, experimental_constrained_##OPSUFFIX) \
314+
VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_##OPSUFFIX) \
331315
VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) \
332316
VP_PROPERTY_BINARYOP \
333317
END_REGISTER_VP(vp_##OPSUFFIX, VPSD)
@@ -369,14 +353,14 @@ END_REGISTER_VP(vp_sqrt, VP_SQRT)
369353

370354
// llvm.vp.fma(x,y,z,mask,vlen)
371355
BEGIN_REGISTER_VP(vp_fma, 3, 4, VP_FMA, -1)
372-
VP_PROPERTY_CONSTRAINEDFP(1, 1, experimental_constrained_fma)
356+
VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_fma)
373357
VP_PROPERTY_FUNCTIONAL_INTRINSIC(fma)
374358
VP_PROPERTY_FUNCTIONAL_SDOPC(FMA)
375359
END_REGISTER_VP(vp_fma, VP_FMA)
376360

377361
// llvm.vp.fmuladd(x,y,z,mask,vlen)
378362
BEGIN_REGISTER_VP(vp_fmuladd, 3, 4, VP_FMULADD, -1)
379-
VP_PROPERTY_CONSTRAINEDFP(1, 1, experimental_constrained_fmuladd)
363+
VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_fmuladd)
380364
VP_PROPERTY_FUNCTIONAL_INTRINSIC(fmuladd)
381365
VP_PROPERTY_FUNCTIONAL_SDOPC(FMAD)
382366
END_REGISTER_VP(vp_fmuladd, VP_FMULADD)
@@ -479,31 +463,30 @@ END_REGISTER_VP(vp_llrint, VP_LLRINT)
479463
#error \
480464
"The internal helper macro HELPER_REGISTER_FP_CAST_VP is already defined!"
481465
#endif
482-
#define HELPER_REGISTER_FP_CAST_VP(OPSUFFIX, VPSD, IROPC, SDOPC, HASROUND) \
466+
#define HELPER_REGISTER_FP_CAST_VP(OPSUFFIX, VPSD, IROPC, SDOPC) \
483467
BEGIN_REGISTER_VP(vp_##OPSUFFIX, 1, 2, VPSD, -1) \
484468
VP_PROPERTY_FUNCTIONAL_OPC(IROPC) \
485469
VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) \
486-
VP_PROPERTY_CONSTRAINEDFP(HASROUND, 1, experimental_constrained_##OPSUFFIX) \
487-
VP_PROPERTY_CASTOP \
470+
VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_##OPSUFFIX) \
488471
END_REGISTER_VP(vp_##OPSUFFIX, VPSD)
489472

490473
// llvm.vp.fptoui(x,mask,vlen)
491-
HELPER_REGISTER_FP_CAST_VP(fptoui, VP_FP_TO_UINT, FPToUI, FP_TO_UINT, 0)
474+
HELPER_REGISTER_FP_CAST_VP(fptoui, VP_FP_TO_UINT, FPToUI, FP_TO_UINT)
492475

493476
// llvm.vp.fptosi(x,mask,vlen)
494-
HELPER_REGISTER_FP_CAST_VP(fptosi, VP_FP_TO_SINT, FPToSI, FP_TO_SINT, 0)
477+
HELPER_REGISTER_FP_CAST_VP(fptosi, VP_FP_TO_SINT, FPToSI, FP_TO_SINT)
495478

496479
// llvm.vp.uitofp(x,mask,vlen)
497-
HELPER_REGISTER_FP_CAST_VP(uitofp, VP_UINT_TO_FP, UIToFP, UINT_TO_FP, 1)
480+
HELPER_REGISTER_FP_CAST_VP(uitofp, VP_UINT_TO_FP, UIToFP, UINT_TO_FP)
498481

499482
// llvm.vp.sitofp(x,mask,vlen)
500-
HELPER_REGISTER_FP_CAST_VP(sitofp, VP_SINT_TO_FP, SIToFP, SINT_TO_FP, 1)
483+
HELPER_REGISTER_FP_CAST_VP(sitofp, VP_SINT_TO_FP, SIToFP, SINT_TO_FP)
501484

502485
// llvm.vp.fptrunc(x,mask,vlen)
503-
HELPER_REGISTER_FP_CAST_VP(fptrunc, VP_FP_ROUND, FPTrunc, FP_ROUND, 1)
486+
HELPER_REGISTER_FP_CAST_VP(fptrunc, VP_FP_ROUND, FPTrunc, FP_ROUND)
504487

505488
// llvm.vp.fpext(x,mask,vlen)
506-
HELPER_REGISTER_FP_CAST_VP(fpext, VP_FP_EXTEND, FPExt, FP_EXTEND, 0)
489+
HELPER_REGISTER_FP_CAST_VP(fpext, VP_FP_EXTEND, FPExt, FP_EXTEND)
507490

508491
#undef HELPER_REGISTER_FP_CAST_VP
509492

@@ -517,7 +500,6 @@ HELPER_REGISTER_FP_CAST_VP(fpext, VP_FP_EXTEND, FPExt, FP_EXTEND, 0)
517500
BEGIN_REGISTER_VP(vp_##OPSUFFIX, 1, 2, VPSD, -1) \
518501
VP_PROPERTY_FUNCTIONAL_OPC(IROPC) \
519502
VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) \
520-
VP_PROPERTY_CASTOP \
521503
END_REGISTER_VP(vp_##OPSUFFIX, VPSD)
522504

523505
// llvm.vp.trunc(x,mask,vlen)
@@ -532,13 +514,11 @@ HELPER_REGISTER_INT_CAST_VP(sext, VP_SIGN_EXTEND, SExt, SIGN_EXTEND)
532514
// llvm.vp.ptrtoint(x,mask,vlen)
533515
BEGIN_REGISTER_VP(vp_ptrtoint, 1, 2, VP_PTRTOINT, -1)
534516
VP_PROPERTY_FUNCTIONAL_OPC(PtrToInt)
535-
VP_PROPERTY_CASTOP
536517
END_REGISTER_VP(vp_ptrtoint, VP_PTRTOINT)
537518

538519
// llvm.vp.inttoptr(x,mask,vlen)
539520
BEGIN_REGISTER_VP(vp_inttoptr, 1, 2, VP_INTTOPTR, -1)
540521
VP_PROPERTY_FUNCTIONAL_OPC(IntToPtr)
541-
VP_PROPERTY_CASTOP
542522
END_REGISTER_VP(vp_inttoptr, VP_INTTOPTR)
543523

544524
#undef HELPER_REGISTER_INT_CAST_VP
@@ -555,7 +535,7 @@ END_REGISTER_VP_SDNODE(VP_SETCC)
555535
BEGIN_REGISTER_VP_INTRINSIC(vp_fcmp, 3, 4)
556536
HELPER_MAP_VPID_TO_VPSD(vp_fcmp, VP_SETCC)
557537
VP_PROPERTY_FUNCTIONAL_OPC(FCmp)
558-
VP_PROPERTY_CONSTRAINEDFP(0, 1, experimental_constrained_fcmp)
538+
VP_PROPERTY_CONSTRAINEDFP(experimental_constrained_fcmp)
559539
END_REGISTER_VP_INTRINSIC(vp_fcmp)
560540

561541
// llvm.vp.icmp(x,y,cc,mask,vlen)
@@ -579,7 +559,6 @@ BEGIN_REGISTER_VP_SDNODE(VP_STORE, 1, vp_store, 4, 5)
579559
HELPER_MAP_VPID_TO_VPSD(vp_store, VP_STORE)
580560
VP_PROPERTY_FUNCTIONAL_OPC(Store)
581561
VP_PROPERTY_FUNCTIONAL_INTRINSIC(masked_store)
582-
VP_PROPERTY_MEMOP(1, 0)
583562
END_REGISTER_VP(vp_store, VP_STORE)
584563

585564
// llvm.experimental.vp.strided.store(val,ptr,stride,mask,vlen)
@@ -588,7 +567,6 @@ BEGIN_REGISTER_VP_INTRINSIC(experimental_vp_strided_store, 3, 4)
588567
VP_PROPERTY_NO_FUNCTIONAL
589568
BEGIN_REGISTER_VP_SDNODE(EXPERIMENTAL_VP_STRIDED_STORE, 1, experimental_vp_strided_store, 5, 6)
590569
HELPER_MAP_VPID_TO_VPSD(experimental_vp_strided_store, EXPERIMENTAL_VP_STRIDED_STORE)
591-
VP_PROPERTY_MEMOP(1, 0)
592570
END_REGISTER_VP(experimental_vp_strided_store, EXPERIMENTAL_VP_STRIDED_STORE)
593571

594572
// llvm.vp.scatter(ptr,val,mask,vlen)
@@ -597,7 +575,6 @@ BEGIN_REGISTER_VP_INTRINSIC(vp_scatter, 2, 3)
597575
BEGIN_REGISTER_VP_SDNODE(VP_SCATTER, 1, vp_scatter, 5, 6)
598576
HELPER_MAP_VPID_TO_VPSD(vp_scatter, VP_SCATTER)
599577
VP_PROPERTY_FUNCTIONAL_INTRINSIC(masked_scatter)
600-
VP_PROPERTY_MEMOP(1, 0)
601578
END_REGISTER_VP(vp_scatter, VP_SCATTER)
602579

603580
// llvm.vp.load(ptr,mask,vlen)
@@ -607,7 +584,6 @@ BEGIN_REGISTER_VP_SDNODE(VP_LOAD, -1, vp_load, 3, 4)
607584
HELPER_MAP_VPID_TO_VPSD(vp_load, VP_LOAD)
608585
VP_PROPERTY_FUNCTIONAL_OPC(Load)
609586
VP_PROPERTY_FUNCTIONAL_INTRINSIC(masked_load)
610-
VP_PROPERTY_MEMOP(0, std::nullopt)
611587
END_REGISTER_VP(vp_load, VP_LOAD)
612588

613589
// llvm.experimental.vp.strided.load(ptr,stride,mask,vlen)
@@ -616,7 +592,6 @@ BEGIN_REGISTER_VP_INTRINSIC(experimental_vp_strided_load, 2, 3)
616592
VP_PROPERTY_NO_FUNCTIONAL
617593
BEGIN_REGISTER_VP_SDNODE(EXPERIMENTAL_VP_STRIDED_LOAD, -1, experimental_vp_strided_load, 4, 5)
618594
HELPER_MAP_VPID_TO_VPSD(experimental_vp_strided_load, EXPERIMENTAL_VP_STRIDED_LOAD)
619-
VP_PROPERTY_MEMOP(0, std::nullopt)
620595
END_REGISTER_VP(experimental_vp_strided_load, EXPERIMENTAL_VP_STRIDED_LOAD)
621596

622597
// llvm.vp.gather(ptr,mask,vlen)
@@ -625,7 +600,6 @@ BEGIN_REGISTER_VP_INTRINSIC(vp_gather, 1, 2)
625600
BEGIN_REGISTER_VP_SDNODE(VP_GATHER, -1, vp_gather, 4, 5)
626601
HELPER_MAP_VPID_TO_VPSD(vp_gather, VP_GATHER)
627602
VP_PROPERTY_FUNCTIONAL_INTRINSIC(masked_gather)
628-
VP_PROPERTY_MEMOP(0, std::nullopt)
629603
END_REGISTER_VP(vp_gather, VP_GATHER)
630604

631605
///// } Memory Operations
@@ -778,10 +752,8 @@ END_REGISTER_VP(experimental_vp_splat, EXPERIMENTAL_VP_SPLAT)
778752
#undef END_REGISTER_VP_SDNODE
779753
#undef HELPER_MAP_VPID_TO_VPSD
780754
#undef VP_PROPERTY_BINARYOP
781-
#undef VP_PROPERTY_CASTOP
782755
#undef VP_PROPERTY_CONSTRAINEDFP
783756
#undef VP_PROPERTY_FUNCTIONAL_INTRINSIC
784757
#undef VP_PROPERTY_FUNCTIONAL_OPC
785758
#undef VP_PROPERTY_FUNCTIONAL_SDOPC
786759
#undef VP_PROPERTY_NO_FUNCTIONAL
787-
#undef VP_PROPERTY_MEMOP

llvm/lib/IR/IntrinsicInst.cpp

+18-21
Original file line numberDiff line numberDiff line change
@@ -479,13 +479,16 @@ std::optional<unsigned>
479479
VPIntrinsic::getMemoryPointerParamPos(Intrinsic::ID VPID) {
480480
switch (VPID) {
481481
default:
482-
break;
483-
#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
484-
#define VP_PROPERTY_MEMOP(POINTERPOS, ...) return POINTERPOS;
485-
#define END_REGISTER_VP_INTRINSIC(VPID) break;
486-
#include "llvm/IR/VPIntrinsics.def"
482+
return std::nullopt;
483+
case Intrinsic::vp_store:
484+
case Intrinsic::vp_scatter:
485+
case Intrinsic::experimental_vp_strided_store:
486+
return 1;
487+
case Intrinsic::vp_load:
488+
case Intrinsic::vp_gather:
489+
case Intrinsic::experimental_vp_strided_load:
490+
return 0;
487491
}
488-
return std::nullopt;
489492
}
490493

491494
/// \return The data (payload) operand of this store or scatter.
@@ -499,13 +502,12 @@ Value *VPIntrinsic::getMemoryDataParam() const {
499502
std::optional<unsigned> VPIntrinsic::getMemoryDataParamPos(Intrinsic::ID VPID) {
500503
switch (VPID) {
501504
default:
502-
break;
503-
#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
504-
#define VP_PROPERTY_MEMOP(POINTERPOS, DATAPOS) return DATAPOS;
505-
#define END_REGISTER_VP_INTRINSIC(VPID) break;
506-
#include "llvm/IR/VPIntrinsics.def"
505+
return std::nullopt;
506+
case Intrinsic::vp_store:
507+
case Intrinsic::vp_scatter:
508+
case Intrinsic::experimental_vp_strided_store:
509+
return 0;
507510
}
508-
return std::nullopt;
509511
}
510512

511513
constexpr bool isVPIntrinsic(Intrinsic::ID ID) {
@@ -589,7 +591,7 @@ VPIntrinsic::getConstrainedIntrinsicIDForVP(Intrinsic::ID ID) {
589591
default:
590592
break;
591593
#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
592-
#define VP_PROPERTY_CONSTRAINEDFP(HASRND, HASEXCEPT, CID) return Intrinsic::CID;
594+
#define VP_PROPERTY_CONSTRAINEDFP(CID) return Intrinsic::CID;
593595
#define END_REGISTER_VP_INTRINSIC(VPID) break;
594596
#include "llvm/IR/VPIntrinsics.def"
595597
}
@@ -760,14 +762,9 @@ bool VPReductionIntrinsic::isVPReduction(Intrinsic::ID ID) {
760762
}
761763

762764
bool VPCastIntrinsic::isVPCast(Intrinsic::ID ID) {
763-
switch (ID) {
764-
default:
765-
break;
766-
#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) case Intrinsic::VPID:
767-
#define VP_PROPERTY_CASTOP return true;
768-
#define END_REGISTER_VP_INTRINSIC(VPID) break;
769-
#include "llvm/IR/VPIntrinsics.def"
770-
}
765+
// All of the vp.casts correspond to instructions
766+
if (std::optional<unsigned> Opc = getFunctionalOpcodeForVP(ID))
767+
return Instruction::isCast(*Opc);
771768
return false;
772769
}
773770

llvm/unittests/IR/VPIntrinsicTest.cpp

-16
Original file line numberDiff line numberDiff line change
@@ -454,22 +454,6 @@ TEST_F(VPIntrinsicTest, VPIntrinsicDeclarationForParams) {
454454
}
455455
}
456456

457-
/// Check that the HANDLE_VP_TO_CONSTRAINEDFP maps to an existing intrinsic with
458-
/// the right amount of constrained-fp metadata args.
459-
TEST_F(VPIntrinsicTest, HandleToConstrainedFP) {
460-
#define VP_PROPERTY_CONSTRAINEDFP(HASROUND, HASEXCEPT, CFPID) \
461-
{ \
462-
SmallVector<Intrinsic::IITDescriptor, 5> T; \
463-
Intrinsic::getIntrinsicInfoTableEntries(Intrinsic::CFPID, T); \
464-
unsigned NumMetadataArgs = 0; \
465-
for (auto TD : T) \
466-
NumMetadataArgs += (TD.Kind == Intrinsic::IITDescriptor::Metadata); \
467-
bool IsCmp = Intrinsic::CFPID == Intrinsic::experimental_constrained_fcmp; \
468-
ASSERT_EQ(NumMetadataArgs, (unsigned)(IsCmp + HASROUND + HASEXCEPT)); \
469-
}
470-
#include "llvm/IR/VPIntrinsics.def"
471-
}
472-
473457
} // end anonymous namespace
474458

475459
/// Check various properties of VPReductionIntrinsics

0 commit comments

Comments
 (0)