Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LLVM] Add llvm.experimental.vector.compress intrinsic #92289

Merged
merged 56 commits into from
Jul 17, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
3a7b064
Add initial code for @llvm.masked.compress intrinsics
lawben May 15, 2024
75abf0b
Remove requirements for legal types
lawben May 15, 2024
0329bc9
Add tests for AArch64
lawben May 15, 2024
73bfebb
Add floating point test
lawben May 15, 2024
e4423a1
Add documentation
lawben May 15, 2024
3e99678
Fix formatting
lawben May 15, 2024
b686f83
Fix references in docs
lawben May 16, 2024
73cc28f
Add widen for vector type legalization
lawben May 16, 2024
8a613f3
Put expand logic in TargerLowering to avoid code duplication.
lawben May 16, 2024
a4df959
Fix formatting
lawben May 16, 2024
17004b9
Add basic lowering of MCOMPRESS in GlobalISel
lawben May 17, 2024
984cad1
Add basic AArch64 MIR test
lawben May 17, 2024
0ea2415
Address PR comments
lawben May 17, 2024
1dc79b4
Update docs according to PR comments
lawben May 17, 2024
c8515ca
Match result and input types of MCOMPRES
lawben May 21, 2024
8353b2d
Add constant folding to SelectionDAG::getNode()
lawben May 21, 2024
a9aba29
Address PR comments for type legalization
lawben May 21, 2024
b0af320
Move masked.compress in docs
lawben May 21, 2024
d9587c7
Fix bug for x86 result widening
lawben May 21, 2024
c04da9b
Remove zero-fill when widening vector
lawben May 21, 2024
a60523c
Use [[maybe_unused]] for asserts
lawben May 22, 2024
9279e5e
Move constant folding to DAGCombiner
lawben May 24, 2024
b48dada
Change TODO for AArch64 GlobalISel
lawben May 24, 2024
d443671
Remove wrong ISA from docs
lawben May 24, 2024
d45f61b
Rename MCOMPRESS to MASKED_COMPRESS
lawben Jun 7, 2024
4366a43
Get stack alignment for load in GlobalISel
lawben Jun 7, 2024
808709f
Fix formatting
lawben Jun 7, 2024
d5fca0f
Replace use of TLI inside of TargetLowering
lawben Jun 7, 2024
00b64d2
Use vector alignement for stack load
lawben Jun 7, 2024
60f9c61
Add llvm.masked.compress to release notes
lawben Jun 7, 2024
3faed13
Merge branch 'main' into masked_compress
lawben Jun 7, 2024
6aa480c
Merge branch 'main' into masked_compress
lawben Jun 7, 2024
6549386
Merge branch 'main' into masked_compress
lawben Jun 12, 2024
5589519
Merge branch 'main' into masked_compress
lawben Jun 17, 2024
f7e4b48
Add passthru vector to @llvm.masked.compress
lawben Jun 17, 2024
9f291c8
Add passthru to DAGCombiner
lawben Jun 17, 2024
c733d6b
Update LangRef with passthru
lawben Jun 17, 2024
9222b54
Add passthru to GlobalISel
lawben Jun 17, 2024
616c142
Merge branch 'main' into masked_compress
lawben Jun 17, 2024
daa784f
Fix formatting
lawben Jun 17, 2024
3e4673c
Fix GlobalISel test
lawben Jun 17, 2024
4b12b32
Update comment on MASKED_COMPRESS opcode
lawben Jun 17, 2024
6c9c969
Fix docs
lawben Jun 17, 2024
069eb24
Address PR comments
lawben Jun 18, 2024
457cbdf
Merge branch 'main' into masked_compress
lawben Jun 19, 2024
5e3189b
Use isConstTrueVal
lawben Jun 19, 2024
6b3a3b8
Remove redundant undef
lawben Jun 19, 2024
50cce23
Address PR comments
lawben Jun 21, 2024
89c3e9f
Return passthru for undef mask or vec
lawben Jun 21, 2024
995c863
Address PR comments
lawben Jun 25, 2024
adb9d9c
Rename masked.compress to experimental.vector.compress
lawben Jul 1, 2024
ba2939e
Add freeze to mask extract for poison/undef entries
lawben Jul 1, 2024
11e1742
Fix docs
lawben Jul 1, 2024
32cc27f
Fix docs
lawben Jul 2, 2024
99610a8
Address PR comments
lawben Jul 3, 2024
efa2e92
Merge branch 'main' into masked_compress
lawben Jul 16, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,7 @@ class LegalizerHelper {
LegalizeResult lowerUnmergeValues(MachineInstr &MI);
LegalizeResult lowerExtractInsertVectorElt(MachineInstr &MI);
LegalizeResult lowerShuffleVector(MachineInstr &MI);
LegalizeResult lowerMCOMPRESS(MachineInstr &MI);
Register getDynStackAllocTargetPtr(Register SPReg, Register AllocSize,
Align Alignment, LLT PtrTy);
LegalizeResult lowerDynStackAlloc(MachineInstr &MI);
Expand Down
3 changes: 3 additions & 0 deletions llvm/include/llvm/Support/TargetOpcodes.def
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,9 @@ HANDLE_TARGET_OPCODE(G_SHUFFLE_VECTOR)
/// Generic splatvector.
HANDLE_TARGET_OPCODE(G_SPLAT_VECTOR)

/// Generic masked compress.
HANDLE_TARGET_OPCODE(G_MCOMPRESS)

/// Generic count trailing zeroes.
HANDLE_TARGET_OPCODE(G_CTTZ)

Expand Down
7 changes: 7 additions & 0 deletions llvm/include/llvm/Target/GenericOpcodes.td
Original file line number Diff line number Diff line change
Expand Up @@ -1500,6 +1500,13 @@ def G_SPLAT_VECTOR: GenericInstruction {
let hasSideEffects = false;
}

// Generic masked compress.
def G_MCOMPRESS: GenericInstruction {
lawben marked this conversation as resolved.
Show resolved Hide resolved
let OutOperandList = (outs type0:$dst);
let InOperandList = (ins type1:$vec, type2:$mask);
let hasSideEffects = false;
}

//------------------------------------------------------------------------------
// Vector reductions
//------------------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ def : GINodeEquiv<G_VECREDUCE_UMAX, vecreduce_umax>;
def : GINodeEquiv<G_VECREDUCE_SMIN, vecreduce_smin>;
def : GINodeEquiv<G_VECREDUCE_SMAX, vecreduce_smax>;
def : GINodeEquiv<G_VECREDUCE_ADD, vecreduce_add>;
def : GINodeEquiv<G_MCOMPRESS, masked_compress>;

def : GINodeEquiv<G_STRICT_FADD, strict_fadd>;
def : GINodeEquiv<G_STRICT_FSUB, strict_fsub>;
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1986,6 +1986,8 @@ unsigned IRTranslator::getSimpleIntrinsicOpcode(Intrinsic::ID ID) {
return TargetOpcode::G_VECREDUCE_UMAX;
case Intrinsic::vector_reduce_umin:
return TargetOpcode::G_VECREDUCE_UMIN;
case Intrinsic::masked_compress:
return TargetOpcode::G_MCOMPRESS;
case Intrinsic::lround:
return TargetOpcode::G_LROUND;
case Intrinsic::llround:
Expand Down
49 changes: 49 additions & 0 deletions llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3946,6 +3946,8 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT LowerHintTy) {
return lowerExtractInsertVectorElt(MI);
case G_SHUFFLE_VECTOR:
return lowerShuffleVector(MI);
case G_MCOMPRESS:
return lowerMCOMPRESS(MI);
case G_DYN_STACKALLOC:
return lowerDynStackAlloc(MI);
case G_STACKSAVE:
Expand Down Expand Up @@ -7502,6 +7504,53 @@ LegalizerHelper::lowerShuffleVector(MachineInstr &MI) {
return Legalized;
}

LegalizerHelper::LegalizeResult
LegalizerHelper::lowerMCOMPRESS(llvm::MachineInstr &MI) {
auto [Dst, DstTy, Vec, VecTy, Mask, MaskTy] = MI.getFirst3RegLLTs();

if (VecTy.isScalableVector())
report_fatal_error(
"Lowering masked_compress for scalable vectors is undefined.");
lawben marked this conversation as resolved.
Show resolved Hide resolved

MachinePointerInfo PtrInfo;
Register StackPtr =
createStackTemporary(TypeSize::getFixed(VecTy.getSizeInBytes()),
getStackTemporaryAlignment(VecTy), PtrInfo)
.getReg(0);

LLT IdxTy = LLT::scalar(32);
LLT ValTy = VecTy.getElementType();
Align ValAlign = getStackTemporaryAlignment(ValTy);

Register OutPos = MIRBuilder.buildConstant(IdxTy, 0).getReg(0);
lawben marked this conversation as resolved.
Show resolved Hide resolved

unsigned NumElmts = VecTy.getNumElements();
for (unsigned I = 0; I < NumElmts; ++I) {
auto Idx = MIRBuilder.buildConstant(IdxTy, I);
auto Val = MIRBuilder.buildExtractVectorElement(ValTy, Vec, Idx);
Register ElmtPtr = getVectorElementPointer(StackPtr, VecTy, OutPos);
MIRBuilder.buildStore(Val, ElmtPtr, PtrInfo, ValAlign);

if (I < NumElmts - 1) {
LLT MaskITy = MaskTy.getElementType();
auto MaskI = MIRBuilder.buildExtractVectorElement(MaskITy, Mask, Idx);
if (MaskITy.getSizeInBits() > 1)
MaskI = MIRBuilder.buildTrunc(LLT::scalar(1), MaskI);

MaskI = MIRBuilder.buildZExt(IdxTy, MaskI);
OutPos = MIRBuilder.buildAdd(IdxTy, OutPos, MaskI).getReg(0);
}
}

Align VecAlign = getStackTemporaryAlignment(VecTy);
lawben marked this conversation as resolved.
Show resolved Hide resolved
MIRBuilder.buildLoad(Dst, StackPtr, PtrInfo, VecAlign);

MI.eraseFromParent();
// TODO: This is not true! We don't know if the input vector type is legal.
// Find out how to assert this!
lawben marked this conversation as resolved.
Show resolved Hide resolved
return Legalized;
}

Register LegalizerHelper::getDynStackAllocTargetPtr(Register SPReg,
Register AllocSize,
Align Alignment,
Expand Down
1 change: 0 additions & 1 deletion llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11246,7 +11246,6 @@ SDValue TargetLowering::expandMCOMPRESS(SDNode *Node, SelectionDAG &DAG) const {

const TargetLowering &TLI = DAG.getTargetLoweringInfo();
arsenm marked this conversation as resolved.
Show resolved Hide resolved
unsigned NumElms = VecVT.getVectorNumElements();
// Skip element zero, as we always copy this to the output vector.
for (unsigned I = 0; I < NumElms; I++) {
SDValue Idx = DAG.getVectorIdxConstant(I, DL);

Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1132,6 +1132,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
.scalarize(1)
.lower();

// TOOD: FIX ThiS!
lawben marked this conversation as resolved.
Show resolved Hide resolved
// DO NOT COMMIT
getActionDefinitionsBuilder(G_MCOMPRESS).lower();

getActionDefinitionsBuilder({G_FSHL, G_FSHR})
.customFor({{s32, s32}, {s32, s64}, {s64, s64}})
.lower();
Expand Down
Loading