[llvm] r316601 - [Hexagon] Account for negative offset when limiting max deviation

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 25 11:46:40 PDT 2017


Author: kparzysz
Date: Wed Oct 25 11:46:40 2017
New Revision: 316601

URL: http://llvm.org/viewvc/llvm-project?rev=316601&view=rev
Log:
[Hexagon] Account for negative offset when limiting max deviation

In getOffsetRange, Max can be set to 0 to force the extender replacement
to be at or below the original value. This would cause the new offset to
be non-negative, which is preferred for memory instructions (to reduce
the likelihood of it getting constant-extended due to predication). The
problem happens when the range is shifted by an offset (present in the
instruction being examined) and the offset is negative. The entire range
for the allowable deviation will then be strictly negative. This creates
a problem, since 0 is assumed to be a valid deviation.

Added:
    llvm/trunk/test/CodeGen/Hexagon/cext-opt-range-offset.mir
Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonConstExtenders.cpp

Modified: llvm/trunk/lib/Target/Hexagon/HexagonConstExtenders.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonConstExtenders.cpp?rev=316601&r1=316600&r2=316601&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonConstExtenders.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonConstExtenders.cpp Wed Oct 25 11:46:40 2017
@@ -1040,10 +1040,13 @@ OffsetRange HCE::getOffsetRange(Register
   unsigned L = Log2_32(A);
   unsigned S = 10+L;  // sint11_L
   int32_t Min = -alignDown((1<<S)-1, A);
-  int32_t Max = 0;  // Force non-negative offsets.
 
-  OffsetRange R = { Min, Max, A };
+  // The range will be shifted by Off. To prefer non-negative offsets,
+  // adjust Max accordingly.
   int32_t Off = MI.getOperand(OffP).getImm();
+  int32_t Max = Off >= 0 ? 0 : -Off;
+
+  OffsetRange R = { Min, Max, A };
   return R.shift(Off);
 }
 
@@ -1622,6 +1625,9 @@ bool HCE::replaceInstrExpr(const ExtDesc
 #ifndef NDEBUG
     // Make sure the output is within allowable range for uses.
     OffsetRange Uses = getOffsetRange(MI.getOperand(0));
+    if (!Uses.contains(Diff))
+      dbgs() << "Diff: " << Diff << " out of range " << Uses
+             << " for " << MI;
     assert(Uses.contains(Diff));
 #endif
     MBB.erase(MI);

Added: llvm/trunk/test/CodeGen/Hexagon/cext-opt-range-offset.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/cext-opt-range-offset.mir?rev=316601&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/cext-opt-range-offset.mir (added)
+++ llvm/trunk/test/CodeGen/Hexagon/cext-opt-range-offset.mir Wed Oct 25 11:46:40 2017
@@ -0,0 +1,43 @@
+# RUN: llc -march=hexagon -run-pass hexagon-cext-opt %s -o - | FileCheck %s
+
+# Check that this testcase does not crash.
+# CHECK: L4_and_memopw_io
+
+---
+name: fred
+tracksRegLiveness: true
+registers:
+  - { id: 0, class: intregs }
+  - { id: 1, class: intregs }
+  - { id: 2, class: intregs }
+  - { id: 3, class: intregs }
+  - { id: 4, class: predregs }
+  - { id: 5, class: intregs }
+  - { id: 6, class: intregs }
+body: |
+  bb.0:
+    successors: %bb.1
+        %0 = A2_tfrsi -360184608
+        %1 = L2_loadri_io %0, -1024
+
+  bb.1:
+    successors: %bb.2
+        %2 = A2_tfrsi -234944641
+        %3 = A2_tfrsi -360185632
+        L4_and_memopw_io %3, 0, %2
+
+  bb.2:
+    successors: %bb.3, %bb.4
+        %4 = IMPLICIT_DEF
+        J2_jumpt %4, %bb.4, implicit-def %pc
+        J2_jump %bb.3, implicit-def %pc
+
+  bb.3:
+    successors: %bb.4
+
+  bb.4:
+    successors: %bb.4
+        %5 = A2_tfrsi -234944521
+        %6 = A2_tfrsi -360185632
+        L4_and_memopw_io %6, 0, %5
+...




More information about the llvm-commits mailing list