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(MDNode::get(
336 Ctx, {MDString::get(Ctx,
"llvm.loop.distribute.disable")}));
337 LoopProperties = NewLoopProperties;
339 return createLoopVectorizeMetadata(Attrs, LoopProperties,
343 bool FollowupHasTransforms =
false;
344 SmallVector<Metadata *, 4> Followup =
345 createLoopVectorizeMetadata(Attrs, LoopProperties, FollowupHasTransforms);
347 SmallVector<Metadata *, 4> Args;
348 Args.append(LoopProperties.begin(), LoopProperties.end());
351 MDNode::get(Ctx, {MDString::get(Ctx,
"llvm.loop.distribute.enable")}));
353 if (FollowupHasTransforms)
355 createFollowupMetadata(
"llvm.loop.distribute.followup_all", Followup));
357 HasUserTransforms =
true;
361SmallVector<Metadata *, 4> clang::CodeGen::LoopInfo::createFullUnrollMetadata(
363 bool &HasUserTransforms) {
364 LLVMContext &Ctx = Header->getContext();
366 std::optional<bool> Enabled;
372 if (Enabled !=
true) {
373 SmallVector<Metadata *, 4> NewLoopProperties;
374 if (Enabled ==
false) {
375 NewLoopProperties.append(LoopProperties.begin(), LoopProperties.end());
376 NewLoopProperties.push_back(
377 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.unroll.disable")));
378 LoopProperties = NewLoopProperties;
380 return createLoopDistributeMetadata(Attrs, LoopProperties,
384 SmallVector<Metadata *, 4> Args;
385 Args.append(LoopProperties.begin(), LoopProperties.end());
386 Args.push_back(MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.unroll.full")));
391 HasUserTransforms =
true;
395SmallVector<Metadata *, 4> clang::CodeGen::LoopInfo::createMetadata(
397 llvm::ArrayRef<llvm::Metadata *> AdditionalLoopProperties,
398 bool &HasUserTransforms) {
399 SmallVector<Metadata *, 3> LoopProperties;
403 LoopProperties.push_back(StartLoc.getAsMDNode());
407 LoopProperties.push_back(EndLoc.getAsMDNode());
410 LLVMContext &Ctx = Header->getContext();
412 LoopProperties.push_back(
413 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.mustprogress")));
416 LoopProperties.push_back(
417 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.licm.disable")));
420 "There must be an access group iff the loop is parallel");
422 LoopProperties.push_back(MDNode::get(
423 Ctx, {MDString::get(Ctx,
"llvm.loop.parallel_accesses"), AccGroup}));
428 Metadata *Vals[] = {MDString::get(Ctx,
"llvm.loop.align"),
429 ConstantAsMetadata::get(ConstantInt::get(
430 llvm::Type::getInt32Ty(Ctx), Attrs.
CodeAlign))};
431 LoopProperties.push_back(MDNode::get(Ctx, Vals));
434 llvm::append_range(LoopProperties, AdditionalLoopProperties);
435 return createFullUnrollMetadata(Attrs, LoopProperties, HasUserTransforms);
470 const llvm::DebugLoc &StartLoc,
471 const llvm::DebugLoc &EndLoc,
473 : Header(Header), Attrs(Attrs), StartLoc(StartLoc), EndLoc(EndLoc),
476 if (Attrs.IsParallel) {
478 LLVMContext &Ctx = Header->getContext();
479 AccGroup = MDNode::getDistinct(Ctx, {});
495 TempLoopID = MDNode::getTemporary(Header->getContext(), {});
506 LLVMContext &Ctx = Header->getContext();
508 if (Parent && (Parent->Attrs.UnrollAndJamEnable ||
509 Parent->Attrs.UnrollAndJamCount != 0)) {
526 switch (Attrs.UnrollEnable) {
555 if (!Parent->UnrollAndJamInnerFollowup) {
565 BeforeLoopProperties.push_back(
566 MDNode::get(Ctx, MDString::get(Ctx,
"llvm.loop.isvectorized")));
568 bool InnerFollowupHasTransform =
false;
570 AfterJam, BeforeLoopProperties, InnerFollowupHasTransform);
571 if (InnerFollowupHasTransform)
572 Parent->UnrollAndJamInnerFollowup = InnerFollowup;
575 CurLoopAttr = BeforeJam;
578 bool HasUserTransforms =
false;
580 createMetadata(CurLoopAttr, {}, HasUserTransforms);
582 Args.push_back(
nullptr);
583 Args.append(Properties.begin(), Properties.end());
584 LoopID = MDNode::getDistinct(Ctx, Args);
585 LoopID->replaceOperandWith(0, LoopID);
587 TempLoopID->replaceAllUsesWith(LoopID);
591 const llvm::DebugLoc &EndLoc) {
593 new LoopInfo(Header, StagedAttrs, StartLoc, EndLoc,
594 Active.empty() ?
nullptr : Active.back().get()));
602 const llvm::DebugLoc &StartLoc,
603 const llvm::DebugLoc &EndLoc,
bool MustProgress) {
605 for (
const auto *
Attr : Attrs) {
606 const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(
Attr);
607 const OpenCLUnrollHintAttr *OpenCLHint =
608 dyn_cast<OpenCLUnrollHintAttr>(
Attr);
609 const HLSLLoopHintAttr *HLSLLoopHint = dyn_cast<HLSLLoopHintAttr>(
Attr);
611 if (!LH && !OpenCLHint && !HLSLLoopHint) {
615 LoopHintAttr::OptionType Option = LoopHintAttr::Unroll;
616 LoopHintAttr::LoopHintState State = LoopHintAttr::Disable;
617 unsigned ValueInt = 1;
625 ValueInt = OpenCLHint->getUnrollHint();
627 State = LoopHintAttr::Enable;
628 }
else if (ValueInt != 1) {
629 Option = LoopHintAttr::UnrollCount;
630 State = LoopHintAttr::Numeric;
632 }
else if (HLSLLoopHint) {
633 ValueInt = HLSLLoopHint->getDirective();
634 if (HLSLLoopHint->getSemanticSpelling() ==
635 HLSLLoopHintAttr::Spelling::Microsoft_unroll) {
637 State = LoopHintAttr::Enable;
639 Option = LoopHintAttr::UnrollCount;
640 State = LoopHintAttr::Numeric;
644 auto *ValueExpr = LH->getValue();
646 llvm::APSInt ValueAPS = ValueExpr->EvaluateKnownConstInt(Ctx);
647 ValueInt = ValueAPS.getSExtValue();
650 Option = LH->getOption();
651 State = LH->getState();
654 case LoopHintAttr::Disable:
656 case LoopHintAttr::Vectorize:
661 case LoopHintAttr::Interleave:
665 case LoopHintAttr::Unroll:
668 case LoopHintAttr::UnrollAndJam:
671 case LoopHintAttr::VectorizePredicate:
674 case LoopHintAttr::Distribute:
677 case LoopHintAttr::PipelineDisabled:
680 case LoopHintAttr::LICMDisabled:
683 case LoopHintAttr::UnrollCount:
684 case LoopHintAttr::UnrollAndJamCount:
685 case LoopHintAttr::VectorizeWidth:
686 case LoopHintAttr::InterleaveCount:
687 case LoopHintAttr::PipelineInitiationInterval:
688 llvm_unreachable(
"Options cannot be disabled.");
692 case LoopHintAttr::Enable:
694 case LoopHintAttr::Vectorize:
695 case LoopHintAttr::Interleave:
698 case LoopHintAttr::Unroll:
701 case LoopHintAttr::UnrollAndJam:
704 case LoopHintAttr::VectorizePredicate:
707 case LoopHintAttr::Distribute:
710 case LoopHintAttr::UnrollCount:
711 case LoopHintAttr::UnrollAndJamCount:
712 case LoopHintAttr::VectorizeWidth:
713 case LoopHintAttr::InterleaveCount:
714 case LoopHintAttr::PipelineDisabled:
715 case LoopHintAttr::PipelineInitiationInterval:
716 case LoopHintAttr::LICMDisabled:
717 llvm_unreachable(
"Options cannot enabled.");
721 case LoopHintAttr::AssumeSafety:
723 case LoopHintAttr::Vectorize:
724 case LoopHintAttr::Interleave:
729 case LoopHintAttr::Unroll:
730 case LoopHintAttr::UnrollAndJam:
731 case LoopHintAttr::VectorizePredicate:
732 case LoopHintAttr::UnrollCount:
733 case LoopHintAttr::UnrollAndJamCount:
734 case LoopHintAttr::VectorizeWidth:
735 case LoopHintAttr::InterleaveCount:
736 case LoopHintAttr::Distribute:
737 case LoopHintAttr::PipelineDisabled:
738 case LoopHintAttr::PipelineInitiationInterval:
739 case LoopHintAttr::LICMDisabled:
740 llvm_unreachable(
"Options cannot be used to assume mem safety.");
744 case LoopHintAttr::Full:
746 case LoopHintAttr::Unroll:
749 case LoopHintAttr::UnrollAndJam:
752 case LoopHintAttr::Vectorize:
753 case LoopHintAttr::Interleave:
754 case LoopHintAttr::UnrollCount:
755 case LoopHintAttr::UnrollAndJamCount:
756 case LoopHintAttr::VectorizeWidth:
757 case LoopHintAttr::InterleaveCount:
758 case LoopHintAttr::Distribute:
759 case LoopHintAttr::PipelineDisabled:
760 case LoopHintAttr::PipelineInitiationInterval:
761 case LoopHintAttr::VectorizePredicate:
762 case LoopHintAttr::LICMDisabled:
763 llvm_unreachable(
"Options cannot be used with 'full' hint.");
767 case LoopHintAttr::FixedWidth:
768 case LoopHintAttr::ScalableWidth:
770 case LoopHintAttr::VectorizeWidth:
778 llvm_unreachable(
"Options cannot be used with 'scalable' hint.");
782 case LoopHintAttr::Numeric:
784 case LoopHintAttr::InterleaveCount:
787 case LoopHintAttr::UnrollCount:
790 case LoopHintAttr::UnrollAndJamCount:
793 case LoopHintAttr::PipelineInitiationInterval:
796 case LoopHintAttr::Unroll:
797 case LoopHintAttr::UnrollAndJam:
798 case LoopHintAttr::VectorizePredicate:
799 case LoopHintAttr::Vectorize:
800 case LoopHintAttr::VectorizeWidth:
801 case LoopHintAttr::Interleave:
802 case LoopHintAttr::Distribute:
803 case LoopHintAttr::PipelineDisabled:
804 case LoopHintAttr::LICMDisabled:
805 llvm_unreachable(
"Options cannot be assigned a value.");
817 llvm::APSInt ArgVal = CE->getResultAsAPSInt();
823 if (CGOpts.OptimizationLevel > 0)
826 if (!CGOpts.UnrollLoops &&
828 StagedAttrs.UnrollCount == 0))
832 push(Header, StartLoc, EndLoc);
836 assert(!Active.empty() &&
"No active loops to pop");
837 Active.back()->finish();
842 if (I->mayReadOrWriteMemory()) {
844 for (
const auto &AL : Active) {
846 if (MDNode *Group = AL->getAccessGroup())
847 AccessGroups.push_back(Group);
849 MDNode *UnionMD =
nullptr;
850 if (AccessGroups.size() == 1)
852 else if (AccessGroups.size() >= 2)
853 UnionMD = MDNode::get(I->getContext(), AccessGroups);
854 I->setMetadata(
"llvm.access.group", UnionMD);
864 if (I->isTerminator()) {
865 for (BasicBlock *Succ : successors(I))
867 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.