[llvm] [LFI][AArch64] Add rewrites for memory accesses (PR #195167)
Nick Desaulniers via llvm-commits
llvm-commits at lists.llvm.org
Tue May 12 12:08:53 PDT 2026
================
@@ -64,6 +66,110 @@ static bool isPrivilegedTPAccess(const MCInst &Inst) {
return false;
}
+// Classification functions are limited to Armv8.1-A. Instructions outside of
+// this subset are not guaranteed to be rewritten and as a result may fail LFI
+// verification after compilation.
+
+// Instructions that have mayLoad/mayStore set in TableGen but don't actually
+// perform memory accesses.
+static bool isFakeMemAccess(const MCInst &Inst) {
+ switch (Inst.getOpcode()) {
+ case AArch64::DMB:
+ case AArch64::DSB:
+ case AArch64::ISB:
+ case AArch64::HINT:
+ // The range of sub-architectures supported by LFI do not include any load
+ // or store instructions in the HINT space.
+ return true;
+ default:
+ return false;
+ }
+}
+
+static bool mayPrefetch(const MCInst &Inst) {
+ switch (Inst.getOpcode()) {
+ case AArch64::PRFMl:
+ case AArch64::PRFMroW:
+ case AArch64::PRFMroX:
+ case AArch64::PRFMui:
+ case AArch64::PRFUMi:
+ return true;
+ default:
+ return false;
+ }
+}
+
+// User-mode DC/IC instructions that take a virtual address operand. Encoded as
+// SYSxt with op1=3, Cn=7, op2=1 where the Cm field selects the operation.
+static bool isVASysOp(const MCInst &Inst) {
+ if (Inst.getOpcode() != AArch64::SYSxt)
+ return false;
+ if (Inst.getOperand(0).getImm() != 3 || Inst.getOperand(1).getImm() != 7 ||
+ Inst.getOperand(3).getImm() != 1)
+ return false;
+ switch (Inst.getOperand(2).getImm()) {
+ case 4: // DC ZVA
+ case 5: // IC IVAU
+ case 10: // DC CVAC
+ case 11: // DC CVAU
+ case 12: // DC CVAP
+ case 13: // DC CVADP
+ case 14: // DC CIVAC
+ return true;
+ default:
+ return false;
+ }
+}
+
+static MCInst replaceRegAt(const MCInst &Inst, unsigned Idx,
+ MCRegister NewReg) {
+ MCInst New;
+ New.setOpcode(Inst.getOpcode());
+ New.setLoc(Inst.getLoc());
+ for (unsigned I = 0, E = Inst.getNumOperands(); I != E; ++I) {
+ if (I == Idx) {
+ assert(Inst.getOperand(I).isReg());
+ New.addOperand(MCOperand::createReg(NewReg));
+ } else {
+ New.addOperand(Inst.getOperand(I));
+ }
+ }
+ return New;
+}
----------------
nickdesaulniers wrote:
Do we really need a whole new `MCInst`? Why not modify `Inst`?
https://github.com/llvm/llvm-project/pull/195167
More information about the llvm-commits
mailing list