53 for (
const auto *
Attr : StmtAttrs) {
54 const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(
Attr);
55 const OpenCLUnrollHintAttr *OpenCLHint =
56 dyn_cast<OpenCLUnrollHintAttr>(
Attr);
57 const HLSLLoopHintAttr *HLSLLoopHint = dyn_cast<HLSLLoopHintAttr>(
Attr);
59 if (!LH && !OpenCLHint && !HLSLLoopHint) {
63 LoopHintAttr::OptionType Option = LoopHintAttr::Unroll;
64 LoopHintAttr::LoopHintState State = LoopHintAttr::Disable;
65 unsigned ValueInt = 1;
73 ValueInt = OpenCLHint->getUnrollHint();
75 State = LoopHintAttr::Enable;
76 }
else if (ValueInt != 1) {
77 Option = LoopHintAttr::UnrollCount;
78 State = LoopHintAttr::Numeric;
80 }
else if (HLSLLoopHint) {
81 ValueInt = HLSLLoopHint->getDirective();
82 if (HLSLLoopHint->getSemanticSpelling() ==
83 HLSLLoopHintAttr::Spelling::Microsoft_unroll) {
85 State = LoopHintAttr::Enable;
87 Option = LoopHintAttr::UnrollCount;
88 State = LoopHintAttr::Numeric;
92 auto *ValueExpr = LH->getValue();
94 llvm::APSInt ValueAPS = ValueExpr->EvaluateKnownConstInt(Ctx);
95 ValueInt = ValueAPS.getSExtValue();
98 Option = LH->getOption();
99 State = LH->getState();
102 case LoopHintAttr::Disable:
104 case LoopHintAttr::Vectorize:
110 case LoopHintAttr::Interleave:
114 case LoopHintAttr::Unroll:
117 case LoopHintAttr::UnrollAndJam:
120 case LoopHintAttr::VectorizePredicate:
123 case LoopHintAttr::Distribute:
126 case LoopHintAttr::PipelineDisabled:
129 case LoopHintAttr::LICMDisabled:
132 case LoopHintAttr::UnrollCount:
133 case LoopHintAttr::UnrollAndJamCount:
134 case LoopHintAttr::VectorizeWidth:
135 case LoopHintAttr::InterleaveCount:
136 case LoopHintAttr::PipelineInitiationInterval:
137 llvm_unreachable(
"Options cannot be disabled.");
141 case LoopHintAttr::Enable:
143 case LoopHintAttr::Vectorize:
144 case LoopHintAttr::Interleave:
147 case LoopHintAttr::Unroll:
150 case LoopHintAttr::UnrollAndJam:
153 case LoopHintAttr::VectorizePredicate:
156 case LoopHintAttr::Distribute:
159 case LoopHintAttr::UnrollCount:
160 case LoopHintAttr::UnrollAndJamCount:
161 case LoopHintAttr::VectorizeWidth:
162 case LoopHintAttr::InterleaveCount:
163 case LoopHintAttr::PipelineDisabled:
164 case LoopHintAttr::PipelineInitiationInterval:
165 case LoopHintAttr::LICMDisabled:
166 llvm_unreachable(
"Options cannot enabled.");
170 case LoopHintAttr::AssumeSafety:
172 case LoopHintAttr::Vectorize:
173 case LoopHintAttr::Interleave:
178 case LoopHintAttr::Unroll:
179 case LoopHintAttr::UnrollAndJam:
180 case LoopHintAttr::VectorizePredicate:
181 case LoopHintAttr::UnrollCount:
182 case LoopHintAttr::UnrollAndJamCount:
183 case LoopHintAttr::VectorizeWidth:
184 case LoopHintAttr::InterleaveCount:
185 case LoopHintAttr::Distribute:
186 case LoopHintAttr::PipelineDisabled:
187 case LoopHintAttr::PipelineInitiationInterval:
188 case LoopHintAttr::LICMDisabled:
189 llvm_unreachable(
"Options cannot be used to assume mem safety.");
193 case LoopHintAttr::Full:
195 case LoopHintAttr::Unroll:
198 case LoopHintAttr::UnrollAndJam:
201 case LoopHintAttr::Vectorize:
202 case LoopHintAttr::Interleave:
203 case LoopHintAttr::UnrollCount:
204 case LoopHintAttr::UnrollAndJamCount:
205 case LoopHintAttr::VectorizeWidth:
206 case LoopHintAttr::InterleaveCount:
207 case LoopHintAttr::Distribute:
208 case LoopHintAttr::PipelineDisabled:
209 case LoopHintAttr::PipelineInitiationInterval:
210 case LoopHintAttr::VectorizePredicate:
211 case LoopHintAttr::LICMDisabled:
212 llvm_unreachable(
"Options cannot be used with 'full' hint.");
216 case LoopHintAttr::FixedWidth:
217 case LoopHintAttr::ScalableWidth:
219 case LoopHintAttr::VectorizeWidth:
227 llvm_unreachable(
"Options cannot be used with 'scalable' hint.");
231 case LoopHintAttr::Numeric:
233 case LoopHintAttr::InterleaveCount:
236 case LoopHintAttr::UnrollCount:
239 case LoopHintAttr::UnrollAndJamCount:
242 case LoopHintAttr::PipelineInitiationInterval:
245 case LoopHintAttr::Unroll:
246 case LoopHintAttr::UnrollAndJam:
247 case LoopHintAttr::VectorizePredicate:
248 case LoopHintAttr::Vectorize:
249 case LoopHintAttr::VectorizeWidth:
250 case LoopHintAttr::Interleave:
251 case LoopHintAttr::Distribute:
252 case LoopHintAttr::PipelineDisabled:
253 case LoopHintAttr::LICMDisabled:
254 llvm_unreachable(
"Options cannot be assigned a value.");
268 llvm::APSInt ArgVal = CE->getResultAsAPSInt();
270 }
else if (CGOpts.LoopAlignment) {
276 if (CGOpts.OptimizationLevel > 0)
279 if (!CGOpts.UnrollLoops &&
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...