Skip to content

Commit 90fbc6f

Browse files
committed
[𝘀𝗽𝗿] changes to main this commit is based on
Created using spr 1.3.5 [skip ci]
1 parent fc0b67e commit 90fbc6f

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@ class LegalizerHelper {
281281
MachineInstr &MI,
282282
LostDebugLocObserver &LocObserver);
283283

284+
MachineInstrBuilder
285+
getNeutralElementForVecReduce(unsigned Opcode, MachineIRBuilder &MIRBuilder,
286+
LLT Ty);
287+
284288
public:
285289
/// Return the alignment to use for a stack temporary object with the given
286290
/// type.

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5159,6 +5159,42 @@ LegalizerHelper::moreElementsVectorPhi(MachineInstr &MI, unsigned TypeIdx,
51595159
return Legalized;
51605160
}
51615161

5162+
MachineInstrBuilder LegalizerHelper::getNeutralElementForVecReduce(
5163+
unsigned Opcode, MachineIRBuilder &MIRBuilder, LLT Ty) {
5164+
assert(Ty.isScalar() && "Expected scalar type to make neutral element for");
5165+
5166+
switch (Opcode) {
5167+
default:
5168+
return MIRBuilder.buildUndef(Ty);
5169+
case TargetOpcode::G_VECREDUCE_ADD:
5170+
case TargetOpcode::G_VECREDUCE_OR:
5171+
case TargetOpcode::G_VECREDUCE_XOR:
5172+
case TargetOpcode::G_VECREDUCE_UMAX:
5173+
return MIRBuilder.buildConstant(Ty, 0);
5174+
case TargetOpcode::G_VECREDUCE_MUL:
5175+
return MIRBuilder.buildConstant(Ty, 1);
5176+
case TargetOpcode::G_VECREDUCE_AND:
5177+
case TargetOpcode::G_VECREDUCE_UMIN:
5178+
return MIRBuilder.buildConstant(
5179+
Ty, APInt::getAllOnes(Ty.getScalarSizeInBits()));
5180+
case TargetOpcode::G_VECREDUCE_SMAX:
5181+
return MIRBuilder.buildConstant(
5182+
Ty, APInt::getSignedMinValue(Ty.getSizeInBits()));
5183+
case TargetOpcode::G_VECREDUCE_SMIN:
5184+
return MIRBuilder.buildConstant(
5185+
Ty, APInt::getSignedMaxValue(Ty.getSizeInBits()));
5186+
case TargetOpcode::G_VECREDUCE_FADD:
5187+
return MIRBuilder.buildFConstant(Ty, -0.0);
5188+
case TargetOpcode::G_VECREDUCE_FMUL:
5189+
return MIRBuilder.buildFConstant(Ty, 1.0);
5190+
case TargetOpcode::G_VECREDUCE_FMINIMUM:
5191+
case TargetOpcode::G_VECREDUCE_FMAXIMUM:
5192+
assert(false && "getNeutralElementForVecReduce unimplemented for "
5193+
"G_VECREDUCE_FMINIMUM and G_VECREDUCE_FMAXIMUM!");
5194+
}
5195+
llvm_unreachable("switch expected to return!");
5196+
}
5197+
51625198
LegalizerHelper::LegalizeResult
51635199
LegalizerHelper::moreElementsVector(MachineInstr &MI, unsigned TypeIdx,
51645200
LLT MoreTy) {
@@ -5341,6 +5377,35 @@ LegalizerHelper::moreElementsVector(MachineInstr &MI, unsigned TypeIdx,
53415377
Observer.changedInstr(MI);
53425378
return Legalized;
53435379
}
5380+
case TargetOpcode::G_VECREDUCE_FADD:
5381+
case TargetOpcode::G_VECREDUCE_FMUL:
5382+
case TargetOpcode::G_VECREDUCE_ADD:
5383+
case TargetOpcode::G_VECREDUCE_MUL:
5384+
case TargetOpcode::G_VECREDUCE_AND:
5385+
case TargetOpcode::G_VECREDUCE_OR:
5386+
case TargetOpcode::G_VECREDUCE_XOR:
5387+
case TargetOpcode::G_VECREDUCE_SMAX:
5388+
case TargetOpcode::G_VECREDUCE_SMIN:
5389+
case TargetOpcode::G_VECREDUCE_UMAX:
5390+
case TargetOpcode::G_VECREDUCE_UMIN: {
5391+
LLT OrigTy = MRI.getType(MI.getOperand(1).getReg());
5392+
MachineOperand &MO = MI.getOperand(1);
5393+
auto NewVec = MIRBuilder.buildPadVectorWithUndefElements(MoreTy, MO);
5394+
auto NeutralElement = getNeutralElementForVecReduce(
5395+
MI.getOpcode(), MIRBuilder, MoreTy.getElementType());
5396+
for (size_t i = OrigTy.getNumElements(), e = MoreTy.getNumElements();
5397+
i != e; i++) {
5398+
auto Idx = MIRBuilder.buildConstant(LLT::scalar(32), i);
5399+
NewVec = MIRBuilder.buildInsertVectorElement(MoreTy, NewVec,
5400+
NeutralElement, Idx);
5401+
}
5402+
5403+
Observer.changingInstr(MI);
5404+
MO.setReg(NewVec.getReg(0));
5405+
Observer.changedInstr(MI);
5406+
return Legalized;
5407+
}
5408+
53445409
default:
53455410
return UnableToLegalize;
53465411
}

0 commit comments

Comments
 (0)