Skip to content

Commit 1f60c54

Browse files
committed
[AIE2P] Fix legalization of unmerge of v8s8
The generic legalization creates extracts which are custom legalized using unmerges resulting in an infinite loop. This fixes this by implementing custom legalization for unmerge.
1 parent 0a73921 commit 1f60c54

File tree

5 files changed

+498
-14
lines changed

5 files changed

+498
-14
lines changed

llvm/lib/Target/AIE/AIELegalizerHelper.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,20 @@ bool AIELegalizerHelper::pack32BitVector(LegalizerHelper &Helper,
125125
return true;
126126
}
127127

128-
bool AIELegalizerHelper::unpack32BitVector(LegalizerHelper &Helper,
129-
MachineInstr &MI,
130-
Register SourceReg) const {
128+
// Unpack 32 bit or 64 bit vectors
129+
bool AIELegalizerHelper::unpackVector(LegalizerHelper &Helper, MachineInstr &MI,
130+
Register SourceReg) const {
131131
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
132132
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
133133

134134
const LLT SourceRegTy = MRI.getType(SourceReg);
135-
assert(SourceRegTy.getSizeInBits() == 32 &&
136-
"cannot unpack vectors larger or smaller than 32-bit");
135+
unsigned SourceRegSize = SourceRegTy.getSizeInBits();
136+
assert((SourceRegSize == 32 || SourceRegSize == 64) &&
137+
"cannot unpack vectors other than 32-bit or 64-bit");
137138

138-
const LLT S32 = LLT::scalar(32);
139+
const LLT Type = LLT::scalar(SourceRegSize);
139140
unsigned Offset = 0;
140-
Register DstCastReg = MRI.createGenericVirtualRegister(S32);
141+
Register DstCastReg = MRI.createGenericVirtualRegister(Type);
141142

142143
MachineOperand *Operand = MI.operands_begin(),
143144
*OperandEnd = MI.operands_end() - 1;
@@ -149,9 +150,9 @@ bool AIELegalizerHelper::unpack32BitVector(LegalizerHelper &Helper,
149150
// optimized out in O0.
150151
if (Offset != 0) {
151152
const MachineInstrBuilder ShiftConstant =
152-
MIRBuilder.buildConstant(S32, Offset);
153+
MIRBuilder.buildConstant(Type, Offset);
153154
const MachineInstrBuilder Masked =
154-
MIRBuilder.buildLShr(S32, DstCastReg, ShiftConstant);
155+
MIRBuilder.buildLShr(Type, DstCastReg, ShiftConstant);
155156
MIRBuilder.buildTrunc(DestinationOperand, Masked);
156157

157158
} else {
@@ -345,8 +346,9 @@ bool AIELegalizerHelper::legalizeG_UNMERGE_VALUES(LegalizerHelper &Helper,
345346
LastTy.getSizeInBits() &&
346347
"This operation is only supported for vectors");
347348

348-
if (LastTy.getSizeInBits() == 32)
349-
return unpack32BitVector(Helper, MI, LastReg);
349+
unsigned LastTySize = LastTy.getSizeInBits();
350+
if (LastTySize == 32 || LastTySize == 64)
351+
return unpackVector(Helper, MI, LastReg);
350352

351353
// Pad vectors of 128-bit vectors to 256-bit
352354
Register TargetReg = LastReg;

llvm/lib/Target/AIE/AIELegalizerHelper.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ class AIELegalizerHelper {
8383
// Helper functions for legalization
8484
bool pack32BitVector(LegalizerHelper &Helper, MachineInstr &MI,
8585
Register SourceReg) const;
86-
bool unpack32BitVector(LegalizerHelper &Helper, MachineInstr &MI,
87-
Register SourceReg) const;
86+
bool unpackVector(LegalizerHelper &Helper, MachineInstr &MI,
87+
Register SourceReg) const;
8888
bool legalizeG_UNMERGE_VALUES_128bit(LegalizerHelper &Helper,
8989
MachineInstr &MI) const;
9090
bool legalizeG_AIE_EXTRACT_VECTOR_ELT(LegalizerHelper &Helper,

0 commit comments

Comments
 (0)