Skip to content

Commit ddb9b1a

Browse files
Update VLD.CONV inst-select to lookthrough bitcast
1 parent 921c2f6 commit ddb9b1a

File tree

5 files changed

+64
-9
lines changed

5 files changed

+64
-9
lines changed

llvm/lib/Target/AIE/AIEBaseInstructionSelector.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,8 @@ bool AIEBaseInstructionSelector::canCombineCONVLoad(MachineInstr &MemOp,
677677
bool AIEBaseInstructionSelector::selectG_AIE_LOAD_CONV(
678678
MachineInstr &CONVI, MachineRegisterInfo &MRI) {
679679
Register LoadResult = (std::next(CONVI.uses().begin()))->getReg();
680-
MachineInstr *LoadOp = getDefIgnoringCopiesAndBitcasts(LoadResult, MRI);
680+
MachineInstr *LoadOp =
681+
getDefIgnoringCopiesAndBitcasts(LoadResult, false, MRI);
681682
assert(LoadOp && "Expected SSA.");
682683

683684
// Do not try to combine if one of the load's defs is used by another

llvm/lib/Target/AIE/AIECombinerHelper.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ bool isNonCoalesceableUseOf(const MachineInstr &MemI,
170170
MRI.hasOneNonDBGUse(InBetweenMI.getOperand(0).getReg())) {
171171
const MachineInstr *CopyOrignMI =
172172
MRI.getVRegDef(InBetweenMI.getOperand(1).getReg());
173-
const MachineInstr *CopyDestMI =
174-
&*MRI.use_instr_nodbg_begin(InBetweenMI.getOperand(0).getReg());
173+
const MachineInstr *CopyDestMI = getUserIgnoringCopiesAndBitcasts(
174+
InBetweenMI.getOperand(0).getReg(), MRI);
175175
if (CopyOrignMI == &MemI && CopyDestMI == &Dest)
176176
return false;
177177
}
@@ -248,6 +248,29 @@ llvm::getDefIgnoringCopiesAndBitcasts(Register Reg, bool AllowMultiUse,
248248
return DefInstr;
249249
}
250250

251+
/// Find the use instruction for \p Reg, folding away any trivial copies and
252+
/// bitcasts. May return nullptr if \p Reg is not a generic virtual register.
253+
MachineInstr *
254+
llvm::getUserIgnoringCopiesAndBitcasts(Register Reg,
255+
const MachineRegisterInfo &MRI) {
256+
MachineInstr *User = &*MRI.use_instr_nodbg_begin(Reg);
257+
258+
auto IsSingleUseCopyOrBitcast = [&](const MachineInstr *MI) {
259+
return (MI->isCopy() || (MI->getOpcode() == TargetOpcode::G_BITCAST)) &&
260+
MRI.hasOneNonDBGUse(MI->getOperand(0).getReg());
261+
};
262+
263+
auto UseVirtReg = [&](const MachineInstr *MI) {
264+
return MI->getOperand(1).getReg().isVirtual();
265+
};
266+
267+
// Stop if we reach an use of a physical register.
268+
while (User && IsSingleUseCopyOrBitcast(User) && UseVirtReg(User))
269+
User = &*MRI.use_instr_nodbg_begin(User->getOperand(0).getReg());
270+
271+
return User;
272+
}
273+
251274
MachineInstr *findLastRegUseInBB(Register Reg, MachineInstr &IgnoreUser,
252275
MachineRegisterInfo &MRI,
253276
CombinerHelper &Helper,

llvm/lib/Target/AIE/AIECombinerHelper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ bool canAdvanceOp(MachineInstr &MemI, MachineInstr &Dest,
115115
/// Reg, has multiple uses.
116116
MachineInstr *getDefIgnoringCopiesAndBitcasts(Register Reg, bool AllowMultiUse,
117117
const MachineRegisterInfo &MRI);
118+
/// Find the use instruction for \p Reg, folding away any trivial copies and
119+
/// bitcasts. May return nullptr if \p Reg is not a generic virtual register.
120+
MachineInstr *getUserIgnoringCopiesAndBitcasts(Register Reg,
121+
const MachineRegisterInfo &MRI);
118122

119123
class InstrNode {
120124
MachineInstr *BaseNode;

llvm/lib/Target/AIE/aie2p/AIE2PInstructionSelector.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,7 +1304,8 @@ bool AIE2PInstructionSelector::selectG_AIE_LOAD_UPS(MachineInstr &UPSI,
13041304

13051305
// First use is the G_INTRINSIC_W_SIDE_EFFECTS ID
13061306
Register LoadResult = (std::next(UPSI.uses().begin()))->getReg();
1307-
MachineInstr *LoadOp = getDefIgnoringCopiesAndBitcasts(LoadResult, MRI);
1307+
MachineInstr *LoadOp =
1308+
getDefIgnoringCopiesAndBitcasts(LoadResult, false, MRI);
13081309

13091310
assert(LoadOp && "Expected SSA.");
13101311

@@ -3371,7 +3372,8 @@ bool AIE2PInstructionSelector::selectG_AIE_STORE_PACK(
33713372
MachineInstr &StoreI, MachineRegisterInfo &MRI) {
33723373

33733374
Register PackResult = (StoreI.uses().begin())->getReg();
3374-
MachineInstr *PackOp = getDefIgnoringCopiesAndBitcasts(PackResult, MRI);
3375+
MachineInstr *PackOp =
3376+
getDefIgnoringCopiesAndBitcasts(PackResult, false, MRI);
33753377

33763378
if (!canCombinePACK(StoreI, *PackOp, MRI))
33773379
return false;
@@ -3451,7 +3453,7 @@ bool AIE2PInstructionSelector::selectG_AIE_STORE_SRS(MachineInstr &StoreI,
34513453
MachineRegisterInfo &MRI) {
34523454

34533455
Register SrsResult = (StoreI.uses().begin())->getReg();
3454-
MachineInstr *SrsOp = getDefIgnoringCopiesAndBitcasts(SrsResult, MRI);
3456+
MachineInstr *SrsOp = getDefIgnoringCopiesAndBitcasts(SrsResult, false, MRI);
34553457

34563458
assert(SrsOp && "Expected SSA.");
34573459

@@ -3735,7 +3737,8 @@ bool AIE2PInstructionSelector::selectG_AIE_STORE_CONV(
37353737
// differ.
37363738

37373739
Register ConvResult = (StoreI.uses().begin())->getReg();
3738-
MachineInstr *ConvOp = getDefIgnoringCopiesAndBitcasts(ConvResult, MRI);
3740+
MachineInstr *ConvOp =
3741+
getDefIgnoringCopiesAndBitcasts(ConvResult, false, MRI);
37393742

37403743
assert(ConvOp && "Expected SSA.");
37413744

@@ -3981,7 +3984,8 @@ bool AIE2PInstructionSelector::canCombineUNPACKLoad(MachineInstr &MemOp,
39813984
bool AIE2PInstructionSelector::selectG_AIE_LOAD_UNPACK(
39823985
MachineInstr &UNPACKI, MachineRegisterInfo &MRI) {
39833986
Register LoadResult = (std::next(UNPACKI.uses().begin()))->getReg();
3984-
MachineInstr *LoadOp = getDefIgnoringCopiesAndBitcasts(LoadResult, MRI);
3987+
MachineInstr *LoadOp =
3988+
getDefIgnoringCopiesAndBitcasts(LoadResult, false, MRI);
39853989
// Should we build the instruction at load's position?
39863990
bool ShouldAdvanceOp = false;
39873991

@@ -4936,7 +4940,8 @@ unsigned int getStoreFifoOpcode(MachineInstr &I) {
49364940
bool AIE2PInstructionSelector::selectVST_FIFO_CONV(MachineInstr &StoreI,
49374941
MachineRegisterInfo &MRI) {
49384942
Register ConvResult = StoreI.getOperand(5).getReg();
4939-
MachineInstr *ConvOp = getDefIgnoringCopiesAndBitcasts(ConvResult, MRI);
4943+
MachineInstr *ConvOp =
4944+
getDefIgnoringCopiesAndBitcasts(ConvResult, false, MRI);
49404945
assert(ConvOp && "Expected SSA.");
49414946

49424947
if (!canCombineCONV(StoreI, *ConvOp) ||

llvm/test/CodeGen/AIE/aie2/GlobalISel/inst-select-vlda_conv.mir

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,3 +380,25 @@ body: |
380380
%3:accregbank(<8 x s64>) = G_INTRINSIC intrinsic(@llvm.aie2.v16bf16.to.v16accfloat), %2:vregbank(<16 x s16>)
381381
PseudoRET implicit $lr, implicit %3, implicit %2
382382
...
383+
384+
---
385+
name: VLDA_CONV_COPY_bitcast
386+
legalized: true
387+
regBankSelected: true
388+
tracksRegLiveness: true
389+
body: |
390+
bb.0:
391+
liveins: $p0, $r0
392+
; CHECK-LABEL: name: VLDA_CONV_COPY_bitcast
393+
; CHECK: liveins: $p0, $r0
394+
; CHECK-NEXT: {{ $}}
395+
; CHECK-NEXT: [[COPY:%[0-9]+]]:ep = COPY $p0
396+
; CHECK-NEXT: [[VLDA_CONV_FP32_BF16_ag_idx_imm:%[0-9]+]]:acc512 = VLDA_CONV_FP32_BF16_ag_idx_imm [[COPY]], 0 :: (load (<8 x s32>))
397+
; CHECK-NEXT: PseudoRET implicit $lr, implicit [[VLDA_CONV_FP32_BF16_ag_idx_imm]]
398+
%0:ptrregbank(p0) = COPY $p0
399+
%1:vregbank(<8 x s32>) = G_LOAD %0:ptrregbank(p0) :: (load (<8 x s32>))
400+
%2:vregbank(<8 x s32>) = COPY %1
401+
%3:vregbank(<16 x s16>) = G_BITCAST %2(<8 x s32>)
402+
%4:accregbank(<8 x s64>) = G_INTRINSIC intrinsic(@llvm.aie2.v16bf16.to.v16accfloat), %3:vregbank(<16 x s16>)
403+
PseudoRET implicit $lr, implicit %4
404+
...

0 commit comments

Comments
 (0)