13
13
#include " MCTargetDesc/AMDGPUMCTargetDesc.h"
14
14
#include " SIMachineFunctionInfo.h"
15
15
#include " llvm/ADT/DepthFirstIterator.h"
16
+ #include " llvm/ADT/DenseSet.h"
16
17
#include " llvm/CodeGen/MachineFunctionPass.h"
17
18
#include " llvm/CodeGen/MachineOperand.h"
18
19
@@ -74,6 +75,7 @@ class SIFoldOperands : public MachineFunctionPass {
74
75
const SIRegisterInfo *TRI;
75
76
const GCNSubtarget *ST;
76
77
const SIMachineFunctionInfo *MFI;
78
+ mutable DenseSet<MachineInstr *> SeenMI;
77
79
78
80
bool frameIndexMayFold (const MachineInstr &UseMI, int OpNo,
79
81
const MachineOperand &OpToFold) const ;
@@ -772,7 +774,6 @@ void SIFoldOperands::foldOperand(
772
774
if (UseMI->isRegSequence ()) {
773
775
Register RegSeqDstReg = UseMI->getOperand (0 ).getReg ();
774
776
unsigned RegSeqDstSubReg = UseMI->getOperand (UseOpIdx + 1 ).getImm ();
775
-
776
777
for (auto &RSUse : make_early_inc_range (MRI->use_nodbg_operands (RegSeqDstReg))) {
777
778
MachineInstr *RSUseMI = RSUse.getParent ();
778
779
@@ -783,6 +784,10 @@ void SIFoldOperands::foldOperand(
783
784
if (RSUse.getSubReg () != RegSeqDstSubReg)
784
785
continue ;
785
786
787
+ if (SeenMI.contains (RSUseMI))
788
+ continue ;
789
+ SeenMI.insert (RSUseMI);
790
+
786
791
foldOperand (OpToFold, RSUseMI, RSUseMI->getOperandNo (&RSUse), FoldList,
787
792
CopiesToReplace);
788
793
}
0 commit comments