Skip to content

Commit 57e1549

Browse files
atrosinenkoasl
authored andcommitted
[AArch64][PAC] Expand blend(reg, imm) operation in aarch64-pauth pass
In preparation for implementing code generation for more @llvm.ptrauth.* intrinsics, move the expansion of blend(register, small integer) variant of @llvm.ptrauth.blend to the AArch64PointerAuth pass, where most other PAuth-related code generation takes place.
1 parent 40ebe52 commit 57e1549

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,6 +1581,9 @@ def PAUTH_PROLOGUE : Pseudo<(outs), (ins), []>, Sched<[]>;
15811581
def PAUTH_EPILOGUE : Pseudo<(outs), (ins), []>, Sched<[]>;
15821582
}
15831583

1584+
def PAUTH_BLEND : Pseudo<(outs GPR64:$disc),
1585+
(ins GPR64:$addr_disc, i32imm:$int_disc), []>, Sched<[]>;
1586+
15841587
// These pointer authentication instructions require armv8.3a
15851588
let Predicates = [HasPAuth] in {
15861589

@@ -9317,12 +9320,10 @@ let Predicates = [HasMOPS, HasMTE], Defs = [NZCV], Size = 12, mayLoad = 0, maySt
93179320
//-----------------------------------------------------------------------------
93189321
// v8.3 Pointer Authentication late patterns
93199322

9320-
let Predicates = [HasPAuth] in {
93219323
def : Pat<(int_ptrauth_blend GPR64:$Rd, imm64_0_65535:$imm),
9322-
(MOVKXi GPR64:$Rd, (trunc_imm imm64_0_65535:$imm), 48)>;
9324+
(PAUTH_BLEND GPR64:$Rd, (trunc_imm imm64_0_65535:$imm))>;
93239325
def : Pat<(int_ptrauth_blend GPR64:$Rd, GPR64:$Rn),
93249326
(BFMXri GPR64:$Rd, GPR64:$Rn, 16, 15)>;
9325-
}
93269327

93279328
//-----------------------------------------------------------------------------
93289329

llvm/lib/Target/AArch64/AArch64PointerAuth.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ class AArch64PointerAuth : public MachineFunctionPass {
4646
void authenticateLR(MachineFunction &MF,
4747
MachineBasicBlock::iterator MBBI) const;
4848

49+
/// Stores blend(AddrDisc, IntDisc) to the Result register.
50+
void emitBlend(MachineBasicBlock::iterator MBBI, Register Result,
51+
Register AddrDisc, unsigned IntDisc) const;
52+
53+
/// Expands PAUTH_BLEND pseudo instruction.
54+
void expandPAuthBlend(MachineBasicBlock::iterator MBBI) const;
55+
4956
bool checkAuthenticatedLR(MachineBasicBlock::iterator TI) const;
5057
};
5158

@@ -359,6 +366,32 @@ bool AArch64PointerAuth::checkAuthenticatedLR(
359366
return true;
360367
}
361368

369+
void AArch64PointerAuth::emitBlend(MachineBasicBlock::iterator MBBI,
370+
Register Result, Register AddrDisc,
371+
unsigned IntDisc) const {
372+
MachineBasicBlock &MBB = *MBBI->getParent();
373+
DebugLoc DL = MBBI->getDebugLoc();
374+
375+
if (Result != AddrDisc)
376+
BuildMI(MBB, MBBI, DL, TII->get(AArch64::ORRXrs), Result)
377+
.addReg(AArch64::XZR)
378+
.addReg(AddrDisc)
379+
.addImm(0);
380+
381+
BuildMI(MBB, MBBI, DL, TII->get(AArch64::MOVKXi), Result)
382+
.addReg(Result)
383+
.addImm(IntDisc)
384+
.addImm(48);
385+
}
386+
387+
void AArch64PointerAuth::expandPAuthBlend(
388+
MachineBasicBlock::iterator MBBI) const {
389+
Register ResultReg = MBBI->getOperand(0).getReg();
390+
Register AddrDisc = MBBI->getOperand(1).getReg();
391+
unsigned IntDisc = MBBI->getOperand(2).getImm();
392+
emitBlend(MBBI, ResultReg, AddrDisc, IntDisc);
393+
}
394+
362395
bool AArch64PointerAuth::runOnMachineFunction(MachineFunction &MF) {
363396
const auto *MFnI = MF.getInfo<AArch64FunctionInfo>();
364397

@@ -390,6 +423,7 @@ bool AArch64PointerAuth::runOnMachineFunction(MachineFunction &MF) {
390423
break;
391424
case AArch64::PAUTH_PROLOGUE:
392425
case AArch64::PAUTH_EPILOGUE:
426+
case AArch64::PAUTH_BLEND:
393427
assert(!MI.isBundled());
394428
PAuthPseudoInstrs.push_back(MI.getIterator());
395429
break;
@@ -406,6 +440,9 @@ bool AArch64PointerAuth::runOnMachineFunction(MachineFunction &MF) {
406440
authenticateLR(MF, It);
407441
HasAuthenticationInstrs = true;
408442
break;
443+
case AArch64::PAUTH_BLEND:
444+
expandPAuthBlend(It);
445+
break;
409446
default:
410447
llvm_unreachable("Unhandled opcode");
411448
}

0 commit comments

Comments
 (0)