[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