14#include "llvm/IR/BasicBlock.h"
15#include "llvm/IR/CFG.h"
16#include "llvm/IR/Constants.h"
17#include "llvm/IR/InstrTypes.h"
18#include "llvm/IR/Instructions.h"
19#include "llvm/IR/Metadata.h"
24MDNode *clang::CodeGen::LoopInfo::createFollowupMetadata(
26 LLVMContext &Ctx = Header->getContext();
28 SmallVector<Metadata *, 4> Args;
29 Args.push_back(MDString::get(Ctx, FollowupName));
30 Args.append(LoopProperties.begin(), LoopProperties.end());
31 return MDNode::get(Ctx, Args);
34SmallVector<Metadata *, 4> clang::CodeGen::LoopInfo::createPipeliningMetadata(
36 bool &HasUserTransforms) {
37 LLVMContext &Ctx = Header->getContext();
39 std::optional<bool> Enabled;
45 SmallVector<Metadata *, 4> Args;
46 Args.append(LoopProperties.begin(), LoopProperties.end());
48 if (Enabled !=
true) {
49 if (Enabled ==
false) {
51 MDNode::get(Ctx, {MDString::get(Ctx,
"llvm.loop.pipeline.disable"),
52 ConstantAsMetadata::get(ConstantInt::get(
53 llvm::Type::getInt1Ty(Ctx), 1))}));
60 MDString::get(Ctx,
"llvm.loop.pipeline.initiationinterval"),
61 ConstantAsMetadata::get(ConstantInt::get(
63 Args.push_back(MDNode::get(Ctx, Vals));
68 HasUserTransforms =
true;
72SmallVector<Metadata *, 4>
73clang::CodeGen::LoopInfo::createPartialUnrollMetadata(
75 bool &HasUserTransforms) {
76 LLVMContext &Ctx = Header->getContext();
78 std::optional<bool> Enabled;
82 Enabled = std::nullopt;
87 if (Enabled !=
true) {
90 return createPipeliningMetadata(Attrs, LoopProperties, HasUserTransforms);
93 SmallVector<Metadata *, 4> FollowupLoopProperties;
96 FollowupLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
99 FollowupLoopProperties.push_back(
100 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.unroll.disable")));
102 bool FollowupHasTransforms =
false;
103 SmallVector<Metadata *, 4> Followup = createPipeliningMetadata(
104 Attrs, FollowupLoopProperties, FollowupHasTransforms);
106 SmallVector<Metadata *, 4> Args;
107 Args.append(LoopProperties.begin(), LoopProperties.end());
111 Metadata *Vals[] = {MDString::get(Ctx,
"llvm.loop.unroll.count"),
112 ConstantAsMetadata::get(ConstantInt::get(
114 Args.push_back(MDNode::get(Ctx, Vals));
119 Metadata *Vals[] = {MDString::get(Ctx,
"llvm.loop.unroll.enable")};
120 Args.push_back(MDNode::get(Ctx, Vals));
123 if (FollowupHasTransforms)
125 createFollowupMetadata(
"llvm.loop.unroll.followup_all", Followup));
127 HasUserTransforms =
true;
131SmallVector<Metadata *, 4> clang::CodeGen::LoopInfo::createUnrollAndJamMetadata(
133 bool &HasUserTransforms) {
134 LLVMContext &Ctx = Header->getContext();
136 std::optional<bool> Enabled;
143 if (Enabled !=
true) {
144 SmallVector<Metadata *, 4> NewLoopProperties;
145 if (Enabled ==
false) {
146 NewLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
147 NewLoopProperties.push_back(MDNode::get(
148 Ctx, MDString::get(Ctx,
"llvm.loop.unroll_and_jam.disable")));
149 LoopProperties = NewLoopProperties;
151 return createPartialUnrollMetadata(Attrs, LoopProperties,
155 SmallVector<Metadata *, 4> FollowupLoopProperties;
156 FollowupLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
157 FollowupLoopProperties.push_back(
158 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.unroll_and_jam.disable")));
160 bool FollowupHasTransforms =
false;
161 SmallVector<Metadata *, 4> Followup = createPartialUnrollMetadata(
162 Attrs, FollowupLoopProperties, FollowupHasTransforms);
164 SmallVector<Metadata *, 4> Args;
165 Args.append(LoopProperties.begin(), LoopProperties.end());
170 MDString::get(Ctx,
"llvm.loop.unroll_and_jam.count"),
171 ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt32Ty(Ctx),
173 Args.push_back(MDNode::get(Ctx, Vals));
177 Metadata *Vals[] = {MDString::get(Ctx,
"llvm.loop.unroll_and_jam.enable")};
178 Args.push_back(MDNode::get(Ctx, Vals));
181 if (FollowupHasTransforms)
182 Args.push_back(createFollowupMetadata(
183 "llvm.loop.unroll_and_jam.followup_outer", Followup));
185 if (UnrollAndJamInnerFollowup.has_value())
186 Args.push_back(createFollowupMetadata(
187 "llvm.loop.unroll_and_jam.followup_inner", *UnrollAndJamInnerFollowup));
189 HasUserTransforms =
true;
193SmallVector<Metadata *, 4>
194clang::CodeGen::LoopInfo::createLoopVectorizeMetadata(
196 bool &HasUserTransforms) {
197 LLVMContext &Ctx = Header->getContext();
199 std::optional<bool> Enabled;
208 if (Enabled !=
true) {
209 SmallVector<Metadata *, 4> NewLoopProperties;
210 if (Enabled ==
false) {
211 NewLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
212 NewLoopProperties.push_back(
213 MDNode::get(Ctx, {MDString::get(Ctx,
"llvm.loop.vectorize.enable"),
214 ConstantAsMetadata::get(ConstantInt::get(
215 llvm::Type::getInt1Ty(Ctx), 0))}));
216 LoopProperties = NewLoopProperties;
218 return createUnrollAndJamMetadata(Attrs, LoopProperties, HasUserTransforms);
221 SmallVector<Metadata *, 4> Args;
222 Args.append(LoopProperties.begin(), LoopProperties.end());
226 bool IsVectorPredicateEnabled =
false;
228 IsVectorPredicateEnabled =
232 MDString::get(Ctx,
"llvm.loop.vectorize.predicate.enable"),
233 ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt1Ty(Ctx),
234 IsVectorPredicateEnabled))};
235 Args.push_back(MDNode::get(Ctx, Vals));
241 MDString::get(Ctx,
"llvm.loop.vectorize.width"),
242 ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt32Ty(Ctx),
245 Args.push_back(MDNode::get(Ctx, Vals));
251 MDString::get(Ctx,
"llvm.loop.vectorize.scalable.enable"),
252 ConstantAsMetadata::get(
253 ConstantInt::get(llvm::Type::getInt1Ty(Ctx), IsScalable))};
254 Args.push_back(MDNode::get(Ctx, Vals));
260 MDString::get(Ctx,
"llvm.loop.interleave.count"),
261 ConstantAsMetadata::get(ConstantInt::get(llvm::Type::getInt32Ty(Ctx),
263 Args.push_back(MDNode::get(Ctx, Vals));
274 bool VectorizeEnabled =
false;
283 MDNode::get(Ctx, {MDString::get(Ctx,
"llvm.loop.vectorize.enable"),
284 ConstantAsMetadata::get(ConstantInt::get(
285 llvm::Type::getInt1Ty(Ctx), VectorizeEnabled))}));
289 SmallVector<Metadata *, 4> FollowupLoopProperties;
294 if (VectorizeEnabled)
295 FollowupLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
298 FollowupLoopProperties.push_back(
299 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.isvectorized")));
301 bool FollowupHasTransforms =
false;
302 SmallVector<Metadata *, 4> Followup = createUnrollAndJamMetadata(
303 Attrs, FollowupLoopProperties, FollowupHasTransforms);
305 if (FollowupHasTransforms) {
308 if (VectorizeEnabled)
310 createFollowupMetadata(
"llvm.loop.vectorize.followup_all", Followup));
312 Args.append(Followup.begin(), Followup.end());
315 HasUserTransforms =
true;
319SmallVector<Metadata *, 4>
320clang::CodeGen::LoopInfo::createLoopDistributeMetadata(
322 bool &HasUserTransforms) {
323 LLVMContext &Ctx = Header->getContext();
325 std::optional<bool> Enabled;
331 if (Enabled !=
true) {
332 SmallVector<Metadata *, 4> NewLoopProperties;
333 if (Enabled ==
false) {
334 NewLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
335 NewLoopProperties.push_back(
336 MDNode::get(Ctx, {MDString::get(Ctx,
"llvm.loop.distribute.enable"),
337 ConstantAsMetadata::get(ConstantInt::get(
338 llvm::Type::getInt1Ty(Ctx), 0))}));
339 LoopProperties = NewLoopProperties;
341 return createLoopVectorizeMetadata(Attrs, LoopProperties,
345 bool FollowupHasTransforms =
false;
346 SmallVector<Metadata *, 4> Followup =
347 createLoopVectorizeMetadata(Attrs, LoopProperties, FollowupHasTransforms);
349 SmallVector<Metadata *, 4> Args;
350 Args.append(LoopProperties.begin(), LoopProperties.end());
352 Metadata *Vals[] = {MDString::get(Ctx,
"llvm.loop.distribute.enable"),
353 ConstantAsMetadata::get(ConstantInt::get(
354 llvm::Type::getInt1Ty(Ctx),
356 Args.push_back(MDNode::get(Ctx, Vals));
358 if (FollowupHasTransforms)
360 createFollowupMetadata(
"llvm.loop.distribute.followup_all", Followup));
362 HasUserTransforms =
true;
366SmallVector<Metadata *, 4> clang::CodeGen::LoopInfo::createFullUnrollMetadata(
368 bool &HasUserTransforms) {
369 LLVMContext &Ctx = Header->getContext();
371 std::optional<bool> Enabled;
377 if (Enabled !=
true) {
378 SmallVector<Metadata *, 4> NewLoopProperties;
379 if (Enabled ==
false) {
380 NewLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
381 NewLoopProperties.push_back(
382 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.unroll.disable")));
383 LoopProperties = NewLoopProperties;
385 return createLoopDistributeMetadata(Attrs, LoopProperties,
389 SmallVector<Metadata *, 4> Args;
390 Args.append(LoopProperties.begin(), LoopProperties.end());
391 Args.push_back(MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.unroll.full")));
396 HasUserTransforms =
true;
400SmallVector<Metadata *, 4> clang::CodeGen::LoopInfo::createMetadata(
402 llvm::ArrayRef<llvm::Metadata *> AdditionalLoopProperties,
403 bool &HasUserTransforms) {
404 SmallVector<Metadata *, 3> LoopProperties;
408 LoopProperties.push_back(StartLoc.getAsMDNode());
412 LoopProperties.push_back(EndLoc.getAsMDNode());
415 LLVMContext &Ctx = Header->getContext();
417 LoopProperties.push_back(
418 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.mustprogress")));
421 LoopProperties.push_back(
422 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.licm.disable")));
425 "There must be an access group iff the loop is parallel");
427 LoopProperties.push_back(MDNode::get(
428 Ctx, {MDString::get(Ctx,
"llvm.loop.parallel_accesses"), AccGroup}));
433 Metadata *Vals[] = {MDString::get(Ctx,
"llvm.loop.align"),
434 ConstantAsMetadata::get(ConstantInt::get(
435 llvm::Type::getInt32Ty(Ctx), Attrs.
CodeAlign))};
436 LoopProperties.push_back(MDNode::get(Ctx, Vals));
439 llvm::append_range(LoopProperties, AdditionalLoopProperties);
440 return createFullUnrollMetadata(Attrs, LoopProperties, HasUserTransforms);
475 const llvm::DebugLoc &StartLoc,
476 const llvm::DebugLoc &EndLoc,
478 : Header(Header), Attrs(Attrs), StartLoc(StartLoc), EndLoc(EndLoc),
481 if (Attrs.IsParallel) {
483 LLVMContext &Ctx = Header->getContext();
484 AccGroup = MDNode::getDistinct(Ctx, {});
500 TempLoopID = MDNode::getTemporary(Header->getContext(), {});
511 LLVMContext &Ctx = Header->getContext();
513 if (Parent && (Parent->Attrs.UnrollAndJamEnable ||
514 Parent->Attrs.UnrollAndJamCount != 0)) {
531 switch (Attrs.UnrollEnable) {
560 if (!Parent->UnrollAndJamInnerFollowup) {
570 BeforeLoopProperties.push_back(
571 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.isvectorized")));
573 bool InnerFollowupHasTransform =
false;
575 AfterJam, BeforeLoopProperties, InnerFollowupHasTransform);
576 if (InnerFollowupHasTransform)
577 Parent->UnrollAndJamInnerFollowup = InnerFollowup;
580 CurLoopAttr = BeforeJam;
583 bool HasUserTransforms =
false;
585 createMetadata(CurLoopAttr, {}, HasUserTransforms);
587 Args.push_back(
nullptr);
588 Args.append(Properties.begin(), Properties.end());
589 LoopID = MDNode::getDistinct(Ctx, Args);
590 LoopID->replaceOperandWith(0, LoopID);
592 TempLoopID->replaceAllUsesWith(LoopID);
596 const llvm::DebugLoc &EndLoc) {
598 new LoopInfo(Header, StagedAttrs, StartLoc, EndLoc,
599 Active.empty() ?
nullptr : Active.back().get()));
607 const llvm::DebugLoc &StartLoc,
608 const llvm::DebugLoc &EndLoc,
bool MustProgress) {
610 for (
const auto *
Attr : Attrs) {
611 const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(
Attr);
612 const OpenCLUnrollHintAttr *OpenCLHint =
613 dyn_cast<OpenCLUnrollHintAttr>(
Attr);
614 const HLSLLoopHintAttr *HLSLLoopHint = dyn_cast<HLSLLoopHintAttr>(
Attr);
616 if (!LH && !OpenCLHint && !HLSLLoopHint) {
620 LoopHintAttr::OptionType Option = LoopHintAttr::Unroll;
621 LoopHintAttr::LoopHintState State = LoopHintAttr::Disable;
622 unsigned ValueInt = 1;
630 ValueInt = OpenCLHint->getUnrollHint();
632 State = LoopHintAttr::Enable;
633 }
else if (ValueInt != 1) {
634 Option = LoopHintAttr::UnrollCount;
635 State = LoopHintAttr::Numeric;
637 }
else if (HLSLLoopHint) {
638 ValueInt = HLSLLoopHint->getDirective();
639 if (HLSLLoopHint->getSemanticSpelling() ==
640 HLSLLoopHintAttr::Spelling::Microsoft_unroll) {
642 State = LoopHintAttr::Enable;
644 Option = LoopHintAttr::UnrollCount;
645 State = LoopHintAttr::Numeric;
649 auto *ValueExpr = LH->getValue();
651 llvm::APSInt ValueAPS = ValueExpr->EvaluateKnownConstInt(Ctx);
652 ValueInt = ValueAPS.getSExtValue();
655 Option = LH->getOption();
656 State = LH->getState();
659 case LoopHintAttr::Disable:
661 case LoopHintAttr::Vectorize:
666 case LoopHintAttr::Interleave:
670 case LoopHintAttr::Unroll:
673 case LoopHintAttr::UnrollAndJam:
676 case LoopHintAttr::VectorizePredicate:
679 case LoopHintAttr::Distribute:
682 case LoopHintAttr::PipelineDisabled:
685 case LoopHintAttr::LICMDisabled:
688 case LoopHintAttr::UnrollCount:
689 case LoopHintAttr::UnrollAndJamCount:
690 case LoopHintAttr::VectorizeWidth:
691 case LoopHintAttr::InterleaveCount:
692 case LoopHintAttr::PipelineInitiationInterval:
693 llvm_unreachable(
"Options cannot be disabled.");
697 case LoopHintAttr::Enable:
699 case LoopHintAttr::Vectorize:
700 case LoopHintAttr::Interleave:
703 case LoopHintAttr::Unroll:
706 case LoopHintAttr::UnrollAndJam:
709 case LoopHintAttr::VectorizePredicate:
712 case LoopHintAttr::Distribute:
715 case LoopHintAttr::UnrollCount:
716 case LoopHintAttr::UnrollAndJamCount:
717 case LoopHintAttr::VectorizeWidth:
718 case LoopHintAttr::InterleaveCount:
719 case LoopHintAttr::PipelineDisabled:
720 case LoopHintAttr::PipelineInitiationInterval:
721 case LoopHintAttr::LICMDisabled:
722 llvm_unreachable(
"Options cannot enabled.");
726 case LoopHintAttr::AssumeSafety:
728 case LoopHintAttr::Vectorize:
729 case LoopHintAttr::Interleave:
734 case LoopHintAttr::Unroll:
735 case LoopHintAttr::UnrollAndJam:
736 case LoopHintAttr::VectorizePredicate:
737 case LoopHintAttr::UnrollCount:
738 case LoopHintAttr::UnrollAndJamCount:
739 case LoopHintAttr::VectorizeWidth:
740 case LoopHintAttr::InterleaveCount:
741 case LoopHintAttr::Distribute:
742 case LoopHintAttr::PipelineDisabled:
743 case LoopHintAttr::PipelineInitiationInterval:
744 case LoopHintAttr::LICMDisabled:
745 llvm_unreachable(
"Options cannot be used to assume mem safety.");
749 case LoopHintAttr::Full:
751 case LoopHintAttr::Unroll:
754 case LoopHintAttr::UnrollAndJam:
757 case LoopHintAttr::Vectorize:
758 case LoopHintAttr::Interleave:
759 case LoopHintAttr::UnrollCount:
760 case LoopHintAttr::UnrollAndJamCount:
761 case LoopHintAttr::VectorizeWidth:
762 case LoopHintAttr::InterleaveCount:
763 case LoopHintAttr::Distribute:
764 case LoopHintAttr::PipelineDisabled:
765 case LoopHintAttr::PipelineInitiationInterval:
766 case LoopHintAttr::VectorizePredicate:
767 case LoopHintAttr::LICMDisabled:
768 llvm_unreachable(
"Options cannot be used with 'full' hint.");
772 case LoopHintAttr::FixedWidth:
773 case LoopHintAttr::ScalableWidth:
775 case LoopHintAttr::VectorizeWidth:
783 llvm_unreachable(
"Options cannot be used with 'scalable' hint.");
787 case LoopHintAttr::Numeric:
789 case LoopHintAttr::InterleaveCount:
792 case LoopHintAttr::UnrollCount:
795 case LoopHintAttr::UnrollAndJamCount:
798 case LoopHintAttr::PipelineInitiationInterval:
801 case LoopHintAttr::Unroll:
802 case LoopHintAttr::UnrollAndJam:
803 case LoopHintAttr::VectorizePredicate:
804 case LoopHintAttr::Vectorize:
805 case LoopHintAttr::VectorizeWidth:
806 case LoopHintAttr::Interleave:
807 case LoopHintAttr::Distribute:
808 case LoopHintAttr::PipelineDisabled:
809 case LoopHintAttr::LICMDisabled:
810 llvm_unreachable(
"Options cannot be assigned a value.");
822 llvm::APSInt ArgVal = CE->getResultAsAPSInt();
828 if (CGOpts.OptimizationLevel > 0)
831 if (!CGOpts.UnrollLoops &&
833 StagedAttrs.UnrollCount == 0))
837 push(Header, StartLoc, EndLoc);
841 assert(!Active.empty() &&
"No active loops to pop");
842 Active.back()->finish();
847 if (I->mayReadOrWriteMemory()) {
849 for (
const auto &AL : Active) {
851 if (MDNode *Group = AL->getAccessGroup())
852 AccessGroups.push_back(Group);
854 MDNode *UnionMD =
nullptr;
855 if (AccessGroups.size() == 1)
857 else if (AccessGroups.size() >= 2)
858 UnionMD = MDNode::get(I->getContext(), AccessGroups);
859 I->setMetadata(
"llvm.access.group", UnionMD);
869 if (I->isTerminator()) {
870 for (BasicBlock *Succ : successors(I))
872 I->setMetadata(llvm::LLVMContext::MD_loop, L.
getLoopID());
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Attr - This represents one attribute.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
void setPipelineDisabled(bool S)
Set the pipeline disabled state.
void setUnrollCount(unsigned C)
Set the unroll count for the next loop pushed.
bool hasInfo() const
Returns true if there is LoopInfo on the stack.
void setVectorizeWidth(unsigned W)
Set the vectorize width for the next loop pushed.
void InsertHelper(llvm::Instruction *I) const
Function called by the CodeGenFunction when an instruction is created.
void setDistributeState(bool Enable=true)
Set the next pushed loop as a distribution candidate.
void setParallel(bool Enable=true)
Set the next pushed loop as parallel.
void setInterleaveCount(unsigned C)
Set the interleave count for the next loop pushed.
void setUnrollState(const LoopAttributes::LVEnableState &State)
Set the next pushed loop unroll state.
void setVectorizeScalable(const LoopAttributes::LVEnableState &State)
void setVectorizePredicateState(const LoopAttributes::LVEnableState &State)
Set the next pushed vectorize predicate state.
void pop()
End the current loop.
void setCodeAlign(unsigned C)
Set value of code align for the next loop pushed.
void setLICMDisabled(bool Disabled=true)
Set the next pushed loop LICM disable state.
void push(llvm::BasicBlock *Header, const llvm::DebugLoc &StartLoc, const llvm::DebugLoc &EndLoc)
Begin a new structured loop.
void setMustProgress(bool P)
Set no progress for the next loop pushed.
void setUnrollAndJamState(const LoopAttributes::LVEnableState &State)
Set the next pushed loop unroll_and_jam state.
void setUnrollAndJamCount(unsigned C)
Set the unroll count for the next loop pushed.
const LoopInfo & getInfo() const
Return the LoopInfo for the current loop.
void setPipelineInitiationInterval(unsigned C)
Set the pipeline initiation interval.
void setVectorizeEnable(bool Enable=true)
Set the next pushed loop 'vectorize.enable'.
Information used when generating a structured loop.
void finish()
Create the loop's metadata.
llvm::BasicBlock * getHeader() const
Get the header block of this loop.
LoopInfo(llvm::BasicBlock *Header, const LoopAttributes &Attrs, const llvm::DebugLoc &StartLoc, const llvm::DebugLoc &EndLoc, LoopInfo *Parent)
Construct a new LoopInfo for the loop with entry Header.
llvm::MDNode * getLoopID() const
Get the loop id metadata for this loop.
auto * getSpecificAttr(const Container &container)
U cast(CodeGen::Address addr)
Diagnostic wrappers for TextAPI types for error reporting.
Attributes that may be specified on loops.
unsigned UnrollCount
llvm.unroll.
bool MustProgress
Value for whether the loop is required to make progress.
unsigned InterleaveCount
Value for llvm.loop.interleave.count metadata.
LoopAttributes(bool IsParallel=false)
bool IsParallel
Generate llvm.loop.parallel metadata for loads and stores.
bool LICMDisabled
Value for llvm.licm.disable metadata.
LVEnableState VectorizeScalable
LVEnableState UnrollAndJamEnable
Value for llvm.loop.unroll_and_jam.* metadata (enable, disable, or full).
unsigned UnrollAndJamCount
llvm.unroll.
LVEnableState VectorizePredicateEnable
Value for llvm.loop.vectorize.predicate metadata.
LVEnableState DistributeEnable
Value for llvm.loop.distribute.enable metadata.
bool PipelineDisabled
Value for llvm.loop.pipeline.disable metadata.
unsigned CodeAlign
Value for 'llvm.loop.align' metadata.
LVEnableState UnrollEnable
Value for llvm.loop.unroll.* metadata (enable, disable, or full).
unsigned VectorizeWidth
Value for llvm.loop.vectorize.width metadata.
unsigned PipelineInitiationInterval
Value for llvm.loop.pipeline.iicount metadata.
LVEnableState VectorizeEnable
Value for llvm.loop.vectorize.enable metadata.