@@ -140,7 +140,6 @@ template <typename T, auto MergeValLambda> class LatticeT {
140
140
}
141
141
};
142
142
143
-
144
143
template <typename T, auto M>
145
144
raw_ostream &operator <<(raw_ostream &OS, const LatticeT<T, M> &V);
146
145
@@ -235,6 +234,38 @@ void addToMaxMap(RegMaxValuesT &M, MCPhysReg R, const uint64_t Value) {
235
234
MIt->second = std::max (MIt->second , Value);
236
235
}
237
236
237
+ using Reg2ConstValT = SmallDenseMap<MCPhysReg, uint64_t , 1 >;
238
+ bool RegConstValuesValMerge (Reg2ConstValT &v1, const Reg2ConstValT &v2) {
239
+ SmallVector<MCPhysReg, 1 > RegConstValuesToRemove;
240
+ for (auto Reg2ConstValue : v1) {
241
+ const MCPhysReg R (Reg2ConstValue.first );
242
+ // const uint64_t ConstValue(Reg2ConstValue.second);
243
+ auto v2Reg2ConstValue = v2.find (R);
244
+ if (v2Reg2ConstValue == v2.end ())
245
+ RegConstValuesToRemove.push_back (R);
246
+ else if (Reg2ConstValue.second != v2Reg2ConstValue->second ) {
247
+ RegConstValuesToRemove.push_back (R);
248
+ #if 0
249
+ // FIXME: how to add this back in?
250
+ addToMaxMap(RegMaxValues, R, ConstValue);
251
+ #endif
252
+ }
253
+ }
254
+ for (MCPhysReg R : RegConstValuesToRemove)
255
+ v1.erase (R);
256
+ return true ;
257
+ }
258
+ #if 0
259
+ raw_ostream &operator<<(raw_ostream &OS, const Reg2ConstValT &M) {
260
+ for (auto Reg2Value : M) {
261
+ print_reg(OS, Reg2Value.first, nullptr);
262
+ OS << ":" << Reg2Value.second << ",";
263
+ }
264
+ return OS;
265
+ }
266
+ #endif
267
+ using RegConstValuesT = LatticeT<Reg2ConstValT, RegConstValuesValMerge>;
268
+
238
269
template <typename T, auto M>
239
270
raw_ostream &operator <<(raw_ostream &OS, const LatticeT<T, M> &V) {
240
271
if (V == V.Top ())
@@ -246,14 +277,13 @@ raw_ostream &operator<<(raw_ostream &OS, const LatticeT<T, M> &V) {
246
277
return OS;
247
278
}
248
279
249
-
250
280
struct State {
251
281
// Store the maximum possible offset to which the stack extends
252
282
// beyond the furthest probe seen.
253
283
MaxOffsetSinceLastProbeT MaxOffsetSinceLastProbe;
254
284
// / ExactValues stores registers that we know have a specific
255
285
// / constant value.
256
- SmallDenseMap<MCPhysReg, uint64_t , 1 > RegConstValues;
286
+ RegConstValuesT RegConstValues;
257
287
// / RegMaxValues stores registers that we know have a value in the
258
288
// / range [0, MaxValue-1].
259
289
// FIXME: also make this std::optional!!!
@@ -286,6 +316,7 @@ struct State {
286
316
State &operator &=(const State &StateIn) {
287
317
MaxOffsetSinceLastProbe &= StateIn.MaxOffsetSinceLastProbe ;
288
318
319
+ #if 0
289
320
SmallVector<MCPhysReg, 1> RegConstValuesToRemove;
290
321
for (auto Reg2ConstValue : RegConstValues) {
291
322
const MCPhysReg R(Reg2ConstValue.first);
@@ -300,6 +331,8 @@ struct State {
300
331
}
301
332
for (MCPhysReg R : RegConstValuesToRemove)
302
333
RegConstValues.erase(R);
334
+ #endif
335
+ RegConstValues &= StateIn.RegConstValues ;
303
336
304
337
RegMaxValues &= StateIn.RegMaxValues ;
305
338
@@ -341,7 +374,12 @@ raw_ostream &print_state(raw_ostream &OS, const State &S,
341
374
else
342
375
OS << *(S.MaxOffsetSinceLastProbe );
343
376
OS << " ), RegConstValues(" ;
344
- PrintRegMap (OS, S.RegConstValues , BC);
377
+ if (S.RegConstValues .hasVal ()) {
378
+ OS << " (" ;
379
+ PrintRegMap (OS, *S.RegConstValues , BC);
380
+ OS << " )" ;
381
+ } else
382
+ OS << S.RegConstValues ;
345
383
OS << " ), RegMaxValues(" ;
346
384
if (S.RegMaxValues .hasVal ()) {
347
385
OS << " (" ;
@@ -392,8 +430,9 @@ bool checkNonConstSPOffsetChange(const BinaryContext &BC, BinaryFunction &BF,
392
430
// non-constant amount, and hence violates stack-clash properties.
393
431
if (Next)
394
432
Next->LastStackGrowingInsts .insert (MCInstInBBReference::get (&Point, BF));
395
- if (auto OC = BC.MIB ->getOffsetChange (Point, Cur.RegConstValues ,
396
- Cur.RegMaxValues .getValOrDefault ());
433
+ if (auto OC =
434
+ BC.MIB ->getOffsetChange (Point, Cur.RegConstValues .getValOrDefault (),
435
+ Cur.RegMaxValues .getValOrDefault ());
397
436
OC && OC.ToReg == SP) {
398
437
if (OC.FromReg == SP) {
399
438
IsNonConstantSPOffsetChange = false ;
@@ -497,6 +536,7 @@ class StackClashDFAnalysis
497
536
if (BB.isEntryPoint ()) {
498
537
Next.Reg2MaxOffset = Reg2MaxOffsetValT ();
499
538
Next.RegMaxValues = Reg2MaxValT ();
539
+ Next.RegConstValues = Reg2ConstValT ();
500
540
}
501
541
return Next;
502
542
}
@@ -546,7 +586,8 @@ class StackClashDFAnalysis
546
586
BC.printInstruction (dbgs (), Point);
547
587
dbgs () << " \n " ;
548
588
});
549
- Next.RegConstValues [ConstValueReg] = ConstValue;
589
+ if (Next.RegConstValues .hasVal ())
590
+ (*Next.RegConstValues )[ConstValueReg] = ConstValue;
550
591
}
551
592
552
593
MCPhysReg MaxValueReg = BC.MIB ->getNoRegister ();
@@ -580,8 +621,8 @@ class StackClashDFAnalysis
580
621
assert (Operand.isReg ());
581
622
if (Next.RegMaxValues .hasVal () && Operand.getReg () != MaxValueReg)
582
623
Next.RegMaxValues ->erase (Operand.getReg ());
583
- if (Operand.getReg () != ConstValueReg)
584
- Next.RegConstValues . erase (Operand.getReg ());
624
+ if (Next. RegConstValues . hasVal () && Operand.getReg () != ConstValueReg)
625
+ Next.RegConstValues -> erase (Operand.getReg ());
585
626
}
586
627
587
628
if (!Next.MaxOffsetSinceLastProbe )
@@ -604,8 +645,9 @@ class StackClashDFAnalysis
604
645
}
605
646
606
647
MCPhysReg FixedOffsetRegJustSet = BC.MIB ->getNoRegister ();
607
- if (auto OC = BC.MIB ->getOffsetChange (Point, Cur.RegConstValues ,
608
- Cur.RegMaxValues .getValOrDefault ()))
648
+ if (auto OC =
649
+ BC.MIB ->getOffsetChange (Point, Cur.RegConstValues .getValOrDefault (),
650
+ Cur.RegMaxValues .getValOrDefault ()))
609
651
if (Next.Reg2MaxOffset .hasVal () && OC.OffsetChange ) {
610
652
int64_t Offset = *OC.OffsetChange ;
611
653
if (OC.FromReg == SP) {
0 commit comments