@@ -49,105 +49,108 @@ class GCNCreateVOPD {
49
49
MachineInstr *SecondMI;
50
50
};
51
51
52
- public:
53
- const GCNSubtarget *ST = nullptr ;
54
-
55
- bool doReplace (const SIInstrInfo *SII, VOPDCombineInfo &CI) {
56
- auto *FirstMI = CI.FirstMI ;
57
- auto *SecondMI = CI.SecondMI ;
58
- unsigned Opc1 = FirstMI->getOpcode ();
59
- unsigned Opc2 = SecondMI->getOpcode ();
60
- unsigned EncodingFamily =
61
- AMDGPU::getVOPDEncodingFamily (SII->getSubtarget ());
62
- int NewOpcode =
63
- AMDGPU::getVOPDFull (AMDGPU::getVOPDOpcode (Opc1),
64
- AMDGPU::getVOPDOpcode (Opc2), EncodingFamily);
65
- assert (NewOpcode != -1 &&
66
- " Should have previously determined this as a possible VOPD\n " );
67
-
68
- auto VOPDInst = BuildMI (*FirstMI->getParent (), FirstMI,
69
- FirstMI->getDebugLoc (), SII->get (NewOpcode))
70
- .setMIFlags (FirstMI->getFlags () | SecondMI->getFlags ());
71
-
72
- namespace VOPD = AMDGPU::VOPD;
73
- MachineInstr *MI[] = {FirstMI, SecondMI};
74
- auto InstInfo =
75
- AMDGPU::getVOPDInstInfo (FirstMI->getDesc (), SecondMI->getDesc ());
76
-
77
- for (auto CompIdx : VOPD::COMPONENTS) {
78
- auto MCOprIdx = InstInfo[CompIdx].getIndexOfDstInMCOperands ();
79
- VOPDInst.add (MI[CompIdx]->getOperand (MCOprIdx));
80
- }
81
-
82
- for (auto CompIdx : VOPD::COMPONENTS) {
83
- auto CompSrcOprNum = InstInfo[CompIdx].getCompSrcOperandsNum ();
84
- for (unsigned CompSrcIdx = 0 ; CompSrcIdx < CompSrcOprNum; ++CompSrcIdx) {
85
- auto MCOprIdx = InstInfo[CompIdx].getIndexOfSrcInMCOperands (CompSrcIdx);
52
+ public:
53
+ const GCNSubtarget *ST = nullptr ;
54
+
55
+ bool doReplace (const SIInstrInfo *SII, VOPDCombineInfo &CI) {
56
+ auto *FirstMI = CI.FirstMI ;
57
+ auto *SecondMI = CI.SecondMI ;
58
+ unsigned Opc1 = FirstMI->getOpcode ();
59
+ unsigned Opc2 = SecondMI->getOpcode ();
60
+ unsigned EncodingFamily =
61
+ AMDGPU::getVOPDEncodingFamily (SII->getSubtarget ());
62
+ int NewOpcode =
63
+ AMDGPU::getVOPDFull (AMDGPU::getVOPDOpcode (Opc1),
64
+ AMDGPU::getVOPDOpcode (Opc2), EncodingFamily);
65
+ assert (NewOpcode != -1 &&
66
+ " Should have previously determined this as a possible VOPD\n " );
67
+
68
+ auto VOPDInst =
69
+ BuildMI (*FirstMI->getParent (), FirstMI, FirstMI->getDebugLoc (),
70
+ SII->get (NewOpcode))
71
+ .setMIFlags (FirstMI->getFlags () | SecondMI->getFlags ());
72
+
73
+ namespace VOPD = AMDGPU::VOPD;
74
+ MachineInstr *MI[] = {FirstMI, SecondMI};
75
+ auto InstInfo =
76
+ AMDGPU::getVOPDInstInfo (FirstMI->getDesc (), SecondMI->getDesc ());
77
+
78
+ for (auto CompIdx : VOPD::COMPONENTS) {
79
+ auto MCOprIdx = InstInfo[CompIdx].getIndexOfDstInMCOperands ();
86
80
VOPDInst.add (MI[CompIdx]->getOperand (MCOprIdx));
87
81
}
88
- }
89
82
90
- SII->fixImplicitOperands (*VOPDInst);
91
- for (auto CompIdx : VOPD::COMPONENTS)
92
- VOPDInst.copyImplicitOps (*MI[CompIdx]);
83
+ for (auto CompIdx : VOPD::COMPONENTS) {
84
+ auto CompSrcOprNum = InstInfo[CompIdx].getCompSrcOperandsNum ();
85
+ for (unsigned CompSrcIdx = 0 ; CompSrcIdx < CompSrcOprNum;
86
+ ++CompSrcIdx) {
87
+ auto MCOprIdx =
88
+ InstInfo[CompIdx].getIndexOfSrcInMCOperands (CompSrcIdx);
89
+ VOPDInst.add (MI[CompIdx]->getOperand (MCOprIdx));
90
+ }
91
+ }
93
92
94
- LLVM_DEBUG (dbgs () << " VOPD Fused: " << *VOPDInst << " from\t X: "
95
- << *CI.FirstMI << " \t Y: " << *CI.SecondMI << " \n " );
93
+ SII->fixImplicitOperands (*VOPDInst);
94
+ for (auto CompIdx : VOPD::COMPONENTS)
95
+ VOPDInst.copyImplicitOps (*MI[CompIdx]);
96
96
97
- for ( auto CompIdx : VOPD::COMPONENTS)
98
- MI[CompIdx]-> eraseFromParent ( );
97
+ LLVM_DEBUG ( dbgs () << " VOPD Fused: " << *VOPDInst << " from \t X: "
98
+ << *CI. FirstMI << " \t Y: " << *CI. SecondMI << " \n " );
99
99
100
- ++NumVOPDCreated;
101
- return true ;
102
- }
100
+ for (auto CompIdx : VOPD::COMPONENTS)
101
+ MI[CompIdx]->eraseFromParent ();
103
102
104
- bool run (MachineFunction &MF) {
105
- ST = &MF.getSubtarget <GCNSubtarget>();
106
- if (!AMDGPU::hasVOPD (*ST) || !ST->isWave32 ())
107
- return false ;
108
- LLVM_DEBUG (dbgs () << " CreateVOPD Pass:\n " );
109
-
110
- const SIInstrInfo *SII = ST->getInstrInfo ();
111
- bool Changed = false ;
112
-
113
- SmallVector<VOPDCombineInfo> ReplaceCandidates;
114
-
115
- for (auto &MBB : MF) {
116
- auto MII = MBB.begin (), E = MBB.end ();
117
- while (MII != E) {
118
- auto *FirstMI = &*MII;
119
- MII = next_nodbg (MII, MBB.end ());
120
- if (MII == MBB.end ())
121
- break ;
122
- if (FirstMI->isDebugInstr ())
123
- continue ;
124
- auto *SecondMI = &*MII;
125
- unsigned Opc = FirstMI->getOpcode ();
126
- unsigned Opc2 = SecondMI->getOpcode ();
127
- llvm::AMDGPU::CanBeVOPD FirstCanBeVOPD = AMDGPU::getCanBeVOPD (Opc);
128
- llvm::AMDGPU::CanBeVOPD SecondCanBeVOPD = AMDGPU::getCanBeVOPD (Opc2);
129
- VOPDCombineInfo CI;
130
-
131
- if (FirstCanBeVOPD.X && SecondCanBeVOPD.Y )
132
- CI = VOPDCombineInfo (FirstMI, SecondMI);
133
- else if (FirstCanBeVOPD.Y && SecondCanBeVOPD.X )
134
- CI = VOPDCombineInfo (SecondMI, FirstMI);
135
- else
136
- continue ;
137
- // checkVOPDRegConstraints cares about program order, but doReplace
138
- // cares about X-Y order in the constituted VOPD
139
- if (llvm::checkVOPDRegConstraints (*SII, *FirstMI, *SecondMI)) {
140
- ReplaceCandidates.push_back (CI);
141
- ++MII;
103
+ ++NumVOPDCreated;
104
+ return true ;
105
+ }
106
+
107
+ bool run (MachineFunction &MF) {
108
+ ST = &MF.getSubtarget <GCNSubtarget>();
109
+ if (!AMDGPU::hasVOPD (*ST) || !ST->isWave32 ())
110
+ return false ;
111
+ LLVM_DEBUG (dbgs () << " CreateVOPD Pass:\n " );
112
+
113
+ const SIInstrInfo *SII = ST->getInstrInfo ();
114
+ bool Changed = false ;
115
+
116
+ SmallVector<VOPDCombineInfo> ReplaceCandidates;
117
+
118
+ for (auto &MBB : MF) {
119
+ auto MII = MBB.begin (), E = MBB.end ();
120
+ while (MII != E) {
121
+ auto *FirstMI = &*MII;
122
+ MII = next_nodbg (MII, MBB.end ());
123
+ if (MII == MBB.end ())
124
+ break ;
125
+ if (FirstMI->isDebugInstr ())
126
+ continue ;
127
+ auto *SecondMI = &*MII;
128
+ unsigned Opc = FirstMI->getOpcode ();
129
+ unsigned Opc2 = SecondMI->getOpcode ();
130
+ llvm::AMDGPU::CanBeVOPD FirstCanBeVOPD = AMDGPU::getCanBeVOPD (Opc);
131
+ llvm::AMDGPU::CanBeVOPD SecondCanBeVOPD = AMDGPU::getCanBeVOPD (Opc2);
132
+ VOPDCombineInfo CI;
133
+
134
+ if (FirstCanBeVOPD.X && SecondCanBeVOPD.Y )
135
+ CI = VOPDCombineInfo (FirstMI, SecondMI);
136
+ else if (FirstCanBeVOPD.Y && SecondCanBeVOPD.X )
137
+ CI = VOPDCombineInfo (SecondMI, FirstMI);
138
+ else
139
+ continue ;
140
+ // checkVOPDRegConstraints cares about program order, but doReplace
141
+ // cares about X-Y order in the constituted VOPD
142
+ if (llvm::checkVOPDRegConstraints (*SII, *FirstMI, *SecondMI)) {
143
+ ReplaceCandidates.push_back (CI);
144
+ ++MII;
145
+ }
142
146
}
143
147
}
144
- }
145
- for (auto &CI : ReplaceCandidates) {
146
- Changed |= doReplace (SII, CI);
147
- }
148
+ for (auto &CI : ReplaceCandidates) {
149
+ Changed |= doReplace (SII, CI);
150
+ }
148
151
149
- return Changed;
150
- }
152
+ return Changed;
153
+ }
151
154
};
152
155
153
156
class GCNCreateVOPDLegacy : public MachineFunctionPass {
@@ -173,8 +176,9 @@ class GCNCreateVOPDLegacy : public MachineFunctionPass {
173
176
174
177
} // namespace
175
178
176
- PreservedAnalyses llvm::GCNCreateVOPDPass::run (MachineFunction &MF,
177
- MachineFunctionAnalysisManager &AM) {
179
+ PreservedAnalyses
180
+ llvm::GCNCreateVOPDPass::run (MachineFunction &MF,
181
+ MachineFunctionAnalysisManager &AM) {
178
182
if (!GCNCreateVOPD ().run (MF))
179
183
return PreservedAnalyses::all ();
180
184
return getMachineFunctionPassPreservedAnalyses ().preserveSet <CFGAnalyses>();
0 commit comments