Commit 9d20e427 authored by Mark Heffernan's avatar Mark Heffernan
Browse files

Rename metadata llvm.loop.vectorize.unroll to llvm.loop.vectorize.interleave.

llvm-svn: 213588
parent 34735af3
Loading
Loading
Loading
Loading
+31 −19
Original line number Diff line number Diff line
@@ -2910,37 +2910,49 @@ suggests an unroll factor to the loop unroller:
      br i1 %exitcond, label %._crit_edge, label %.lr.ph, !llvm.loop !0
    ...
    !0 = metadata !{ metadata !0, metadata !1 }
    !1 = metadata !{ metadata !"llvm.loop.vectorize.width", i32 4 }
    !1 = metadata !{ metadata !"llvm.loop.unroll.count", i32 4 }

'``llvm.loop.vectorize``'
^^^^^^^^^^^^^^^^^^^^^^^^^
'``llvm.loop.vectorize``' and '``llvm.loop.interleave``'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Metadata prefixed with ``llvm.loop.vectorize`` is used to control
per-loop vectorization parameters such as vectorization width and
interleave count.  ``llvm.loop.vectorize`` metadata should be used in
Metadata prefixed with ``llvm.loop.vectorize`` or ``llvm.loop.interleave`` are
used to control per-loop vectorization and interleaving parameters such as
vectorization width and interleave count.  These metadata should be used in
conjunction with ``llvm.loop`` loop identification metadata.  The
``llvm.loop.vectorize`` metadata are only optimization hints and the
vectorizer will only vectorize loops if it believes it is safe to do
so.  The ``llvm.mem.parallel_loop_access`` metadata which contains
information about loop-carried memory dependencies can be helpful in
determining the safety of loop vectorization.
``llvm.loop.vectorize`` and ``llvm.loop.interleave`` metadata are only
optimization hints and the optimizer will only interleave and vectorize loops if
it believes it is safe to do so.  The ``llvm.mem.parallel_loop_access`` metadata
which contains information about loop-carried memory dependencies can be helpful
in determining the safety of these transformations.

'``llvm.loop.vectorize.unroll``' Metadata
'``llvm.loop.interleave.count``' Metadata
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This metadata suggests an interleave count to the loop vectorizer.
The first operand is the string ``llvm.loop.vectorize.unroll`` and the
This metadata suggests an interleave count to the loop interleaver.
The first operand is the string ``llvm.loop.interleave.count`` and the
second operand is an integer specifying the interleave count. For
example:

.. code-block:: llvm

   !0 = metadata !{ metadata !"llvm.loop.vectorize.unroll", i32 4 }
   !0 = metadata !{ metadata !"llvm.loop.interleave.count", i32 4 }

Note that setting ``llvm.loop.interleave.count`` to 1 disables interleaving
multiple iterations of the loop.  If ``llvm.loop.interleave.count`` is set to 0
then the interleave count will be determined automatically.

'``llvm.loop.vectorize.enable``' Metadata
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This metadata selectively enables or disables vectorization for the loop. The
first operand is the string ``llvm.loop.vectorize.enable`` and the second operand
is a bit.  If the bit operand value is 1 vectorization is enabled. A value of
0 disables vectorization:

.. code-block:: llvm

Note that setting ``llvm.loop.vectorize.unroll`` to 1 disables
interleaving multiple iterations of the loop.  If
``llvm.loop.vectorize.unroll`` is set to 0 then the interleave count
will be determined automatically.
   !0 = metadata !{ metadata !"llvm.loop.vectorize.enable", i1 0 }
   !1 = metadata !{ metadata !"llvm.loop.vectorize.enable", i1 1 }

'``llvm.loop.vectorize.width``' Metadata
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+3 −1
Original line number Diff line number Diff line
@@ -57,7 +57,9 @@ Non-comprehensive list of changes in this release
  unwinding information.

* The prefix for loop vectorizer hint metadata has been changed from
  ``llvm.vectorizer`` to ``llvm.loop.vectorize``.
  ``llvm.vectorizer`` to ``llvm.loop.vectorize``.  In addition,
  ``llvm.vectorizer.unroll`` metadata has been renamed
  ``llvm.loop.interleave.count``.

* Some backends previously implemented Atomic NAND(x,y) as ``x & ~y``. Now 
  all backends implement it as ``~(x & y)``, matching the semantics of GCC 4.4
+4 −2
Original line number Diff line number Diff line
@@ -580,7 +580,9 @@ bool llvm::UpgradeDebugInfo(Module &M) {

void llvm::UpgradeMDStringConstant(std::string &String) {
  const std::string OldPrefix = "llvm.vectorizer.";
  if (String.find(OldPrefix) == 0) {
  if (String == "llvm.vectorizer.unroll") {
    String = "llvm.loop.interleave.count";
  } else if (String.find(OldPrefix) == 0) {
    String.replace(0, OldPrefix.size(), "llvm.loop.vectorize.");
  }
}
+14 −12
Original line number Diff line number Diff line
@@ -978,8 +978,8 @@ public:
          << "LV: Unrolling disabled by the pass manager\n");
  }

  /// Return the loop vectorizer metadata prefix.
  static StringRef Prefix() { return "llvm.loop.vectorize."; }
  /// Return the loop metadata prefix.
  static StringRef Prefix() { return "llvm.loop."; }

  MDNode *createHint(LLVMContext &Context, StringRef Name, unsigned V) const {
    SmallVector<Value*, 2> Vals;
@@ -1001,8 +1001,10 @@ public:
      for (unsigned i = 1, ie = LoopID->getNumOperands(); i < ie; ++i)
        Vals.push_back(LoopID->getOperand(i));

    Vals.push_back(createHint(Context, Twine(Prefix(), "width").str(), Width));
    Vals.push_back(createHint(Context, Twine(Prefix(), "unroll").str(), 1));
    Vals.push_back(
        createHint(Context, Twine(Prefix(), "vectorize.width").str(), Width));
    Vals.push_back(
        createHint(Context, Twine(Prefix(), "interleave.count").str(), 1));

    MDNode *NewLoopID = MDNode::get(Context, Vals);
    // Set operand 0 to refer to the loop id itself.
@@ -1073,7 +1075,7 @@ private:
      if (!S)
        continue;

      // Check if the hint starts with the vectorizer prefix.
      // Check if the hint starts with the loop metadata prefix.
      StringRef Hint = S->getString();
      if (!Hint.startswith(Prefix()))
        continue;
@@ -1091,22 +1093,22 @@ private:
    if (!C) return;
    unsigned Val = C->getZExtValue();

    if (Hint == "width") {
    if (Hint == "vectorize.width") {
      if (isPowerOf2_32(Val) && Val <= MaxVectorWidth)
        Width = Val;
      else
        DEBUG(dbgs() << "LV: ignoring invalid width hint metadata\n");
    } else if (Hint == "unroll") {
      if (isPowerOf2_32(Val) && Val <= MaxUnrollFactor)
        Unroll = Val;
      else
        DEBUG(dbgs() << "LV: ignoring invalid unroll hint metadata\n");
    } else if (Hint == "enable") {
    } else if (Hint == "vectorize.enable") {
      if (C->getBitWidth() == 1)
        Force = Val == 1 ? LoopVectorizeHints::FK_Enabled
                         : LoopVectorizeHints::FK_Disabled;
      else
        DEBUG(dbgs() << "LV: ignoring invalid enable hint metadata\n");
    } else if (Hint == "interleave.count") {
      if (isPowerOf2_32(Val) && Val <= MaxUnrollFactor)
        Unroll = Val;
      else
        DEBUG(dbgs() << "LV: ignoring invalid unroll hint metadata\n");
    } else {
      DEBUG(dbgs() << "LV: ignoring unknown hint " << Hint << '\n');
    }
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ for.end: ; preds = %for.cond
  ret void
}

; CHECK: !{metadata !"llvm.loop.vectorize.unroll", i32 4}
; CHECK: !{metadata !"llvm.loop.interleave.count", i32 4}
; CHECK: !{metadata !"llvm.loop.vectorize.width", i32 8}
; CHECK: !{metadata !"llvm.loop.vectorize.enable", i1 true}

Loading