From bb167336b33024022c78cbc1d679758282c5b608 Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Wed, 25 Jun 2014 15:41:00 +0000 Subject: Rename loop unrolling and loop vectorizer metadata to have a common prefix. [LLVM part] These patches rename the loop unrolling and loop vectorizer metadata such that they have a common 'llvm.loop.' prefix. Metadata name changes: llvm.vectorizer.* => llvm.loop.vectorizer.* llvm.loopunroll.* => llvm.loop.unroll.* This was a suggestion from an earlier review (http://reviews.llvm.org/D4090) which added the loop unrolling metadata. Patch by Mark Heffernan. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211710 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LangRef.rst | 48 +++++++++++----------- docs/ReleaseNotes.rst | 3 ++ include/llvm/IR/AutoUpgrade.h | 5 +++ lib/AsmParser/LLParser.cpp | 1 + lib/Bitcode/Reader/BitcodeReader.cpp | 3 +- lib/IR/AutoUpgrade.cpp | 7 ++++ lib/Transforms/Scalar/LoopUnrollPass.cpp | 10 ++--- lib/Transforms/Vectorize/LoopVectorize.cpp | 3 +- test/CodeGen/PowerPC/early-ret2.ll | 2 +- test/Transforms/LoopUnroll/unroll-pragmas.ll | 8 ++-- .../LoopVectorize/X86/already-vectorized.ll | 4 +- .../LoopVectorize/X86/metadata-enable.ll | 9 ++-- .../Transforms/LoopVectorize/X86/vect.omp.force.ll | 2 +- .../LoopVectorize/X86/vect.omp.force.small-tc.ll | 2 +- test/Transforms/LoopVectorize/metadata-unroll.ll | 2 +- test/Transforms/LoopVectorize/metadata-width.ll | 2 +- .../LoopVectorize/vect.omp.persistence.ll | 8 ++-- test/Transforms/LoopVectorize/vectorize-once.ll | 6 +-- 18 files changed, 70 insertions(+), 55 deletions(-) diff --git a/docs/LangRef.rst b/docs/LangRef.rst index c535443e2c..e60b0b23b2 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -2804,7 +2804,7 @@ constructs: The loop identifier metadata can be used to specify additional per-loop metadata. Any operands after the first operand can be treated as user-defined -metadata. For example the ``llvm.vectorizer.unroll`` metadata is understood +metadata. For example the ``llvm.loop.vectorize.unroll`` metadata is understood by the loop vectorizer to indicate how many times to unroll the loop: .. code-block:: llvm @@ -2812,7 +2812,7 @@ by the loop vectorizer to indicate how many times to unroll the loop: br i1 %exitcond, label %._crit_edge, label %.lr.ph, !llvm.loop !0 ... !0 = metadata !{ metadata !0, metadata !1 } - !1 = metadata !{ metadata !"llvm.vectorizer.unroll", i32 2 } + !1 = metadata !{ metadata !"llvm.loop.vectorize.unroll", i32 2 } '``llvm.mem``' ^^^^^^^^^^^^^^^ @@ -2897,54 +2897,54 @@ the loop identifier metadata node directly: !1 = metadata !{ metadata !1 } ; an identifier for the inner loop !2 = metadata !{ metadata !2 } ; an identifier for the outer loop -'``llvm.vectorizer``' -^^^^^^^^^^^^^^^^^^^^^ +'``llvm.loop.vectorize``' +^^^^^^^^^^^^^^^^^^^^^^^^^ -Metadata prefixed with ``llvm.vectorizer`` is used to control per-loop +Metadata prefixed with ``llvm.loop.vectorize`` is used to control per-loop vectorization parameters such as vectorization factor and unroll factor. -``llvm.vectorizer`` metadata should be used in conjunction with ``llvm.loop`` -loop identification metadata. +``llvm.loop.vectorize`` metadata should be used in conjunction with +``llvm.loop`` loop identification metadata. -'``llvm.vectorizer.unroll``' Metadata -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +'``llvm.loop.vectorize.unroll``' Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This metadata instructs the loop vectorizer to unroll the specified loop exactly ``N`` times. -The first operand is the string ``llvm.vectorizer.unroll`` and the second +The first operand is the string ``llvm.loop.vectorize.unroll`` and the second operand is an integer specifying the unroll factor. For example: .. code-block:: llvm - !0 = metadata !{ metadata !"llvm.vectorizer.unroll", i32 4 } + !0 = metadata !{ metadata !"llvm.loop.vectorize.unroll", i32 4 } -Note that setting ``llvm.vectorizer.unroll`` to 1 disables unrolling of the -loop. +Note that setting ``llvm.loop.vectorize.unroll`` to 1 disables +unrolling of the loop. -If ``llvm.vectorizer.unroll`` is set to 0 then the amount of unrolling will be -determined automatically. +If ``llvm.loop.vectorize.unroll`` is set to 0 then the amount of +unrolling will be determined automatically. -'``llvm.vectorizer.width``' Metadata -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +'``llvm.loop.vectorize.width``' Metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This metadata sets the target width of the vectorizer to ``N``. Without this metadata, the vectorizer will choose a width automatically. Regardless of this metadata, the vectorizer will only vectorize loops if it believes it is valid to do so. -The first operand is the string ``llvm.vectorizer.width`` and the second -operand is an integer specifying the width. For example: +The first operand is the string ``llvm.loop.vectorize.width`` and the +second operand is an integer specifying the width. For example: .. code-block:: llvm - !0 = metadata !{ metadata !"llvm.vectorizer.width", i32 4 } + !0 = metadata !{ metadata !"llvm.loop.vectorize.width", i32 4 } -Note that setting ``llvm.vectorizer.width`` to 1 disables vectorization of the -loop. +Note that setting ``llvm.loop.vectorize.width`` to 1 disables +vectorization of the loop. -If ``llvm.vectorizer.width`` is set to 0 then the width will be determined -automatically. +If ``llvm.loop.vectorize.width`` is set to 0 then the width will be +determined automatically. Module Flags Metadata ===================== diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst index 8dc1681358..2b2240c4a7 100644 --- a/docs/ReleaseNotes.rst +++ b/docs/ReleaseNotes.rst @@ -55,6 +55,9 @@ Non-comprehensive list of changes in this release * LLVM now always uses cfi directives for producing most stack unwinding information. +* The prefix for loop vectorizer hint metadata has been changed from + ``llvm.vectorizer`` to ``llvm.loop.vectorize``. + .. NOTE For small 1-3 sentence descriptions, just add an entry at the end of this list. If your description won't fit comfortably in one bullet diff --git a/include/llvm/IR/AutoUpgrade.h b/include/llvm/IR/AutoUpgrade.h index 076ed4acff..a4b3c410c4 100644 --- a/include/llvm/IR/AutoUpgrade.h +++ b/include/llvm/IR/AutoUpgrade.h @@ -14,6 +14,8 @@ #ifndef LLVM_IR_AUTOUPGRADE_H #define LLVM_IR_AUTOUPGRADE_H +#include + namespace llvm { class CallInst; class Constant; @@ -61,6 +63,9 @@ namespace llvm { /// Check the debug info version number, if it is out-dated, drop the debug /// info. Return true if module is modified. bool UpgradeDebugInfo(Module &M); + + /// Upgrade a metadata string constant in place. + void UpgradeMDStringConstant(std::string &String); } // End llvm namespace #endif diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 0c188f983f..f444206852 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -518,6 +518,7 @@ bool LLParser::ParseNamedGlobal() { bool LLParser::ParseMDString(MDString *&Result) { std::string Str; if (ParseStringConstant(Str)) return true; + llvm::UpgradeMDStringConstant(Str); Result = MDString::get(Context, Str); return false; } diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 696e714ff6..4bbecfdb17 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1062,7 +1062,8 @@ std::error_code BitcodeReader::ParseMetadata() { break; } case bitc::METADATA_STRING: { - SmallString<8> String(Record.begin(), Record.end()); + std::string String(Record.begin(), Record.end()); + llvm::UpgradeMDStringConstant(String); Value *V = MDString::get(Context, String); MDValueList.AssignValue(V, NextMDValueNo++); break; diff --git a/lib/IR/AutoUpgrade.cpp b/lib/IR/AutoUpgrade.cpp index 05b3745ab0..6554b3c5da 100644 --- a/lib/IR/AutoUpgrade.cpp +++ b/lib/IR/AutoUpgrade.cpp @@ -577,3 +577,10 @@ bool llvm::UpgradeDebugInfo(Module &M) { } return RetCode; } + +void llvm::UpgradeMDStringConstant(std::string &String) { + const std::string OldPrefix = "llvm.vectorizer."; + if (String.find(OldPrefix) == 0) { + String.replace(0, OldPrefix.size(), "llvm.loop.vectorize."); + } +} diff --git a/lib/Transforms/Scalar/LoopUnrollPass.cpp b/lib/Transforms/Scalar/LoopUnrollPass.cpp index 0af5a71c12..00c0f88a64 100644 --- a/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -220,7 +220,7 @@ static unsigned ApproximateLoopSize(const Loop *L, unsigned &NumCalls, } // Returns the value associated with the given metadata node name (for -// example, "llvm.loopunroll.count"). If no such named metadata node +// example, "llvm.loop.unroll.count"). If no such named metadata node // exists, then nullptr is returned. static const ConstantInt *GetUnrollMetadataValue(const Loop *L, StringRef Name) { @@ -250,24 +250,22 @@ static const ConstantInt *GetUnrollMetadataValue(const Loop *L, // Returns true if the loop has an unroll(enable) pragma. static bool HasUnrollEnablePragma(const Loop *L) { const ConstantInt *EnableValue = - GetUnrollMetadataValue(L, "llvm.loopunroll.enable"); + GetUnrollMetadataValue(L, "llvm.loop.unroll.enable"); return (EnableValue && EnableValue->getZExtValue()); - return false; } // Returns true if the loop has an unroll(disable) pragma. static bool HasUnrollDisablePragma(const Loop *L) { const ConstantInt *EnableValue = - GetUnrollMetadataValue(L, "llvm.loopunroll.enable"); + GetUnrollMetadataValue(L, "llvm.loop.unroll.enable"); return (EnableValue && !EnableValue->getZExtValue()); - return false; } // If loop has an unroll_count pragma return the (necessarily // positive) value from the pragma. Otherwise return 0. static unsigned UnrollCountPragmaValue(const Loop *L) { const ConstantInt *CountValue = - GetUnrollMetadataValue(L, "llvm.loopunroll.count"); + GetUnrollMetadataValue(L, "llvm.loop.unroll.count"); if (CountValue) { unsigned Count = CountValue->getZExtValue(); assert(Count >= 1 && "Unroll count must be positive."); diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index 79a6ecd15b..27452825c7 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -906,7 +906,7 @@ public: } /// Return the loop vectorizer metadata prefix. - static StringRef Prefix() { return "llvm.vectorizer."; } + static StringRef Prefix() { return "llvm.loop.vectorize."; } MDNode *createHint(LLVMContext &Context, StringRef Name, unsigned V) const { SmallVector Vals; @@ -5859,4 +5859,3 @@ Value *InnerLoopUnroller::getConsecutiveVector(Value* Val, int StartIdx, Constant *C = ConstantInt::get(ITy, StartIdx, Negate); return Builder.CreateAdd(Val, C, "induction"); } - diff --git a/test/CodeGen/PowerPC/early-ret2.ll b/test/CodeGen/PowerPC/early-ret2.ll index a8e456fea6..17847770a8 100644 --- a/test/CodeGen/PowerPC/early-ret2.ll +++ b/test/CodeGen/PowerPC/early-ret2.ll @@ -11,7 +11,7 @@ while.body.lr.ph: ; preds = %entry br i1 undef, label %while.end, label %while.body while.body: ; preds = %while.body, %while.body.lr.ph - br i1 false, label %while.end, label %while.body, !llvm.vectorizer.already_vectorized !0 + br i1 false, label %while.end, label %while.body, !llvm.loop.vectorize.already_vectorized !0 while.end: ; preds = %while.body, %while.body.lr.ph, %entry ret void diff --git a/test/Transforms/LoopUnroll/unroll-pragmas.ll b/test/Transforms/LoopUnroll/unroll-pragmas.ll index 5e60818e79..5e45a2d670 100644 --- a/test/Transforms/LoopUnroll/unroll-pragmas.ll +++ b/test/Transforms/LoopUnroll/unroll-pragmas.ll @@ -51,7 +51,7 @@ for.end: ; preds = %for.body ret void } !1 = metadata !{metadata !1, metadata !2} -!2 = metadata !{metadata !"llvm.loopunroll.enable", i1 false} +!2 = metadata !{metadata !"llvm.loop.unroll.enable", i1 false} ; loop64 has a high enough count that it should *not* be unrolled by ; the default unrolling heuristic. It serves as the control for the @@ -102,7 +102,7 @@ for.end: ; preds = %for.body ret void } !3 = metadata !{metadata !3, metadata !4} -!4 = metadata !{metadata !"llvm.loopunroll.enable", i1 true} +!4 = metadata !{metadata !"llvm.loop.unroll.enable", i1 true} ; #pragma clang loop unroll_count(4) ; Loop should be unrolled 4 times. @@ -132,7 +132,7 @@ for.end: ; preds = %for.body ret void } !5 = metadata !{metadata !5, metadata !6} -!6 = metadata !{metadata !"llvm.loopunroll.count", i32 4} +!6 = metadata !{metadata !"llvm.loop.unroll.count", i32 4} ; #pragma clang loop unroll_count(enable) unroll_count(4) @@ -255,7 +255,7 @@ for.end: ; preds = %for.body ret void } !10 = metadata !{metadata !10, metadata !11} -!11 = metadata !{metadata !"llvm.loopunroll.count", i32 1} +!11 = metadata !{metadata !"llvm.loop.unroll.count", i32 1} ; #pragma clang loop unroll(enable) ; Loop has very high loop count (1 million) and full unrolling was requested. diff --git a/test/Transforms/LoopVectorize/X86/already-vectorized.ll b/test/Transforms/LoopVectorize/X86/already-vectorized.ll index faed77d66d..fce3b70f59 100644 --- a/test/Transforms/LoopVectorize/X86/already-vectorized.ll +++ b/test/Transforms/LoopVectorize/X86/already-vectorized.ll @@ -40,7 +40,7 @@ for.end: ; preds = %for.body ; Now, we check for the Hint metadata ; CHECK: [[vect]] = metadata !{metadata [[vect]], metadata [[width:![0-9]+]], metadata [[unroll:![0-9]+]]} -; CHECK: [[width]] = metadata !{metadata !"llvm.vectorizer.width", i32 1} -; CHECK: [[unroll]] = metadata !{metadata !"llvm.vectorizer.unroll", i32 1} +; CHECK: [[width]] = metadata !{metadata !"llvm.loop.vectorize.width", i32 1} +; CHECK: [[unroll]] = metadata !{metadata !"llvm.loop.vectorize.unroll", i32 1} ; CHECK: [[scalar]] = metadata !{metadata [[scalar]], metadata [[width]], metadata [[unroll]]} diff --git a/test/Transforms/LoopVectorize/X86/metadata-enable.ll b/test/Transforms/LoopVectorize/X86/metadata-enable.ll index 9e4e98948c..8e0ca417b4 100644 --- a/test/Transforms/LoopVectorize/X86/metadata-enable.ll +++ b/test/Transforms/LoopVectorize/X86/metadata-enable.ll @@ -9,8 +9,9 @@ ; RUN: opt < %s -mcpu=corei7 -Oz -loop-vectorize -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=OzVEC2 ; RUN: opt < %s -mcpu=corei7 -O3 -disable-loop-vectorization -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=O3DIS -; This file tests the llvm.vectorizer.pragma forcing vectorization even when -; optimization levels are too low, or when vectorization is disabled. +; This file tests the llvm.loop.vectorize.enable metadata forcing +; vectorization even when optimization levels are too low, or when +; vectorization is disabled. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -170,6 +171,6 @@ for.end: ; preds = %for.body } !0 = metadata !{metadata !0, metadata !1} -!1 = metadata !{metadata !"llvm.vectorizer.enable", i1 1} +!1 = metadata !{metadata !"llvm.loop.vectorize.enable", i1 1} !2 = metadata !{metadata !2, metadata !3} -!3 = metadata !{metadata !"llvm.vectorizer.enable", i1 0} +!3 = metadata !{metadata !"llvm.loop.vectorize.enable", i1 0} diff --git a/test/Transforms/LoopVectorize/X86/vect.omp.force.ll b/test/Transforms/LoopVectorize/X86/vect.omp.force.ll index 84ffb2721e..074313bde6 100644 --- a/test/Transforms/LoopVectorize/X86/vect.omp.force.ll +++ b/test/Transforms/LoopVectorize/X86/vect.omp.force.ll @@ -53,7 +53,7 @@ for.end: } !1 = metadata !{metadata !1, metadata !2} -!2 = metadata !{metadata !"llvm.vectorizer.enable", i1 true} +!2 = metadata !{metadata !"llvm.loop.vectorize.enable", i1 true} ; ; This method will not be vectorized, as scalar cost is lower than any of vector costs. diff --git a/test/Transforms/LoopVectorize/X86/vect.omp.force.small-tc.ll b/test/Transforms/LoopVectorize/X86/vect.omp.force.small-tc.ll index 1b979e5871..97c31a148e 100644 --- a/test/Transforms/LoopVectorize/X86/vect.omp.force.small-tc.ll +++ b/test/Transforms/LoopVectorize/X86/vect.omp.force.small-tc.ll @@ -44,7 +44,7 @@ for.end: } !1 = metadata !{metadata !1, metadata !2} -!2 = metadata !{metadata !"llvm.vectorizer.enable", i1 true} +!2 = metadata !{metadata !"llvm.loop.vectorize.enable", i1 true} ; ; This loop will not be vectorized as the trip count is below the threshold. diff --git a/test/Transforms/LoopVectorize/metadata-unroll.ll b/test/Transforms/LoopVectorize/metadata-unroll.ll index 7f10372006..2fcc53a315 100644 --- a/test/Transforms/LoopVectorize/metadata-unroll.ll +++ b/test/Transforms/LoopVectorize/metadata-unroll.ll @@ -38,4 +38,4 @@ define void @inc(i32 %n) nounwind uwtable noinline ssp { } !0 = metadata !{metadata !0, metadata !1} -!1 = metadata !{metadata !"llvm.vectorizer.unroll", i32 2} +!1 = metadata !{metadata !"llvm.loop.vectorize.unroll", i32 2} diff --git a/test/Transforms/LoopVectorize/metadata-width.ll b/test/Transforms/LoopVectorize/metadata-width.ll index 1960c0bad6..87de655da6 100644 --- a/test/Transforms/LoopVectorize/metadata-width.ll +++ b/test/Transforms/LoopVectorize/metadata-width.ll @@ -28,4 +28,4 @@ for.end: ; preds = %for.body, %entry attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } !0 = metadata !{metadata !0, metadata !1} -!1 = metadata !{metadata !"llvm.vectorizer.width", i32 8} +!1 = metadata !{metadata !"llvm.loop.vectorize.width", i32 8} diff --git a/test/Transforms/LoopVectorize/vect.omp.persistence.ll b/test/Transforms/LoopVectorize/vect.omp.persistence.ll index dc3df7ab80..f646567783 100644 --- a/test/Transforms/LoopVectorize/vect.omp.persistence.ll +++ b/test/Transforms/LoopVectorize/vect.omp.persistence.ll @@ -18,7 +18,7 @@ target triple = "x86_64-unknown-linux-gnu" ; ; Test #1 ; -; Ensure that "llvm.vectorizer.enable" metadata was not lost prior to LoopVectorize pass. +; Ensure that "llvm.loop.vectorize.enable" metadata was not lost prior to LoopVectorize pass. ; In past LoopRotate was clearing that metadata. ; ; The source C code is: @@ -62,12 +62,12 @@ for.end: } !1 = metadata !{metadata !1, metadata !2} -!2 = metadata !{metadata !"llvm.vectorizer.enable", i1 true} +!2 = metadata !{metadata !"llvm.loop.vectorize.enable", i1 true} ; ; Test #2 ; -; Ensure that "llvm.vectorizer.enable" metadata was not lost even +; Ensure that "llvm.loop.vectorize.enable" metadata was not lost even ; if loop was not rotated (see http://reviews.llvm.org/D3348#comment-4). ; define i32 @nonrotated(i32 %a) { @@ -85,4 +85,4 @@ return: } !3 = metadata !{metadata !3, metadata !4} -!4 = metadata !{metadata !"llvm.vectorizer.enable", i1 true} +!4 = metadata !{metadata !"llvm.loop.vectorize.enable", i1 true} diff --git a/test/Transforms/LoopVectorize/vectorize-once.ll b/test/Transforms/LoopVectorize/vectorize-once.ll index 780046930e..47de13dbfe 100644 --- a/test/Transforms/LoopVectorize/vectorize-once.ll +++ b/test/Transforms/LoopVectorize/vectorize-once.ll @@ -69,9 +69,9 @@ _ZSt10accumulateIPiiET0_T_S2_S1_.exit: ; preds = %for.body.i, %entry attributes #0 = { nounwind readonly ssp uwtable "fp-contract-model"="standard" "no-frame-pointer-elim" "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic" "ssp-buffers-size"="8" } ; CHECK: !0 = metadata !{metadata !0, metadata !1, metadata !2} -; CHECK: !1 = metadata !{metadata !"llvm.vectorizer.width", i32 1} -; CHECK: !2 = metadata !{metadata !"llvm.vectorizer.unroll", i32 1} +; CHECK: !1 = metadata !{metadata !"llvm.loop.vectorize.width", i32 1} +; CHECK: !2 = metadata !{metadata !"llvm.loop.vectorize.unroll", i32 1} ; CHECK: !3 = metadata !{metadata !3, metadata !1, metadata !2} !0 = metadata !{metadata !0, metadata !1} -!1 = metadata !{metadata !"llvm.vectorizer.width", i32 1} +!1 = metadata !{metadata !"llvm.loop.vectorize.width", i32 1} -- cgit v1.2.3