[llvm] r320090 - [MachineOutliner] Fix offset overflow check
Jessica Paquette via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 7 13:51:44 PST 2017
Author: paquette
Date: Thu Dec 7 13:51:43 2017
New Revision: 320090
URL: http://llvm.org/viewvc/llvm-project?rev=320090&view=rev
Log:
[MachineOutliner] Fix offset overflow check
The offset overflow check before was incorrect. It would always give the
correct result, but it was comparing the SCALED potential fixed-up offset
against an UNSCALED minimum/maximum. As a result, the outliner was missing a
bunch of frame setup/destroy instructions that ought to have been safe to
outline. This fixes that, and adds an instruction to the .mir test that
failed the old test.
Modified:
llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir
Modified: llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp?rev=320090&r1=320089&r2=320090&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp Thu Dec 7 13:51:43 2017
@@ -4833,15 +4833,17 @@ AArch64InstrInfo::getOutliningType(Machi
// 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.
Modified: llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir?rev=320090&r1=320089&r2=320090&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir (original)
+++ llvm/trunk/test/CodeGen/AArch64/machine-outliner.mir Thu Dec 7 13:51:43 2017
@@ -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
More information about the llvm-commits
mailing list