mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 23:17:16 +00:00
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
This commit is contained in:
+24
-24
@@ -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
|
||||
=====================
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#ifndef LLVM_IR_AUTOUPGRADE_H
|
||||
#define LLVM_IR_AUTOUPGRADE_H
|
||||
|
||||
#include <string>
|
||||
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.");
|
||||
|
||||
@@ -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<Value*, 2> 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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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]]}
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user