@@ -406,8 +406,9 @@ class SrcSafetyAnalysis {
406406 const MCInst *FirstCheckerInst;
407407 std::tie (CheckedReg, FirstCheckerInst) = CheckerSequenceInfo.at (&Point);
408408
409- // FirstCheckerInst should belong to the same basic block, meaning
410- // it was deterministically processed a few steps before this instruction.
409+ // FirstCheckerInst should belong to the same basic block (see the
410+ // assertion in DataflowSrcSafetyAnalysis::run()), meaning it was
411+ // deterministically processed a few steps before this instruction.
411412 const SrcState &StateBeforeChecker =
412413 getStateBefore (*FirstCheckerInst).get ();
413414 if (StateBeforeChecker.SafeToDerefRegs [CheckedReg])
@@ -566,15 +567,19 @@ class DataflowSrcSafetyAnalysis
566567 void run () override {
567568 for (BinaryBasicBlock &BB : Func) {
568569 if (auto CheckerInfo = BC.MIB ->getAuthCheckedReg (BB)) {
569- MCInst *LastInstOfChecker = BB.getLastNonPseudoInstr ();
570+ MCPhysReg CheckedReg = CheckerInfo->first ;
571+ MCInst &FirstInst = *CheckerInfo->second ;
572+ MCInst &LastInst = *BB.getLastNonPseudoInstr ();
570573 LLVM_DEBUG ({
571574 dbgs () << " Found pointer checking sequence in " << BB.getName ()
572575 << " :\n " ;
573- traceReg (BC, " Checked register" , CheckerInfo-> first );
574- traceInst (BC, " First instruction" , *CheckerInfo-> second );
575- traceInst (BC, " Last instruction" , *LastInstOfChecker );
576+ traceReg (BC, " Checked register" , CheckedReg );
577+ traceInst (BC, " First instruction" , FirstInst );
578+ traceInst (BC, " Last instruction" , LastInst );
576579 });
577- CheckerSequenceInfo[LastInstOfChecker] = *CheckerInfo;
580+ assert (llvm::any_of (BB, [&](MCInst &I) { return &I == &FirstInst; }) &&
581+ " Data-flow analysis expects the checker not to cross BBs" );
582+ CheckerSequenceInfo[&LastInst] = *CheckerInfo;
578583 }
579584 }
580585 DFParent::run ();
0 commit comments