@@ -454,14 +454,18 @@ DemandedFields getDemanded(const MachineInstr &MI,
454
454
// / Defines the abstract state with which the forward dataflow models the
455
455
// / values of the VL and VTYPE registers after insertion.
456
456
class VSETVLIInfo {
457
+ struct AVLDef {
458
+ const MachineInstr *DefMI;
459
+ Register DefReg;
460
+ };
457
461
union {
458
- const MachineInstr *AVLDefMI ;
462
+ AVLDef AVLRegDef ;
459
463
unsigned AVLImm;
460
464
};
461
465
462
466
enum : uint8_t {
463
467
Uninitialized,
464
- AVLIsDefMI ,
468
+ AVLIsReg ,
465
469
AVLIsImm,
466
470
AVLIsVLMAX,
467
471
AVLIsIgnored,
@@ -490,10 +494,11 @@ class VSETVLIInfo {
490
494
void setUnknown () { State = Unknown; }
491
495
bool isUnknown () const { return State == Unknown; }
492
496
493
- void setAVLDefMI (const MachineInstr *DefMI) {
494
- assert (DefMI);
495
- AVLDefMI = DefMI;
496
- State = AVLIsDefMI;
497
+ void setAVLRegDef (const MachineInstr *DefMI, Register AVLReg) {
498
+ assert (DefMI && AVLReg.isVirtual ());
499
+ AVLRegDef.DefMI = DefMI;
500
+ AVLRegDef.DefReg = AVLReg;
501
+ State = AVLIsReg;
497
502
}
498
503
499
504
void setAVLImm (unsigned Imm) {
@@ -506,29 +511,28 @@ class VSETVLIInfo {
506
511
void setAVLIgnored () { State = AVLIsIgnored; }
507
512
508
513
bool hasAVLImm () const { return State == AVLIsImm; }
509
- bool hasAVLDefMI () const { return State == AVLIsDefMI ; }
514
+ bool hasAVLReg () const { return State == AVLIsReg ; }
510
515
bool hasAVLVLMAX () const { return State == AVLIsVLMAX; }
511
516
bool hasAVLIgnored () const { return State == AVLIsIgnored; }
512
517
Register getAVLReg () const {
513
- assert (hasAVLDefMI ());
514
- return AVLDefMI-> getOperand ( 0 ). getReg () ;
518
+ assert (hasAVLReg () && AVLRegDef. DefReg . isVirtual ());
519
+ return AVLRegDef. DefReg ;
515
520
}
516
521
unsigned getAVLImm () const {
517
522
assert (hasAVLImm ());
518
523
return AVLImm;
519
524
}
520
-
521
525
const MachineInstr *getAVLDefMI () const {
522
- assert (AVLDefMI );
523
- return AVLDefMI ;
526
+ assert (hasAVLReg () && AVLRegDef. DefMI );
527
+ return AVLRegDef. DefMI ;
524
528
}
525
529
526
530
void setAVL (VSETVLIInfo Info) {
527
531
assert (Info.isValid ());
528
532
if (Info.isUnknown ())
529
533
setUnknown ();
530
- else if (Info.hasAVLDefMI ())
531
- setAVLDefMI (Info.getAVLDefMI ());
534
+ else if (Info.hasAVLReg ())
535
+ setAVLRegDef (Info.getAVLDefMI (), Info. getAVLReg ());
532
536
else if (Info.hasAVLVLMAX ())
533
537
setAVLVLMAX ();
534
538
else if (Info.hasAVLIgnored ())
@@ -547,9 +551,8 @@ class VSETVLIInfo {
547
551
bool hasNonZeroAVL () const {
548
552
if (hasAVLImm ())
549
553
return getAVLImm () > 0 ;
550
- if (hasAVLDefMI ()) {
554
+ if (hasAVLReg ()) {
551
555
const MachineInstr *MI = getAVLDefMI ();
552
- assert (MI);
553
556
return isNonZeroLoadImmediate (*MI);
554
557
}
555
558
if (hasAVLVLMAX ())
@@ -566,7 +569,7 @@ class VSETVLIInfo {
566
569
}
567
570
568
571
bool hasSameAVL (const VSETVLIInfo &Other) const {
569
- if (hasAVLDefMI () && Other.hasAVLDefMI ())
572
+ if (hasAVLReg () && Other.hasAVLReg ())
570
573
return getAVLDefMI ()->isIdenticalTo (*Other.getAVLDefMI ());
571
574
572
575
if (hasAVLImm () && Other.hasAVLImm ())
@@ -747,7 +750,7 @@ class VSETVLIInfo {
747
750
OS << " Uninitialized" ;
748
751
if (isUnknown ())
749
752
OS << " unknown" ;
750
- if (hasAVLDefMI ())
753
+ if (hasAVLReg ())
751
754
OS << " AVLReg=" << (unsigned )getAVLReg ();
752
755
if (hasAVLImm ())
753
756
OS << " AVLImm=" << (unsigned )AVLImm;
@@ -888,7 +891,7 @@ static VSETVLIInfo getInfoForVSETVLI(const MachineInstr &MI,
888
891
if (AVLReg == RISCV::X0)
889
892
NewInfo.setAVLVLMAX ();
890
893
else
891
- NewInfo.setAVLDefMI (MRI.getVRegDef (AVLReg));
894
+ NewInfo.setAVLRegDef (MRI.getVRegDef (AVLReg), AVLReg );
892
895
}
893
896
NewInfo.setVTYPE (MI.getOperand (2 ).getImm ());
894
897
@@ -960,7 +963,7 @@ static VSETVLIInfo computeInfoForInstr(const MachineInstr &MI, uint64_t TSFlags,
960
963
else
961
964
InstrInfo.setAVLImm (Imm);
962
965
} else {
963
- InstrInfo.setAVLDefMI (MRI->getVRegDef (VLOp.getReg ()));
966
+ InstrInfo.setAVLRegDef (MRI->getVRegDef (VLOp.getReg ()), VLOp. getReg ( ));
964
967
}
965
968
} else {
966
969
assert (isScalarExtractInstr (MI));
@@ -980,7 +983,7 @@ static VSETVLIInfo computeInfoForInstr(const MachineInstr &MI, uint64_t TSFlags,
980
983
// AVL operand with the AVL of the defining vsetvli. We avoid general
981
984
// register AVLs to avoid extending live ranges without being sure we can
982
985
// kill the original source reg entirely.
983
- if (InstrInfo.hasAVLDefMI ()) {
986
+ if (InstrInfo.hasAVLReg ()) {
984
987
const MachineInstr *DefMI = InstrInfo.getAVLDefMI ();
985
988
if (isVectorConfigInstr (*DefMI)) {
986
989
VSETVLIInfo DefInstrInfo = getInfoForVSETVLI (*DefMI, *MRI);
@@ -1020,9 +1023,8 @@ void RISCVInsertVSETVLI::insertVSETVLI(MachineBasicBlock &MBB,
1020
1023
// If our AVL is a virtual register, it might be defined by a VSET(I)VLI. If
1021
1024
// it has the same VLMAX we want and the last VL/VTYPE we observed is the
1022
1025
// same, we can use the X0, X0 form.
1023
- if (Info.hasSameVLMAX (PrevInfo) && Info.hasAVLDefMI ()) {
1026
+ if (Info.hasSameVLMAX (PrevInfo) && Info.hasAVLReg ()) {
1024
1027
const MachineInstr *DefMI = Info.getAVLDefMI ();
1025
- assert (DefMI);
1026
1028
if (isVectorConfigInstr (*DefMI)) {
1027
1029
VSETVLIInfo DefInfo = getInfoForVSETVLI (*DefMI, *MRI);
1028
1030
if (DefInfo.hasSameAVL (PrevInfo) && DefInfo.hasSameVLMAX (PrevInfo)) {
@@ -1139,9 +1141,8 @@ bool RISCVInsertVSETVLI::needVSETVLI(const MachineInstr &MI,
1139
1141
// it might be defined by a VSET(I)VLI. If it has the same VLMAX we need
1140
1142
// and the last VL/VTYPE we observed is the same, we don't need a
1141
1143
// VSETVLI here.
1142
- if (Require.hasAVLDefMI () && CurInfo.hasCompatibleVTYPE (Used, Require)) {
1144
+ if (Require.hasAVLReg () && CurInfo.hasCompatibleVTYPE (Used, Require)) {
1143
1145
const MachineInstr *DefMI = Require.getAVLDefMI ();
1144
- assert (DefMI);
1145
1146
if (DefMI && isVectorConfigInstr (*DefMI)) {
1146
1147
VSETVLIInfo DefInfo = getInfoForVSETVLI (*DefMI, *MRI);
1147
1148
if (DefInfo.hasSameAVL (CurInfo) && DefInfo.hasSameVLMAX (CurInfo))
@@ -1235,7 +1236,8 @@ void RISCVInsertVSETVLI::transferAfter(VSETVLIInfo &Info,
1235
1236
1236
1237
if (RISCV::isFaultFirstLoad (MI)) {
1237
1238
// Update AVL to vl-output of the fault first load.
1238
- Info.setAVLDefMI (MRI->getVRegDef (MI.getOperand (1 ).getReg ()));
1239
+ Info.setAVLRegDef (MRI->getVRegDef (MI.getOperand (1 ).getReg ()),
1240
+ MI.getOperand (1 ).getReg ());
1239
1241
return ;
1240
1242
}
1241
1243
@@ -1326,7 +1328,7 @@ bool RISCVInsertVSETVLI::needVSETVLIPHI(const VSETVLIInfo &Require,
1326
1328
if (DisableInsertVSETVLPHIOpt)
1327
1329
return true ;
1328
1330
1329
- if (!Require.hasAVLDefMI ())
1331
+ if (!Require.hasAVLReg ())
1330
1332
return true ;
1331
1333
1332
1334
// We need the AVL to be produce by a PHI node in this basic block.
@@ -1500,9 +1502,8 @@ void RISCVInsertVSETVLI::doPRE(MachineBasicBlock &MBB) {
1500
1502
// If the AVL value is a register (other than our VLMAX sentinel),
1501
1503
// we need to prove the value is available at the point we're going
1502
1504
// to insert the vsetvli at.
1503
- if (AvailableInfo.hasAVLDefMI ()) {
1505
+ if (AvailableInfo.hasAVLReg ()) {
1504
1506
const MachineInstr *AVLDefMI = AvailableInfo.getAVLDefMI ();
1505
- assert (AVLDefMI);
1506
1507
// This is an inline dominance check which covers the case of
1507
1508
// UnavailablePred being the preheader of a loop.
1508
1509
if (AVLDefMI->getParent () != UnavailablePred)
0 commit comments