|
10 | 10 | //
|
11 | 11 | //===----------------------------------------------------------------------===//
|
12 | 12 |
|
13 |
| -#include "AArch64ExpandImm.h" |
14 | 13 | #include "AArch64InstrInfo.h"
|
| 14 | +#include "AArch64ExpandImm.h" |
15 | 15 | #include "AArch64FrameLowering.h"
|
16 | 16 | #include "AArch64MachineFunctionInfo.h"
|
17 | 17 | #include "AArch64PointerAuth.h"
|
|
21 | 21 | #include "llvm/ADT/ArrayRef.h"
|
22 | 22 | #include "llvm/ADT/STLExtras.h"
|
23 | 23 | #include "llvm/ADT/SmallVector.h"
|
| 24 | +#include "llvm/CodeGen/LivePhysRegs.h" |
24 | 25 | #include "llvm/CodeGen/MachineBasicBlock.h"
|
25 | 26 | #include "llvm/CodeGen/MachineCombinerPattern.h"
|
26 | 27 | #include "llvm/CodeGen/MachineFrameInfo.h"
|
@@ -9467,6 +9468,94 @@ bool AArch64InstrInfo::isReallyTriviallyReMaterializable(
|
9467 | 9468 | return TargetInstrInfo::isReallyTriviallyReMaterializable(MI);
|
9468 | 9469 | }
|
9469 | 9470 |
|
| 9471 | +MachineBasicBlock::iterator |
| 9472 | +AArch64InstrInfo::probedStackAlloc(MachineBasicBlock::iterator MBBI, |
| 9473 | + Register TargetReg, bool FrameSetup) const { |
| 9474 | + assert(TargetReg != AArch64::SP && "New top of stack cannot aleady be in SP"); |
| 9475 | + |
| 9476 | + MachineBasicBlock &MBB = *MBBI->getParent(); |
| 9477 | + MachineFunction &MF = *MBB.getParent(); |
| 9478 | + const AArch64InstrInfo *TII = |
| 9479 | + MF.getSubtarget<AArch64Subtarget>().getInstrInfo(); |
| 9480 | + int64_t ProbeSize = MF.getInfo<AArch64FunctionInfo>()->getStackProbeSize(); |
| 9481 | + DebugLoc DL = MBB.findDebugLoc(MBBI); |
| 9482 | + |
| 9483 | + MachineFunction::iterator MBBInsertPoint = std::next(MBB.getIterator()); |
| 9484 | + MachineBasicBlock *LoopTestMBB = |
| 9485 | + MF.CreateMachineBasicBlock(MBB.getBasicBlock()); |
| 9486 | + MF.insert(MBBInsertPoint, LoopTestMBB); |
| 9487 | + MachineBasicBlock *LoopBodyMBB = |
| 9488 | + MF.CreateMachineBasicBlock(MBB.getBasicBlock()); |
| 9489 | + MF.insert(MBBInsertPoint, LoopBodyMBB); |
| 9490 | + MachineBasicBlock *ExitMBB = MF.CreateMachineBasicBlock(MBB.getBasicBlock()); |
| 9491 | + MF.insert(MBBInsertPoint, ExitMBB); |
| 9492 | + MachineInstr::MIFlag Flags = |
| 9493 | + FrameSetup ? MachineInstr::FrameSetup : MachineInstr::NoFlags; |
| 9494 | + |
| 9495 | + // LoopTest: |
| 9496 | + // SUB SP, SP, #ProbeSize |
| 9497 | + emitFrameOffset(*LoopTestMBB, LoopTestMBB->end(), DL, AArch64::SP, |
| 9498 | + AArch64::SP, StackOffset::getFixed(-ProbeSize), TII, Flags); |
| 9499 | + |
| 9500 | + // CMP SP, TargetReg |
| 9501 | + BuildMI(*LoopTestMBB, LoopTestMBB->end(), DL, TII->get(AArch64::SUBSXrx64), |
| 9502 | + AArch64::XZR) |
| 9503 | + .addReg(AArch64::SP) |
| 9504 | + .addReg(TargetReg) |
| 9505 | + .addImm(AArch64_AM::getArithExtendImm(AArch64_AM::UXTX, 0)) |
| 9506 | + .setMIFlags(Flags); |
| 9507 | + |
| 9508 | + // B.<Cond> LoopExit |
| 9509 | + BuildMI(*LoopTestMBB, LoopTestMBB->end(), DL, TII->get(AArch64::Bcc)) |
| 9510 | + .addImm(AArch64CC::LE) |
| 9511 | + .addMBB(ExitMBB) |
| 9512 | + .setMIFlags(Flags); |
| 9513 | + |
| 9514 | + // STR XZR, [SP] |
| 9515 | + BuildMI(*LoopBodyMBB, LoopBodyMBB->end(), DL, TII->get(AArch64::STRXui)) |
| 9516 | + .addReg(AArch64::XZR) |
| 9517 | + .addReg(AArch64::SP) |
| 9518 | + .addImm(0) |
| 9519 | + .setMIFlags(Flags); |
| 9520 | + |
| 9521 | + // B loop |
| 9522 | + BuildMI(*LoopBodyMBB, LoopBodyMBB->end(), DL, TII->get(AArch64::B)) |
| 9523 | + .addMBB(LoopTestMBB) |
| 9524 | + .setMIFlags(Flags); |
| 9525 | + |
| 9526 | + // LoopExit: |
| 9527 | + // MOV SP, TargetReg |
| 9528 | + BuildMI(*ExitMBB, ExitMBB->end(), DL, TII->get(AArch64::ADDXri), AArch64::SP) |
| 9529 | + .addReg(TargetReg) |
| 9530 | + .addImm(0) |
| 9531 | + .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0)) |
| 9532 | + .setMIFlags(Flags); |
| 9533 | + |
| 9534 | + // STR XZR, [SP] |
| 9535 | + BuildMI(*ExitMBB, ExitMBB->end(), DL, TII->get(AArch64::STRXui)) |
| 9536 | + .addReg(AArch64::XZR) |
| 9537 | + .addReg(AArch64::SP) |
| 9538 | + .addImm(0) |
| 9539 | + .setMIFlags(Flags); |
| 9540 | + |
| 9541 | + ExitMBB->splice(ExitMBB->end(), &MBB, std::next(MBBI), MBB.end()); |
| 9542 | + ExitMBB->transferSuccessorsAndUpdatePHIs(&MBB); |
| 9543 | + |
| 9544 | + LoopTestMBB->addSuccessor(ExitMBB); |
| 9545 | + LoopTestMBB->addSuccessor(LoopBodyMBB); |
| 9546 | + LoopBodyMBB->addSuccessor(LoopTestMBB); |
| 9547 | + MBB.addSuccessor(LoopTestMBB); |
| 9548 | + |
| 9549 | + // Update liveins. |
| 9550 | + if (MF.getRegInfo().reservedRegsFrozen()) { |
| 9551 | + recomputeLiveIns(*LoopTestMBB); |
| 9552 | + recomputeLiveIns(*LoopBodyMBB); |
| 9553 | + recomputeLiveIns(*ExitMBB); |
| 9554 | + } |
| 9555 | + |
| 9556 | + return ExitMBB->begin(); |
| 9557 | +} |
| 9558 | + |
9470 | 9559 | #define GET_INSTRINFO_HELPERS
|
9471 | 9560 | #define GET_INSTRMAP_INFO
|
9472 | 9561 | #include "AArch64GenInstrInfo.inc"
|
0 commit comments