@@ -3103,7 +3103,14 @@ void AArch64TargetLowering::fixupBlendComponents(
31033103 Register AddrDisc = AddrDiscOp.getReg();
31043104 int64_t IntDisc = IntDiscOp.getImm();
31053105
3106- assert(IntDisc == 0 && "Blend components are already expanded");
3106+ // This function tries to expand an opaque vreg discriminator into address
3107+ // modifier and immediate modifier components. If the immediate modifier
3108+ // operand is already non-zero, no fixup needed.
3109+ if (IntDisc != 0) {
3110+ assert(AddrDisc == AArch64::XZR || AddrDisc == AArch64::NoRegister ||
3111+ MRI.getRegClass(AddrDisc) == AddrDiscRC);
3112+ return;
3113+ }
31073114
31083115 int64_t Offset = 0;
31093116 MachineInstr *MaybeBlend = stripAndAccumulateOffset(MRI, AddrDisc, Offset);
@@ -3130,51 +3137,70 @@ void AArch64TargetLowering::fixupBlendComponents(
31303137}
31313138
31323139MachineBasicBlock *
3133- AArch64TargetLowering::tryRewritingPAC(MachineInstr &MI,
3134- MachineBasicBlock *BB) const {
3140+ AArch64TargetLowering::EmitAUTxMxN(MachineInstr &MI,
3141+ MachineBasicBlock *BB) const {
3142+ const TargetInstrInfo *TII = Subtarget->getInstrInfo();
3143+ const DebugLoc &DL = MI.getDebugLoc();
3144+
3145+ Register AuthVal = MI.getOperand(0).getReg();
3146+ Register Val = MI.getOperand(2).getReg();
3147+ unsigned Key = MI.getOperand(3).getImm();
3148+ int64_t IntDisc = MI.getOperand(4).getImm();
3149+ Register AddrDisc = MI.getOperand(5).getReg();
3150+
3151+ BuildMI(*BB, MI, DL, TII->get(AArch64::COPY), AArch64::X16).addReg(Val);
3152+ BuildMI(*BB, MI, DL, TII->get(AArch64::AUT))
3153+ .addImm(Key)
3154+ .addImm(IntDisc)
3155+ .addReg(AddrDisc);
3156+ BuildMI(*BB, MI, DL, TII->get(AArch64::COPY), AuthVal).addReg(AArch64::X16);
3157+
3158+ MI.eraseFromParent();
3159+ return BB;
3160+ }
3161+
3162+ void AArch64TargetLowering::tryRewritingPAC(MachineInstr &MI,
3163+ MachineBasicBlock *BB) const {
31353164 const TargetInstrInfo *TII = Subtarget->getInstrInfo();
31363165 MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
31373166 const DebugLoc &DL = MI.getDebugLoc();
31383167
3168+ Register Val = MI.getOperand(1).getReg();
3169+ unsigned Key = MI.getOperand(2).getImm();
3170+ int64_t IntDisc = MI.getOperand(3).getImm();
3171+ Register AddrDisc = MI.getOperand(4).getReg();
3172+
31393173 // Try to find a known address-setting instruction, accumulating the offset
31403174 // along the way. If no known pattern is found, keep everything as-is.
31413175
31423176 int64_t AddrOffset = 0;
3143- MachineInstr *AddrDefInstr =
3144- stripAndAccumulateOffset(MRI, MI.getOperand(1).getReg(), AddrOffset);
3177+ MachineInstr *AddrDefInstr = stripAndAccumulateOffset(MRI, Val, AddrOffset);
31453178 if (!AddrDefInstr)
3146- return BB ;
3179+ return;
31473180
31483181 unsigned NewOpcode;
31493182 if (AddrDefInstr->getOpcode() == AArch64::LOADgotAUTH)
31503183 NewOpcode = AArch64::LOADgotPAC;
31513184 else if (AddrDefInstr->getOpcode() == AArch64::MOVaddr)
31523185 NewOpcode = AArch64::MOVaddrPAC;
31533186 else
3154- return BB ; // Unknown opcode.
3187+ return; // Unknown opcode.
31553188
31563189 MachineOperand &AddrOp = AddrDefInstr->getOperand(1);
31573190 unsigned TargetFlags = AddrOp.getTargetFlags() & ~AArch64II::MO_PAGE;
31583191 const GlobalValue *GV = AddrOp.getGlobal();
31593192 AddrOffset += AddrOp.getOffset();
31603193
3161- Register DiscReg = isPACWithZeroDisc(MI.getOpcode())
3162- ? AArch64::XZR
3163- : MI.getOperand(2).getReg();
3164-
3165- MachineInstr *NewMI = BuildMI(*BB, MI, DL, TII->get(NewOpcode))
3166- .addGlobalAddress(GV, AddrOffset, TargetFlags)
3167- .addImm(getKeyForPACOpcode(MI.getOpcode()))
3168- .addReg(DiscReg)
3169- .addImm(0);
3170- fixupBlendComponents(*NewMI, BB, NewMI->getOperand(3), NewMI->getOperand(2),
3171- &AArch64::GPR64noipRegClass);
3194+ BuildMI(*BB, MI, DL, TII->get(NewOpcode))
3195+ .addGlobalAddress(GV, AddrOffset, TargetFlags)
3196+ .addImm(Key)
3197+ .addReg(AddrDisc)
3198+ .addImm(IntDisc);
31723199
31733200 BuildMI(*BB, MI, DL, TII->get(AArch64::COPY), MI.getOperand(0).getReg())
31743201 .addReg(AArch64::X16);
31753202
31763203 MI.removeFromParent();
3177- return BB;
31783204}
31793205
31803206MachineBasicBlock *AArch64TargetLowering::EmitInstrWithCustomInserter(
@@ -3276,15 +3302,21 @@ MachineBasicBlock *AArch64TargetLowering::EmitInstrWithCustomInserter(
32763302 case AArch64::MOVT_TIZ_PSEUDO:
32773303 return EmitZTInstr(MI, BB, AArch64::MOVT_TIZ, /*Op0IsDef=*/true);
32783304
3279- case AArch64::PACDA:
3280- case AArch64::PACDB:
3281- case AArch64::PACIA:
3282- case AArch64::PACIB:
3283- case AArch64::PACDZA:
3284- case AArch64::PACDZB:
3285- case AArch64::PACIZA:
3286- case AArch64::PACIZB:
3287- return tryRewritingPAC(MI, BB);
3305+ case AArch64::PAC:
3306+ fixupBlendComponents(MI, BB, MI.getOperand(3), MI.getOperand(4),
3307+ &AArch64::GPR64noipRegClass);
3308+ tryRewritingPAC(MI, BB);
3309+ return BB;
3310+ case AArch64::AUTxMxN:
3311+ fixupBlendComponents(MI, BB, MI.getOperand(4), MI.getOperand(5),
3312+ &AArch64::GPR64noipRegClass);
3313+ return EmitAUTxMxN(MI, BB);
3314+ case AArch64::AUTPAC:
3315+ fixupBlendComponents(MI, BB, MI.getOperand(1), MI.getOperand(2),
3316+ &AArch64::GPR64noipRegClass);
3317+ fixupBlendComponents(MI, BB, MI.getOperand(4), MI.getOperand(5),
3318+ &AArch64::GPR64noipRegClass);
3319+ return BB;
32883320 }
32893321}
32903322
0 commit comments