diff options
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 10 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/machine-outliner.mir | 3 |
2 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index b88beda4d6b..9e12b1a0e70 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -4833,15 +4833,17 @@ AArch64InstrInfo::getOutliningType(MachineInstr &MI) const { // Find the minimum/maximum offset for this instruction and check if // fixing it up would be in range. - int64_t MinOffset, MaxOffset; - unsigned DummyScale; - getMemOpInfo(MI.getOpcode(), DummyScale, DummyWidth, MinOffset, + int64_t MinOffset, MaxOffset; // Unscaled offsets for the instruction. + unsigned Scale; // The scale to multiply the offsets by. + getMemOpInfo(MI.getOpcode(), Scale, DummyWidth, MinOffset, MaxOffset); // TODO: We should really test what happens if an instruction overflows. // This is tricky to test with IR tests, but when the outliner is moved // to a MIR test, it really ought to be checked. - if (Offset + 16 < MinOffset || Offset + 16 > MaxOffset) + + Offset += 16; // Update the offset to what it would be if we outlined. + if (Offset < MinOffset * Scale || Offset > MaxOffset * Scale) return MachineOutlinerInstrType::Illegal; // It's in range, so we can outline it. diff --git a/llvm/test/CodeGen/AArch64/machine-outliner.mir b/llvm/test/CodeGen/AArch64/machine-outliner.mir index 3ff2d2a3a36..ee3daf11c9f 100644 --- a/llvm/test/CodeGen/AArch64/machine-outliner.mir +++ b/llvm/test/CodeGen/AArch64/machine-outliner.mir @@ -39,6 +39,7 @@ body: | %w30 = ORRWri %wzr, 1 %lr = ORRXri %xzr, 1 + %x20, %x19 = LDPXi %sp, 10 %w16 = ORRWri %wzr, 1 %w16 = ORRWri %wzr, 1 %w16 = ORRWri %wzr, 1 @@ -50,6 +51,7 @@ body: | %w3 = ORRWri %wzr, 1993 + %x20, %x19 = LDPXi %sp, 10 %w16 = ORRWri %wzr, 1 %w16 = ORRWri %wzr, 1 %w16 = ORRWri %wzr, 1 @@ -61,6 +63,7 @@ body: | %w4 = ORRWri %wzr, 1994 + %x20, %x19 = LDPXi %sp, 10 %w16 = ORRWri %wzr, 1 %w16 = ORRWri %wzr, 1 %w16 = ORRWri %wzr, 1 |

