Loading llvm/docs/LangRef.rst +31 −19 Original line number Diff line number Diff line Loading @@ -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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Loading llvm/docs/ReleaseNotes.rst +3 −1 Original line number Diff line number Diff line Loading @@ -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 Loading llvm/lib/IR/AutoUpgrade.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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."); } } llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +14 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading Loading @@ -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; Loading @@ -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'); } Loading llvm/test/Assembler/upgrade-loop-metadata.ll +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
llvm/docs/LangRef.rst +31 −19 Original line number Diff line number Diff line Loading @@ -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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Loading
llvm/docs/ReleaseNotes.rst +3 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
llvm/lib/IR/AutoUpgrade.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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."); } }
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +14 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. Loading Loading @@ -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; Loading @@ -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'); } Loading
llvm/test/Assembler/upgrade-loop-metadata.ll +1 −1 Original line number Diff line number Diff line Loading @@ -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