diff options
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64InstrInfo.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index d97d35567ea..97164ff785e 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -5188,6 +5188,12 @@ AArch64InstrInfo::getOutliningType(MachineBasicBlock::iterator &MIT, if (!MightNeedStackFixUp) return MachineOutlinerInstrType::Legal; + // Any modification of SP will break our code to save/restore LR. + // FIXME: We could handle some instructions which add a constant offset to + // SP, with a bit more work. + if (MI.modifiesRegister(AArch64::SP, &RI)) + return MachineOutlinerInstrType::Illegal; + // At this point, we have a stack instruction that we might need to fix // up. We'll handle it if it's a load or store. if (MI.mayLoadOrStore()) { @@ -5217,6 +5223,8 @@ AArch64InstrInfo::getOutliningType(MachineBasicBlock::iterator &MIT, return MachineOutlinerInstrType::Legal; } + // FIXME: Add handling for instructions like "add x0, sp, #8". + // We can't fix it up, so don't outline it. return MachineOutlinerInstrType::Illegal; } |