@@ -45,7 +45,7 @@ struct SMEPeepholeOpt : public MachineFunctionPass {
45
45
}
46
46
47
47
bool optimizeStartStopPairs (MachineBasicBlock &MBB,
48
- bool &HasRemainingSMChange ) const ;
48
+ bool &HasRemovedAllSMChanges ) const ;
49
49
};
50
50
51
51
char SMEPeepholeOpt::ID = 0 ;
@@ -128,21 +128,18 @@ static bool isSVERegOp(const TargetRegisterInfo &TRI,
128
128
TRI.getCommonSubClass (&AArch64::PPRRegClass, RC);
129
129
}
130
130
131
- bool SMEPeepholeOpt::optimizeStartStopPairs (MachineBasicBlock &MBB,
132
- bool &HasRemainingSMChange ) const {
131
+ bool SMEPeepholeOpt::optimizeStartStopPairs (
132
+ MachineBasicBlock &MBB, bool &HasRemovedAllSMChanges ) const {
133
133
const MachineRegisterInfo &MRI = MBB.getParent ()->getRegInfo ();
134
134
const TargetRegisterInfo &TRI =
135
135
*MBB.getParent ()->getSubtarget ().getRegisterInfo ();
136
136
137
- SmallVector<MachineInstr *, 4 > ToBeRemoved;
138
-
139
137
bool Changed = false ;
140
138
MachineInstr *Prev = nullptr ;
141
- HasRemainingSMChange = false ;
139
+ SmallVector<MachineInstr *, 4 > ToBeRemoved ;
142
140
141
+ // Convenience function to reset the matching of a sequence.
143
142
auto Reset = [&]() {
144
- if (Prev && ChangesStreamingMode (Prev))
145
- HasRemainingSMChange = true ;
146
143
Prev = nullptr ;
147
144
ToBeRemoved.clear ();
148
145
};
@@ -151,10 +148,15 @@ bool SMEPeepholeOpt::optimizeStartStopPairs(MachineBasicBlock &MBB,
151
148
// and smstop nodes that cancel each other out. We only permit a limited
152
149
// set of instructions to appear between them, otherwise we reset our
153
150
// tracking.
151
+ unsigned NumSMChanges = 0 ;
152
+ unsigned NumSMChangesRemoved = 0 ;
154
153
for (MachineInstr &MI : make_early_inc_range (MBB)) {
155
154
switch (MI.getOpcode ()) {
156
155
case AArch64::MSRpstatesvcrImm1:
157
156
case AArch64::MSRpstatePseudo: {
157
+ if (ChangesStreamingMode (&MI))
158
+ NumSMChanges++;
159
+
158
160
if (!Prev)
159
161
Prev = &MI;
160
162
else if (isMatchingStartStopPair (Prev, &MI)) {
@@ -167,6 +169,7 @@ bool SMEPeepholeOpt::optimizeStartStopPairs(MachineBasicBlock &MBB,
167
169
ToBeRemoved.clear ();
168
170
Prev = nullptr ;
169
171
Changed = true ;
172
+ NumSMChangesRemoved += 2 ;
170
173
} else {
171
174
Reset ();
172
175
Prev = &MI;
@@ -218,6 +221,8 @@ bool SMEPeepholeOpt::optimizeStartStopPairs(MachineBasicBlock &MBB,
218
221
}
219
222
}
220
223
224
+ HasRemovedAllSMChanges =
225
+ NumSMChanges && (NumSMChanges == NumSMChangesRemoved);
221
226
return Changed;
222
227
}
223
228
@@ -234,20 +239,20 @@ bool SMEPeepholeOpt::runOnMachineFunction(MachineFunction &MF) {
234
239
assert (MF.getRegInfo ().isSSA () && " Expected to be run on SSA form!" );
235
240
236
241
bool Changed = false ;
237
- bool FunctionHasRemainingSMChange = false ;
242
+ bool FunctionHasAllSMChangesRemoved = false ;
238
243
239
244
// Even if the block lives in a function with no SME attributes attached we
240
245
// still have to analyze all the blocks because we may call a streaming
241
246
// function that requires smstart/smstop pairs.
242
247
for (MachineBasicBlock &MBB : MF) {
243
- bool BlockHasRemainingSMChange ;
244
- Changed |= optimizeStartStopPairs (MBB, BlockHasRemainingSMChange );
245
- FunctionHasRemainingSMChange |= BlockHasRemainingSMChange ;
248
+ bool BlockHasAllSMChangesRemoved ;
249
+ Changed |= optimizeStartStopPairs (MBB, BlockHasAllSMChangesRemoved );
250
+ FunctionHasAllSMChangesRemoved |= BlockHasAllSMChangesRemoved ;
246
251
}
247
252
248
253
AArch64FunctionInfo *AFI = MF.getInfo <AArch64FunctionInfo>();
249
- if (Changed && AFI-> hasStreamingModeChanges () )
250
- AFI->setHasStreamingModeChanges (FunctionHasRemainingSMChange );
254
+ if (FunctionHasAllSMChangesRemoved )
255
+ AFI->setHasStreamingModeChanges (false );
251
256
252
257
return Changed;
253
258
}
0 commit comments