cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
111 lines
4.1 KiB
C++
111 lines
4.1 KiB
C++
//===- llvm/CodeGen/CriticalAntiDepBreaker.h - Anti-Dep Support -*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the CriticalAntiDepBreaker class, which
|
|
// implements register anti-dependence breaking along a blocks
|
|
// critical path during post-RA scheduler.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_CODEGEN_CRITICALANTIDEPBREAKER_H
|
|
#define LLVM_LIB_CODEGEN_CRITICALANTIDEPBREAKER_H
|
|
|
|
#include "llvm/ADT/BitVector.h"
|
|
#include "llvm/CodeGen/AntiDepBreaker.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
|
|
class MachineBasicBlock;
|
|
class MachineFunction;
|
|
class MachineInstr;
|
|
class MachineOperand;
|
|
class MachineRegisterInfo;
|
|
class RegisterClassInfo;
|
|
class TargetInstrInfo;
|
|
class TargetRegisterClass;
|
|
class TargetRegisterInfo;
|
|
|
|
class LLVM_LIBRARY_VISIBILITY CriticalAntiDepBreaker : public AntiDepBreaker {
|
|
MachineFunction& MF;
|
|
MachineRegisterInfo &MRI;
|
|
const TargetInstrInfo *TII;
|
|
const TargetRegisterInfo *TRI;
|
|
const RegisterClassInfo &RegClassInfo;
|
|
|
|
/// The set of allocatable registers.
|
|
/// We'll be ignoring anti-dependencies on non-allocatable registers,
|
|
/// because they may not be safe to break.
|
|
const BitVector AllocatableSet;
|
|
|
|
/// For live regs that are only used in one register class in a
|
|
/// live range, the register class. If the register is not live, the
|
|
/// corresponding value is null. If the register is live but used in
|
|
/// multiple register classes, the corresponding value is -1 casted to a
|
|
/// pointer.
|
|
std::vector<const TargetRegisterClass *> Classes;
|
|
|
|
/// Map registers to all their references within a live range.
|
|
std::multimap<MCRegister, MachineOperand *> RegRefs;
|
|
|
|
using RegRefIter =
|
|
std::multimap<MCRegister, MachineOperand *>::const_iterator;
|
|
|
|
/// The index of the most recent kill (proceeding bottom-up),
|
|
/// or ~0u if the register is not live.
|
|
std::vector<unsigned> KillIndices;
|
|
|
|
/// The index of the most recent complete def (proceeding
|
|
/// bottom up), or ~0u if the register is live.
|
|
std::vector<unsigned> DefIndices;
|
|
|
|
/// A set of registers which are live and cannot be changed to
|
|
/// break anti-dependencies.
|
|
BitVector KeepRegs;
|
|
|
|
public:
|
|
CriticalAntiDepBreaker(MachineFunction& MFi, const RegisterClassInfo &RCI);
|
|
~CriticalAntiDepBreaker() override;
|
|
|
|
/// Initialize anti-dep breaking for a new basic block.
|
|
void StartBlock(MachineBasicBlock *BB) override;
|
|
|
|
/// Identifiy anti-dependencies along the critical path
|
|
/// of the ScheduleDAG and break them by renaming registers.
|
|
unsigned BreakAntiDependencies(const std::vector<SUnit> &SUnits,
|
|
MachineBasicBlock::iterator Begin,
|
|
MachineBasicBlock::iterator End,
|
|
unsigned InsertPosIndex,
|
|
DbgValueVector &DbgValues) override;
|
|
|
|
/// Update liveness information to account for the current
|
|
/// instruction, which will not be scheduled.
|
|
void Observe(MachineInstr &MI, unsigned Count,
|
|
unsigned InsertPosIndex) override;
|
|
|
|
/// Finish anti-dep breaking for a basic block.
|
|
void FinishBlock() override;
|
|
|
|
private:
|
|
void PrescanInstruction(MachineInstr &MI);
|
|
void ScanInstruction(MachineInstr &MI, unsigned Count);
|
|
bool isNewRegClobberedByRefs(RegRefIter RegRefBegin, RegRefIter RegRefEnd,
|
|
MCRegister NewReg);
|
|
MCRegister
|
|
findSuitableFreeRegister(RegRefIter RegRefBegin, RegRefIter RegRefEnd,
|
|
MCRegister AntiDepReg, MCRegister LastNewReg,
|
|
const TargetRegisterClass *RC,
|
|
const SmallVectorImpl<Register> &Forbid);
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_LIB_CODEGEN_CRITICALANTIDEPBREAKER_H
|