Skip to content

Commit 1132464

Browse files
committed
[VP] Refactor VectorBuilder to avoid layering violation. NFC
This patch refactors the handling of reduction to eliminate layering violations. * Introduced `getReductionIntrinsicID` in LoopUtils.h for mapping recurrence kinds to llvm.vector.reduce.* intrinsic IDs. * Updated `VectorBuilder::createSimpleTargetReduction` to accept llvm.vector.reduce.* intrinsic directly. * New function `VPIntrinsic::getForIntrinsic` for mapping intrinsic ID to the same functional VP intrinsic ID.
1 parent b330d80 commit 1132464

File tree

6 files changed

+69
-57
lines changed

6 files changed

+69
-57
lines changed

llvm/include/llvm/IR/IntrinsicInst.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,9 @@ class VPIntrinsic : public IntrinsicInst {
569569
/// The llvm.vp.* intrinsics for this instruction Opcode
570570
static Intrinsic::ID getForOpcode(unsigned OC);
571571

572+
/// The llvm.vp.reduce.* intrinsics for this intrinsic.
573+
static Intrinsic::ID getForIntrinsic(Intrinsic::ID);
574+
572575
// Whether \p ID is a VP intrinsic ID.
573576
static bool isVPIntrinsic(Intrinsic::ID);
574577

llvm/include/llvm/IR/VectorBuilder.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#ifndef LLVM_IR_VECTORBUILDER_H
1616
#define LLVM_IR_VECTORBUILDER_H
1717

18-
#include <llvm/Analysis/IVDescriptors.h>
1918
#include <llvm/IR/IRBuilder.h>
2019
#include <llvm/IR/InstrTypes.h>
2120
#include <llvm/IR/Instruction.h>
@@ -100,11 +99,11 @@ class VectorBuilder {
10099
const Twine &Name = Twine());
101100

102101
/// Emit a VP reduction intrinsic call for recurrence kind.
103-
/// \param Kind The kind of recurrence
102+
/// \param RdxID The intrinsic id of llvm.vector.reduce.*
104103
/// \param ValTy The type of operand which the reduction operation is
105104
/// performed.
106105
/// \param VecOpArray The operand list.
107-
Value *createSimpleTargetReduction(RecurKind Kind, Type *ValTy,
106+
Value *createSimpleTargetReduction(Intrinsic::ID RdxID, Type *ValTy,
108107
ArrayRef<Value *> VecOpArray,
109108
const Twine &Name = Twine());
110109
};

llvm/include/llvm/Transforms/Utils/LoopUtils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,10 @@ bool canSinkOrHoistInst(Instruction &I, AAResults *AA, DominatorTree *DT,
358358
SinkAndHoistLICMFlags &LICMFlags,
359359
OptimizationRemarkEmitter *ORE = nullptr);
360360

361+
/// Returns the llvm.vector.reduce intrinsic that corresponds to the recurrence
362+
/// kind.
363+
Intrinsic::ID getReductionIntrinsicID(RecurKind RK);
364+
361365
/// Returns the arithmetic instruction opcode used when expanding a reduction.
362366
unsigned getArithmeticReductionInstruction(Intrinsic::ID RdxID);
363367

llvm/lib/IR/IntrinsicInst.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,19 @@ Intrinsic::ID VPIntrinsic::getForOpcode(unsigned IROPC) {
599599
return Intrinsic::not_intrinsic;
600600
}
601601

602+
Intrinsic::ID VPIntrinsic::getForIntrinsic(Intrinsic::ID Id) {
603+
switch (Id) {
604+
default:
605+
break;
606+
607+
#define BEGIN_REGISTER_VP_INTRINSIC(VPID, ...) break;
608+
#define VP_PROPERTY_FUNCTIONAL_INTRINSIC(INTRIN) case Intrinsic::INTRIN:
609+
#define END_REGISTER_VP_INTRINSIC(VPID) return Intrinsic::VPID;
610+
#include "llvm/IR/VPIntrinsics.def"
611+
}
612+
return Intrinsic::not_intrinsic;
613+
}
614+
602615
bool VPIntrinsic::canIgnoreVectorLengthParam() const {
603616
using namespace PatternMatch;
604617

llvm/lib/IR/VectorBuilder.cpp

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -60,60 +60,13 @@ Value *VectorBuilder::createVectorInstruction(unsigned Opcode, Type *ReturnTy,
6060
return createVectorInstructionImpl(VPID, ReturnTy, InstOpArray, Name);
6161
}
6262

63-
Value *VectorBuilder::createSimpleTargetReduction(RecurKind Kind, Type *ValTy,
63+
Value *VectorBuilder::createSimpleTargetReduction(Intrinsic::ID RdxID,
64+
Type *ValTy,
6465
ArrayRef<Value *> InstOpArray,
6566
const Twine &Name) {
66-
Intrinsic::ID VPID;
67-
switch (Kind) {
68-
case RecurKind::Add:
69-
VPID = Intrinsic::vp_reduce_add;
70-
break;
71-
case RecurKind::Mul:
72-
VPID = Intrinsic::vp_reduce_mul;
73-
break;
74-
case RecurKind::And:
75-
VPID = Intrinsic::vp_reduce_and;
76-
break;
77-
case RecurKind::Or:
78-
VPID = Intrinsic::vp_reduce_or;
79-
break;
80-
case RecurKind::Xor:
81-
VPID = Intrinsic::vp_reduce_xor;
82-
break;
83-
case RecurKind::FMulAdd:
84-
case RecurKind::FAdd:
85-
VPID = Intrinsic::vp_reduce_fadd;
86-
break;
87-
case RecurKind::FMul:
88-
VPID = Intrinsic::vp_reduce_fmul;
89-
break;
90-
case RecurKind::SMax:
91-
VPID = Intrinsic::vp_reduce_smax;
92-
break;
93-
case RecurKind::SMin:
94-
VPID = Intrinsic::vp_reduce_smin;
95-
break;
96-
case RecurKind::UMax:
97-
VPID = Intrinsic::vp_reduce_umax;
98-
break;
99-
case RecurKind::UMin:
100-
VPID = Intrinsic::vp_reduce_umin;
101-
break;
102-
case RecurKind::FMax:
103-
VPID = Intrinsic::vp_reduce_fmax;
104-
break;
105-
case RecurKind::FMin:
106-
VPID = Intrinsic::vp_reduce_fmin;
107-
break;
108-
case RecurKind::FMaximum:
109-
VPID = Intrinsic::vp_reduce_fmaximum;
110-
break;
111-
case RecurKind::FMinimum:
112-
VPID = Intrinsic::vp_reduce_fminimum;
113-
break;
114-
default:
115-
llvm_unreachable("No VPIntrinsic for this reduction");
116-
}
67+
auto VPID = VPIntrinsic::getForIntrinsic(RdxID);
68+
assert(VPReductionIntrinsic::isVPReduction(VPID) &&
69+
"No VPIntrinsic for this reduction");
11770
return createVectorInstructionImpl(VPID, ValTy, InstOpArray, Name);
11871
}
11972

llvm/lib/Transforms/Utils/LoopUtils.cpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,44 @@ bool llvm::hasIterationCountInvariantInParent(Loop *InnerLoop,
918918
return true;
919919
}
920920

921+
Intrinsic::ID llvm::getReductionIntrinsicID(RecurKind RK) {
922+
switch (RK) {
923+
default:
924+
llvm_unreachable("Unexpected recurrence kind");
925+
case RecurKind::Add:
926+
return Intrinsic::vector_reduce_add;
927+
case RecurKind::Mul:
928+
return Intrinsic::vector_reduce_mul;
929+
case RecurKind::And:
930+
return Intrinsic::vector_reduce_and;
931+
case RecurKind::Or:
932+
return Intrinsic::vector_reduce_or;
933+
case RecurKind::Xor:
934+
return Intrinsic::vector_reduce_xor;
935+
case RecurKind::FMulAdd:
936+
case RecurKind::FAdd:
937+
return Intrinsic::vector_reduce_fadd;
938+
case RecurKind::FMul:
939+
return Intrinsic::vector_reduce_fmul;
940+
case RecurKind::SMax:
941+
return Intrinsic::vector_reduce_smax;
942+
case RecurKind::SMin:
943+
return Intrinsic::vector_reduce_smin;
944+
case RecurKind::UMax:
945+
return Intrinsic::vector_reduce_umax;
946+
case RecurKind::UMin:
947+
return Intrinsic::vector_reduce_umin;
948+
case RecurKind::FMax:
949+
return Intrinsic::vector_reduce_fmax;
950+
case RecurKind::FMin:
951+
return Intrinsic::vector_reduce_fmin;
952+
case RecurKind::FMaximum:
953+
return Intrinsic::vector_reduce_fmaximum;
954+
case RecurKind::FMinimum:
955+
return Intrinsic::vector_reduce_fminimum;
956+
}
957+
}
958+
921959
unsigned llvm::getArithmeticReductionInstruction(Intrinsic::ID RdxID) {
922960
switch (RdxID) {
923961
case Intrinsic::vector_reduce_fadd:
@@ -1197,12 +1235,13 @@ Value *llvm::createSimpleTargetReduction(VectorBuilder &VBuilder, Value *Src,
11971235
RecurKind Kind = Desc.getRecurrenceKind();
11981236
assert(!RecurrenceDescriptor::isAnyOfRecurrenceKind(Kind) &&
11991237
"AnyOf reduction is not supported.");
1238+
Intrinsic::ID Id = getReductionIntrinsicID(Kind);
12001239
auto *SrcTy = cast<VectorType>(Src->getType());
12011240
Type *SrcEltTy = SrcTy->getElementType();
12021241
Value *Iden =
12031242
Desc.getRecurrenceIdentity(Kind, SrcEltTy, Desc.getFastMathFlags());
12041243
Value *Ops[] = {Iden, Src};
1205-
return VBuilder.createSimpleTargetReduction(Kind, SrcTy, Ops);
1244+
return VBuilder.createSimpleTargetReduction(Id, SrcTy, Ops);
12061245
}
12071246

12081247
Value *llvm::createTargetReduction(IRBuilderBase &B,
@@ -1242,9 +1281,10 @@ Value *llvm::createOrderedReduction(VectorBuilder &VBuilder,
12421281
assert(Src->getType()->isVectorTy() && "Expected a vector type");
12431282
assert(!Start->getType()->isVectorTy() && "Expected a scalar type");
12441283

1284+
Intrinsic::ID Id = getReductionIntrinsicID(RecurKind::FAdd);
12451285
auto *SrcTy = cast<VectorType>(Src->getType());
12461286
Value *Ops[] = {Start, Src};
1247-
return VBuilder.createSimpleTargetReduction(RecurKind::FAdd, SrcTy, Ops);
1287+
return VBuilder.createSimpleTargetReduction(Id, SrcTy, Ops);
12481288
}
12491289

12501290
void llvm::propagateIRFlags(Value *I, ArrayRef<Value *> VL, Value *OpValue,

0 commit comments

Comments
 (0)