annotate polly/lib/CodeGen/LoopGeneratorsKMP.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===------ LoopGeneratorsKMP.cpp - IR helper to create loops -------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file contains functions to create parallel loops as LLVM-IR.
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "polly/CodeGen/LoopGeneratorsKMP.h"
anatofuz
parents:
diff changeset
14 #include "llvm/IR/Dominators.h"
anatofuz
parents:
diff changeset
15 #include "llvm/IR/Module.h"
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 using namespace llvm;
anatofuz
parents:
diff changeset
18 using namespace polly;
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 void ParallelLoopGeneratorKMP::createCallSpawnThreads(Value *SubFn,
anatofuz
parents:
diff changeset
21 Value *SubFnParam,
anatofuz
parents:
diff changeset
22 Value *LB, Value *UB,
anatofuz
parents:
diff changeset
23 Value *Stride) {
anatofuz
parents:
diff changeset
24 const std::string Name = "__kmpc_fork_call";
anatofuz
parents:
diff changeset
25 Function *F = M->getFunction(Name);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
26 Type *KMPCMicroTy = StructType::getTypeByName(M->getContext(), "kmpc_micro");
150
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 if (!KMPCMicroTy) {
anatofuz
parents:
diff changeset
29 // void (*kmpc_micro)(kmp_int32 *global_tid, kmp_int32 *bound_tid, ...)
anatofuz
parents:
diff changeset
30 Type *MicroParams[] = {Builder.getInt32Ty()->getPointerTo(),
anatofuz
parents:
diff changeset
31 Builder.getInt32Ty()->getPointerTo()};
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 KMPCMicroTy = FunctionType::get(Builder.getVoidTy(), MicroParams, true);
anatofuz
parents:
diff changeset
34 }
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 // If F is not available, declare it.
anatofuz
parents:
diff changeset
37 if (!F) {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
38 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
39 StructType::getTypeByName(M->getContext(), "struct.ident_t");
150
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage;
anatofuz
parents:
diff changeset
42 Type *Params[] = {IdentTy->getPointerTo(), Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
43 KMPCMicroTy->getPointerTo()};
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 FunctionType *Ty = FunctionType::get(Builder.getVoidTy(), Params, true);
anatofuz
parents:
diff changeset
46 F = Function::Create(Ty, Linkage, Name, M);
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 Value *Task = Builder.CreatePointerBitCastOrAddrSpaceCast(
anatofuz
parents:
diff changeset
50 SubFn, KMPCMicroTy->getPointerTo());
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 Value *Args[] = {SourceLocationInfo,
anatofuz
parents:
diff changeset
53 Builder.getInt32(4) /* Number of arguments (w/o Task) */,
anatofuz
parents:
diff changeset
54 Task,
anatofuz
parents:
diff changeset
55 LB,
anatofuz
parents:
diff changeset
56 UB,
anatofuz
parents:
diff changeset
57 Stride,
anatofuz
parents:
diff changeset
58 SubFnParam};
anatofuz
parents:
diff changeset
59
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
60 CallInst *Call = Builder.CreateCall(F, Args);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
61 Call->setDebugLoc(DLGenerated);
150
anatofuz
parents:
diff changeset
62 }
anatofuz
parents:
diff changeset
63
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
64 void ParallelLoopGeneratorKMP::deployParallelExecution(Function *SubFn,
150
anatofuz
parents:
diff changeset
65 Value *SubFnParam,
anatofuz
parents:
diff changeset
66 Value *LB, Value *UB,
anatofuz
parents:
diff changeset
67 Value *Stride) {
anatofuz
parents:
diff changeset
68 // Inform OpenMP runtime about the number of threads if greater than zero
anatofuz
parents:
diff changeset
69 if (PollyNumThreads > 0) {
anatofuz
parents:
diff changeset
70 Value *GlobalThreadID = createCallGlobalThreadNum();
anatofuz
parents:
diff changeset
71 createCallPushNumThreads(GlobalThreadID, Builder.getInt32(PollyNumThreads));
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 // Tell the runtime we start a parallel loop
anatofuz
parents:
diff changeset
75 createCallSpawnThreads(SubFn, SubFnParam, LB, UB, Stride);
anatofuz
parents:
diff changeset
76 }
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 Function *ParallelLoopGeneratorKMP::prepareSubFnDefinition(Function *F) const {
anatofuz
parents:
diff changeset
79 std::vector<Type *> Arguments = {Builder.getInt32Ty()->getPointerTo(),
anatofuz
parents:
diff changeset
80 Builder.getInt32Ty()->getPointerTo(),
anatofuz
parents:
diff changeset
81 LongType,
anatofuz
parents:
diff changeset
82 LongType,
anatofuz
parents:
diff changeset
83 LongType,
anatofuz
parents:
diff changeset
84 Builder.getInt8PtrTy()};
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 FunctionType *FT = FunctionType::get(Builder.getVoidTy(), Arguments, false);
anatofuz
parents:
diff changeset
87 Function *SubFn = Function::Create(FT, Function::InternalLinkage,
anatofuz
parents:
diff changeset
88 F->getName() + "_polly_subfn", M);
anatofuz
parents:
diff changeset
89 // Name the function's arguments
anatofuz
parents:
diff changeset
90 Function::arg_iterator AI = SubFn->arg_begin();
anatofuz
parents:
diff changeset
91 AI->setName("polly.kmpc.global_tid");
anatofuz
parents:
diff changeset
92 std::advance(AI, 1);
anatofuz
parents:
diff changeset
93 AI->setName("polly.kmpc.bound_tid");
anatofuz
parents:
diff changeset
94 std::advance(AI, 1);
anatofuz
parents:
diff changeset
95 AI->setName("polly.kmpc.lb");
anatofuz
parents:
diff changeset
96 std::advance(AI, 1);
anatofuz
parents:
diff changeset
97 AI->setName("polly.kmpc.ub");
anatofuz
parents:
diff changeset
98 std::advance(AI, 1);
anatofuz
parents:
diff changeset
99 AI->setName("polly.kmpc.inc");
anatofuz
parents:
diff changeset
100 std::advance(AI, 1);
anatofuz
parents:
diff changeset
101 AI->setName("polly.kmpc.shared");
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 return SubFn;
anatofuz
parents:
diff changeset
104 }
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 // Create a subfunction of the following (preliminary) structure:
anatofuz
parents:
diff changeset
107 //
anatofuz
parents:
diff changeset
108 // PrevBB
anatofuz
parents:
diff changeset
109 // |
anatofuz
parents:
diff changeset
110 // v
anatofuz
parents:
diff changeset
111 // HeaderBB
anatofuz
parents:
diff changeset
112 // / | _____
anatofuz
parents:
diff changeset
113 // / v v |
anatofuz
parents:
diff changeset
114 // / PreHeaderBB |
anatofuz
parents:
diff changeset
115 // | | |
anatofuz
parents:
diff changeset
116 // | v |
anatofuz
parents:
diff changeset
117 // | CheckNextBB |
anatofuz
parents:
diff changeset
118 // \ | \_____/
anatofuz
parents:
diff changeset
119 // \ |
anatofuz
parents:
diff changeset
120 // v v
anatofuz
parents:
diff changeset
121 // ExitBB
anatofuz
parents:
diff changeset
122 //
anatofuz
parents:
diff changeset
123 // HeaderBB will hold allocations, loading of variables and kmp-init calls.
anatofuz
parents:
diff changeset
124 // CheckNextBB will check for more work (dynamic / static chunked) or will be
anatofuz
parents:
diff changeset
125 // empty (static non chunked).
anatofuz
parents:
diff changeset
126 // If there is more work to do: go to PreHeaderBB, otherwise go to ExitBB.
anatofuz
parents:
diff changeset
127 // PreHeaderBB loads the new boundaries (& will lead to the loop body later on).
anatofuz
parents:
diff changeset
128 // Just like CheckNextBB: PreHeaderBB is (preliminary) empty in the static non
anatofuz
parents:
diff changeset
129 // chunked scheduling case. ExitBB marks the end of the parallel execution.
anatofuz
parents:
diff changeset
130 // The possibly empty BasicBlocks will automatically be removed.
anatofuz
parents:
diff changeset
131 std::tuple<Value *, Function *>
anatofuz
parents:
diff changeset
132 ParallelLoopGeneratorKMP::createSubFn(Value *SequentialLoopStride,
anatofuz
parents:
diff changeset
133 AllocaInst *StructData,
anatofuz
parents:
diff changeset
134 SetVector<Value *> Data, ValueMapT &Map) {
anatofuz
parents:
diff changeset
135 Function *SubFn = createSubFnDefinition();
anatofuz
parents:
diff changeset
136 LLVMContext &Context = SubFn->getContext();
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 // Store the previous basic block.
anatofuz
parents:
diff changeset
139 BasicBlock *PrevBB = Builder.GetInsertBlock();
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 // Create basic blocks.
anatofuz
parents:
diff changeset
142 BasicBlock *HeaderBB = BasicBlock::Create(Context, "polly.par.setup", SubFn);
anatofuz
parents:
diff changeset
143 BasicBlock *ExitBB = BasicBlock::Create(Context, "polly.par.exit", SubFn);
anatofuz
parents:
diff changeset
144 BasicBlock *CheckNextBB =
anatofuz
parents:
diff changeset
145 BasicBlock::Create(Context, "polly.par.checkNext", SubFn);
anatofuz
parents:
diff changeset
146 BasicBlock *PreHeaderBB =
anatofuz
parents:
diff changeset
147 BasicBlock::Create(Context, "polly.par.loadIVBounds", SubFn);
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 DT.addNewBlock(HeaderBB, PrevBB);
anatofuz
parents:
diff changeset
150 DT.addNewBlock(ExitBB, HeaderBB);
anatofuz
parents:
diff changeset
151 DT.addNewBlock(CheckNextBB, HeaderBB);
anatofuz
parents:
diff changeset
152 DT.addNewBlock(PreHeaderBB, HeaderBB);
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154 // Fill up basic block HeaderBB.
anatofuz
parents:
diff changeset
155 Builder.SetInsertPoint(HeaderBB);
anatofuz
parents:
diff changeset
156 Value *LBPtr = Builder.CreateAlloca(LongType, nullptr, "polly.par.LBPtr");
anatofuz
parents:
diff changeset
157 Value *UBPtr = Builder.CreateAlloca(LongType, nullptr, "polly.par.UBPtr");
anatofuz
parents:
diff changeset
158 Value *IsLastPtr = Builder.CreateAlloca(Builder.getInt32Ty(), nullptr,
anatofuz
parents:
diff changeset
159 "polly.par.lastIterPtr");
anatofuz
parents:
diff changeset
160 Value *StridePtr =
anatofuz
parents:
diff changeset
161 Builder.CreateAlloca(LongType, nullptr, "polly.par.StridePtr");
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 // Get iterator for retrieving the previously defined parameters.
anatofuz
parents:
diff changeset
164 Function::arg_iterator AI = SubFn->arg_begin();
anatofuz
parents:
diff changeset
165 // First argument holds "global thread ID".
anatofuz
parents:
diff changeset
166 Value *IDPtr = &*AI;
anatofuz
parents:
diff changeset
167 // Skip "bound thread ID" since it is not used (but had to be defined).
anatofuz
parents:
diff changeset
168 std::advance(AI, 2);
anatofuz
parents:
diff changeset
169 // Move iterator to: LB, UB, Stride, Shared variable struct.
anatofuz
parents:
diff changeset
170 Value *LB = &*AI;
anatofuz
parents:
diff changeset
171 std::advance(AI, 1);
anatofuz
parents:
diff changeset
172 Value *UB = &*AI;
anatofuz
parents:
diff changeset
173 std::advance(AI, 1);
anatofuz
parents:
diff changeset
174 Value *Stride = &*AI;
anatofuz
parents:
diff changeset
175 std::advance(AI, 1);
anatofuz
parents:
diff changeset
176 Value *Shared = &*AI;
anatofuz
parents:
diff changeset
177
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
178 extractValuesFromStruct(Data, StructData->getAllocatedType(), Shared, Map);
150
anatofuz
parents:
diff changeset
179
anatofuz
parents:
diff changeset
180 const auto Alignment = llvm::Align(is64BitArch() ? 8 : 4);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
181 Value *ID = Builder.CreateAlignedLoad(Builder.getInt32Ty(), IDPtr, Alignment,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
182 "polly.par.global_tid");
150
anatofuz
parents:
diff changeset
183
anatofuz
parents:
diff changeset
184 Builder.CreateAlignedStore(LB, LBPtr, Alignment);
anatofuz
parents:
diff changeset
185 Builder.CreateAlignedStore(UB, UBPtr, Alignment);
anatofuz
parents:
diff changeset
186 Builder.CreateAlignedStore(Builder.getInt32(0), IsLastPtr, Alignment);
anatofuz
parents:
diff changeset
187 Builder.CreateAlignedStore(Stride, StridePtr, Alignment);
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 // Subtract one as the upper bound provided by openmp is a < comparison
anatofuz
parents:
diff changeset
190 // whereas the codegenForSequential function creates a <= comparison.
anatofuz
parents:
diff changeset
191 Value *AdjustedUB = Builder.CreateAdd(UB, ConstantInt::get(LongType, -1),
anatofuz
parents:
diff changeset
192 "polly.indvar.UBAdjusted");
anatofuz
parents:
diff changeset
193
anatofuz
parents:
diff changeset
194 Value *ChunkSize =
anatofuz
parents:
diff changeset
195 ConstantInt::get(LongType, std::max<int>(PollyChunkSize, 1));
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 OMPGeneralSchedulingType Scheduling =
anatofuz
parents:
diff changeset
198 getSchedType(PollyChunkSize, PollyScheduling);
anatofuz
parents:
diff changeset
199
anatofuz
parents:
diff changeset
200 switch (Scheduling) {
anatofuz
parents:
diff changeset
201 case OMPGeneralSchedulingType::Dynamic:
anatofuz
parents:
diff changeset
202 case OMPGeneralSchedulingType::Guided:
anatofuz
parents:
diff changeset
203 case OMPGeneralSchedulingType::Runtime:
anatofuz
parents:
diff changeset
204 // "DYNAMIC" scheduling types are handled below (including 'runtime')
anatofuz
parents:
diff changeset
205 {
anatofuz
parents:
diff changeset
206 UB = AdjustedUB;
anatofuz
parents:
diff changeset
207 createCallDispatchInit(ID, LB, UB, Stride, ChunkSize);
anatofuz
parents:
diff changeset
208 Value *HasWork =
anatofuz
parents:
diff changeset
209 createCallDispatchNext(ID, IsLastPtr, LBPtr, UBPtr, StridePtr);
anatofuz
parents:
diff changeset
210 Value *HasIteration =
anatofuz
parents:
diff changeset
211 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_EQ, HasWork,
anatofuz
parents:
diff changeset
212 Builder.getInt32(1), "polly.hasIteration");
anatofuz
parents:
diff changeset
213 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
anatofuz
parents:
diff changeset
214
anatofuz
parents:
diff changeset
215 Builder.SetInsertPoint(CheckNextBB);
anatofuz
parents:
diff changeset
216 HasWork = createCallDispatchNext(ID, IsLastPtr, LBPtr, UBPtr, StridePtr);
anatofuz
parents:
diff changeset
217 HasIteration =
anatofuz
parents:
diff changeset
218 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_EQ, HasWork,
anatofuz
parents:
diff changeset
219 Builder.getInt32(1), "polly.hasWork");
anatofuz
parents:
diff changeset
220 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 Builder.SetInsertPoint(PreHeaderBB);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
223 LB = Builder.CreateAlignedLoad(LongType, LBPtr, Alignment,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
224 "polly.indvar.LB");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
225 UB = Builder.CreateAlignedLoad(LongType, UBPtr, Alignment,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
226 "polly.indvar.UB");
150
anatofuz
parents:
diff changeset
227 }
anatofuz
parents:
diff changeset
228 break;
anatofuz
parents:
diff changeset
229 case OMPGeneralSchedulingType::StaticChunked:
anatofuz
parents:
diff changeset
230 case OMPGeneralSchedulingType::StaticNonChunked:
anatofuz
parents:
diff changeset
231 // "STATIC" scheduling types are handled below
anatofuz
parents:
diff changeset
232 {
anatofuz
parents:
diff changeset
233 Builder.CreateAlignedStore(AdjustedUB, UBPtr, Alignment);
anatofuz
parents:
diff changeset
234 createCallStaticInit(ID, IsLastPtr, LBPtr, UBPtr, StridePtr, ChunkSize);
anatofuz
parents:
diff changeset
235
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
236 Value *ChunkedStride = Builder.CreateAlignedLoad(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
237 LongType, StridePtr, Alignment, "polly.kmpc.stride");
150
anatofuz
parents:
diff changeset
238
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
239 LB = Builder.CreateAlignedLoad(LongType, LBPtr, Alignment,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
240 "polly.indvar.LB");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
241 UB = Builder.CreateAlignedLoad(LongType, UBPtr, Alignment,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
242 "polly.indvar.UB.temp");
150
anatofuz
parents:
diff changeset
243
anatofuz
parents:
diff changeset
244 Value *UBInRange =
anatofuz
parents:
diff changeset
245 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SLE, UB, AdjustedUB,
anatofuz
parents:
diff changeset
246 "polly.indvar.UB.inRange");
anatofuz
parents:
diff changeset
247 UB = Builder.CreateSelect(UBInRange, UB, AdjustedUB, "polly.indvar.UB");
anatofuz
parents:
diff changeset
248 Builder.CreateAlignedStore(UB, UBPtr, Alignment);
anatofuz
parents:
diff changeset
249
anatofuz
parents:
diff changeset
250 Value *HasIteration = Builder.CreateICmp(
anatofuz
parents:
diff changeset
251 llvm::CmpInst::Predicate::ICMP_SLE, LB, UB, "polly.hasIteration");
anatofuz
parents:
diff changeset
252 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
anatofuz
parents:
diff changeset
253
anatofuz
parents:
diff changeset
254 if (Scheduling == OMPGeneralSchedulingType::StaticChunked) {
anatofuz
parents:
diff changeset
255 Builder.SetInsertPoint(PreHeaderBB);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
256 LB = Builder.CreateAlignedLoad(LongType, LBPtr, Alignment,
150
anatofuz
parents:
diff changeset
257 "polly.indvar.LB.entry");
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
258 UB = Builder.CreateAlignedLoad(LongType, UBPtr, Alignment,
150
anatofuz
parents:
diff changeset
259 "polly.indvar.UB.entry");
anatofuz
parents:
diff changeset
260 }
anatofuz
parents:
diff changeset
261
anatofuz
parents:
diff changeset
262 Builder.SetInsertPoint(CheckNextBB);
anatofuz
parents:
diff changeset
263
anatofuz
parents:
diff changeset
264 if (Scheduling == OMPGeneralSchedulingType::StaticChunked) {
anatofuz
parents:
diff changeset
265 Value *NextLB =
anatofuz
parents:
diff changeset
266 Builder.CreateAdd(LB, ChunkedStride, "polly.indvar.nextLB");
anatofuz
parents:
diff changeset
267 Value *NextUB = Builder.CreateAdd(UB, ChunkedStride);
anatofuz
parents:
diff changeset
268
anatofuz
parents:
diff changeset
269 Value *NextUBOutOfBounds =
anatofuz
parents:
diff changeset
270 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SGT, NextUB,
anatofuz
parents:
diff changeset
271 AdjustedUB, "polly.indvar.nextUB.outOfBounds");
anatofuz
parents:
diff changeset
272 NextUB = Builder.CreateSelect(NextUBOutOfBounds, AdjustedUB, NextUB,
anatofuz
parents:
diff changeset
273 "polly.indvar.nextUB");
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 Builder.CreateAlignedStore(NextLB, LBPtr, Alignment);
anatofuz
parents:
diff changeset
276 Builder.CreateAlignedStore(NextUB, UBPtr, Alignment);
anatofuz
parents:
diff changeset
277
anatofuz
parents:
diff changeset
278 Value *HasWork =
anatofuz
parents:
diff changeset
279 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SLE, NextLB,
anatofuz
parents:
diff changeset
280 AdjustedUB, "polly.hasWork");
anatofuz
parents:
diff changeset
281 Builder.CreateCondBr(HasWork, PreHeaderBB, ExitBB);
anatofuz
parents:
diff changeset
282 } else {
anatofuz
parents:
diff changeset
283 Builder.CreateBr(ExitBB);
anatofuz
parents:
diff changeset
284 }
anatofuz
parents:
diff changeset
285
anatofuz
parents:
diff changeset
286 Builder.SetInsertPoint(PreHeaderBB);
anatofuz
parents:
diff changeset
287 }
anatofuz
parents:
diff changeset
288 break;
anatofuz
parents:
diff changeset
289 }
anatofuz
parents:
diff changeset
290
anatofuz
parents:
diff changeset
291 Builder.CreateBr(CheckNextBB);
anatofuz
parents:
diff changeset
292 Builder.SetInsertPoint(&*--Builder.GetInsertPoint());
anatofuz
parents:
diff changeset
293 BasicBlock *AfterBB;
anatofuz
parents:
diff changeset
294 Value *IV = createLoop(LB, UB, SequentialLoopStride, Builder, LI, DT, AfterBB,
anatofuz
parents:
diff changeset
295 ICmpInst::ICMP_SLE, nullptr, true,
anatofuz
parents:
diff changeset
296 /* UseGuard */ false);
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 BasicBlock::iterator LoopBody = Builder.GetInsertPoint();
anatofuz
parents:
diff changeset
299
anatofuz
parents:
diff changeset
300 // Add code to terminate this subfunction.
anatofuz
parents:
diff changeset
301 Builder.SetInsertPoint(ExitBB);
anatofuz
parents:
diff changeset
302 // Static (i.e. non-dynamic) scheduling types, are terminated with a fini-call
anatofuz
parents:
diff changeset
303 if (Scheduling == OMPGeneralSchedulingType::StaticChunked ||
anatofuz
parents:
diff changeset
304 Scheduling == OMPGeneralSchedulingType::StaticNonChunked) {
anatofuz
parents:
diff changeset
305 createCallStaticFini(ID);
anatofuz
parents:
diff changeset
306 }
anatofuz
parents:
diff changeset
307 Builder.CreateRetVoid();
anatofuz
parents:
diff changeset
308 Builder.SetInsertPoint(&*LoopBody);
anatofuz
parents:
diff changeset
309
anatofuz
parents:
diff changeset
310 return std::make_tuple(IV, SubFn);
anatofuz
parents:
diff changeset
311 }
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 Value *ParallelLoopGeneratorKMP::createCallGlobalThreadNum() {
anatofuz
parents:
diff changeset
314 const std::string Name = "__kmpc_global_thread_num";
anatofuz
parents:
diff changeset
315 Function *F = M->getFunction(Name);
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 // If F is not available, declare it.
anatofuz
parents:
diff changeset
318 if (!F) {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
319 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
320 StructType::getTypeByName(M->getContext(), "struct.ident_t");
150
anatofuz
parents:
diff changeset
321
anatofuz
parents:
diff changeset
322 GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage;
anatofuz
parents:
diff changeset
323 Type *Params[] = {IdentTy->getPointerTo()};
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 FunctionType *Ty = FunctionType::get(Builder.getInt32Ty(), Params, false);
anatofuz
parents:
diff changeset
326 F = Function::Create(Ty, Linkage, Name, M);
anatofuz
parents:
diff changeset
327 }
anatofuz
parents:
diff changeset
328
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
329 CallInst *Call = Builder.CreateCall(F, {SourceLocationInfo});
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
330 Call->setDebugLoc(DLGenerated);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
331 return Call;
150
anatofuz
parents:
diff changeset
332 }
anatofuz
parents:
diff changeset
333
anatofuz
parents:
diff changeset
334 void ParallelLoopGeneratorKMP::createCallPushNumThreads(Value *GlobalThreadID,
anatofuz
parents:
diff changeset
335 Value *NumThreads) {
anatofuz
parents:
diff changeset
336 const std::string Name = "__kmpc_push_num_threads";
anatofuz
parents:
diff changeset
337 Function *F = M->getFunction(Name);
anatofuz
parents:
diff changeset
338
anatofuz
parents:
diff changeset
339 // If F is not available, declare it.
anatofuz
parents:
diff changeset
340 if (!F) {
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
341 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
342 StructType::getTypeByName(M->getContext(), "struct.ident_t");
150
anatofuz
parents:
diff changeset
343
anatofuz
parents:
diff changeset
344 GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage;
anatofuz
parents:
diff changeset
345 Type *Params[] = {IdentTy->getPointerTo(), Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
346 Builder.getInt32Ty()};
anatofuz
parents:
diff changeset
347
anatofuz
parents:
diff changeset
348 FunctionType *Ty = FunctionType::get(Builder.getVoidTy(), Params, false);
anatofuz
parents:
diff changeset
349 F = Function::Create(Ty, Linkage, Name, M);
anatofuz
parents:
diff changeset
350 }
anatofuz
parents:
diff changeset
351
anatofuz
parents:
diff changeset
352 Value *Args[] = {SourceLocationInfo, GlobalThreadID, NumThreads};
anatofuz
parents:
diff changeset
353
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
354 CallInst *Call = Builder.CreateCall(F, Args);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
355 Call->setDebugLoc(DLGenerated);
150
anatofuz
parents:
diff changeset
356 }
anatofuz
parents:
diff changeset
357
anatofuz
parents:
diff changeset
358 void ParallelLoopGeneratorKMP::createCallStaticInit(Value *GlobalThreadID,
anatofuz
parents:
diff changeset
359 Value *IsLastPtr,
anatofuz
parents:
diff changeset
360 Value *LBPtr, Value *UBPtr,
anatofuz
parents:
diff changeset
361 Value *StridePtr,
anatofuz
parents:
diff changeset
362 Value *ChunkSize) {
anatofuz
parents:
diff changeset
363 const std::string Name =
anatofuz
parents:
diff changeset
364 is64BitArch() ? "__kmpc_for_static_init_8" : "__kmpc_for_static_init_4";
anatofuz
parents:
diff changeset
365 Function *F = M->getFunction(Name);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
366 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
367 StructType::getTypeByName(M->getContext(), "struct.ident_t");
150
anatofuz
parents:
diff changeset
368
anatofuz
parents:
diff changeset
369 // If F is not available, declare it.
anatofuz
parents:
diff changeset
370 if (!F) {
anatofuz
parents:
diff changeset
371 GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage;
anatofuz
parents:
diff changeset
372
anatofuz
parents:
diff changeset
373 Type *Params[] = {IdentTy->getPointerTo(),
anatofuz
parents:
diff changeset
374 Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
375 Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
376 Builder.getInt32Ty()->getPointerTo(),
anatofuz
parents:
diff changeset
377 LongType->getPointerTo(),
anatofuz
parents:
diff changeset
378 LongType->getPointerTo(),
anatofuz
parents:
diff changeset
379 LongType->getPointerTo(),
anatofuz
parents:
diff changeset
380 LongType,
anatofuz
parents:
diff changeset
381 LongType};
anatofuz
parents:
diff changeset
382
anatofuz
parents:
diff changeset
383 FunctionType *Ty = FunctionType::get(Builder.getVoidTy(), Params, false);
anatofuz
parents:
diff changeset
384 F = Function::Create(Ty, Linkage, Name, M);
anatofuz
parents:
diff changeset
385 }
anatofuz
parents:
diff changeset
386
anatofuz
parents:
diff changeset
387 // The parameter 'ChunkSize' will hold strictly positive integer values,
anatofuz
parents:
diff changeset
388 // regardless of PollyChunkSize's value
anatofuz
parents:
diff changeset
389 Value *Args[] = {
anatofuz
parents:
diff changeset
390 SourceLocationInfo,
anatofuz
parents:
diff changeset
391 GlobalThreadID,
anatofuz
parents:
diff changeset
392 Builder.getInt32(int(getSchedType(PollyChunkSize, PollyScheduling))),
anatofuz
parents:
diff changeset
393 IsLastPtr,
anatofuz
parents:
diff changeset
394 LBPtr,
anatofuz
parents:
diff changeset
395 UBPtr,
anatofuz
parents:
diff changeset
396 StridePtr,
anatofuz
parents:
diff changeset
397 ConstantInt::get(LongType, 1),
anatofuz
parents:
diff changeset
398 ChunkSize};
anatofuz
parents:
diff changeset
399
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
400 CallInst *Call = Builder.CreateCall(F, Args);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
401 Call->setDebugLoc(DLGenerated);
150
anatofuz
parents:
diff changeset
402 }
anatofuz
parents:
diff changeset
403
anatofuz
parents:
diff changeset
404 void ParallelLoopGeneratorKMP::createCallStaticFini(Value *GlobalThreadID) {
anatofuz
parents:
diff changeset
405 const std::string Name = "__kmpc_for_static_fini";
anatofuz
parents:
diff changeset
406 Function *F = M->getFunction(Name);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
407 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
408 StructType::getTypeByName(M->getContext(), "struct.ident_t");
150
anatofuz
parents:
diff changeset
409
anatofuz
parents:
diff changeset
410 // If F is not available, declare it.
anatofuz
parents:
diff changeset
411 if (!F) {
anatofuz
parents:
diff changeset
412 GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage;
anatofuz
parents:
diff changeset
413 Type *Params[] = {IdentTy->getPointerTo(), Builder.getInt32Ty()};
anatofuz
parents:
diff changeset
414 FunctionType *Ty = FunctionType::get(Builder.getVoidTy(), Params, false);
anatofuz
parents:
diff changeset
415 F = Function::Create(Ty, Linkage, Name, M);
anatofuz
parents:
diff changeset
416 }
anatofuz
parents:
diff changeset
417
anatofuz
parents:
diff changeset
418 Value *Args[] = {SourceLocationInfo, GlobalThreadID};
anatofuz
parents:
diff changeset
419
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
420 CallInst *Call = Builder.CreateCall(F, Args);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
421 Call->setDebugLoc(DLGenerated);
150
anatofuz
parents:
diff changeset
422 }
anatofuz
parents:
diff changeset
423
anatofuz
parents:
diff changeset
424 void ParallelLoopGeneratorKMP::createCallDispatchInit(Value *GlobalThreadID,
anatofuz
parents:
diff changeset
425 Value *LB, Value *UB,
anatofuz
parents:
diff changeset
426 Value *Inc,
anatofuz
parents:
diff changeset
427 Value *ChunkSize) {
anatofuz
parents:
diff changeset
428 const std::string Name =
anatofuz
parents:
diff changeset
429 is64BitArch() ? "__kmpc_dispatch_init_8" : "__kmpc_dispatch_init_4";
anatofuz
parents:
diff changeset
430 Function *F = M->getFunction(Name);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
431 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
432 StructType::getTypeByName(M->getContext(), "struct.ident_t");
150
anatofuz
parents:
diff changeset
433
anatofuz
parents:
diff changeset
434 // If F is not available, declare it.
anatofuz
parents:
diff changeset
435 if (!F) {
anatofuz
parents:
diff changeset
436 GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage;
anatofuz
parents:
diff changeset
437
anatofuz
parents:
diff changeset
438 Type *Params[] = {IdentTy->getPointerTo(),
anatofuz
parents:
diff changeset
439 Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
440 Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
441 LongType,
anatofuz
parents:
diff changeset
442 LongType,
anatofuz
parents:
diff changeset
443 LongType,
anatofuz
parents:
diff changeset
444 LongType};
anatofuz
parents:
diff changeset
445
anatofuz
parents:
diff changeset
446 FunctionType *Ty = FunctionType::get(Builder.getVoidTy(), Params, false);
anatofuz
parents:
diff changeset
447 F = Function::Create(Ty, Linkage, Name, M);
anatofuz
parents:
diff changeset
448 }
anatofuz
parents:
diff changeset
449
anatofuz
parents:
diff changeset
450 // The parameter 'ChunkSize' will hold strictly positive integer values,
anatofuz
parents:
diff changeset
451 // regardless of PollyChunkSize's value
anatofuz
parents:
diff changeset
452 Value *Args[] = {
anatofuz
parents:
diff changeset
453 SourceLocationInfo,
anatofuz
parents:
diff changeset
454 GlobalThreadID,
anatofuz
parents:
diff changeset
455 Builder.getInt32(int(getSchedType(PollyChunkSize, PollyScheduling))),
anatofuz
parents:
diff changeset
456 LB,
anatofuz
parents:
diff changeset
457 UB,
anatofuz
parents:
diff changeset
458 Inc,
anatofuz
parents:
diff changeset
459 ChunkSize};
anatofuz
parents:
diff changeset
460
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
461 CallInst *Call = Builder.CreateCall(F, Args);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
462 Call->setDebugLoc(DLGenerated);
150
anatofuz
parents:
diff changeset
463 }
anatofuz
parents:
diff changeset
464
anatofuz
parents:
diff changeset
465 Value *ParallelLoopGeneratorKMP::createCallDispatchNext(Value *GlobalThreadID,
anatofuz
parents:
diff changeset
466 Value *IsLastPtr,
anatofuz
parents:
diff changeset
467 Value *LBPtr,
anatofuz
parents:
diff changeset
468 Value *UBPtr,
anatofuz
parents:
diff changeset
469 Value *StridePtr) {
anatofuz
parents:
diff changeset
470 const std::string Name =
anatofuz
parents:
diff changeset
471 is64BitArch() ? "__kmpc_dispatch_next_8" : "__kmpc_dispatch_next_4";
anatofuz
parents:
diff changeset
472 Function *F = M->getFunction(Name);
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
473 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
474 StructType::getTypeByName(M->getContext(), "struct.ident_t");
150
anatofuz
parents:
diff changeset
475
anatofuz
parents:
diff changeset
476 // If F is not available, declare it.
anatofuz
parents:
diff changeset
477 if (!F) {
anatofuz
parents:
diff changeset
478 GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage;
anatofuz
parents:
diff changeset
479
anatofuz
parents:
diff changeset
480 Type *Params[] = {IdentTy->getPointerTo(),
anatofuz
parents:
diff changeset
481 Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
482 Builder.getInt32Ty()->getPointerTo(),
anatofuz
parents:
diff changeset
483 LongType->getPointerTo(),
anatofuz
parents:
diff changeset
484 LongType->getPointerTo(),
anatofuz
parents:
diff changeset
485 LongType->getPointerTo()};
anatofuz
parents:
diff changeset
486
anatofuz
parents:
diff changeset
487 FunctionType *Ty = FunctionType::get(Builder.getInt32Ty(), Params, false);
anatofuz
parents:
diff changeset
488 F = Function::Create(Ty, Linkage, Name, M);
anatofuz
parents:
diff changeset
489 }
anatofuz
parents:
diff changeset
490
anatofuz
parents:
diff changeset
491 Value *Args[] = {SourceLocationInfo, GlobalThreadID, IsLastPtr, LBPtr, UBPtr,
anatofuz
parents:
diff changeset
492 StridePtr};
anatofuz
parents:
diff changeset
493
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
494 CallInst *Call = Builder.CreateCall(F, Args);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
495 Call->setDebugLoc(DLGenerated);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
496 return Call;
150
anatofuz
parents:
diff changeset
497 }
anatofuz
parents:
diff changeset
498
anatofuz
parents:
diff changeset
499 // TODO: This function currently creates a source location dummy. It might be
anatofuz
parents:
diff changeset
500 // necessary to (actually) provide information, in the future.
anatofuz
parents:
diff changeset
501 GlobalVariable *ParallelLoopGeneratorKMP::createSourceLocation() {
anatofuz
parents:
diff changeset
502 const std::string LocName = ".loc.dummy";
anatofuz
parents:
diff changeset
503 GlobalVariable *SourceLocDummy = M->getGlobalVariable(LocName);
anatofuz
parents:
diff changeset
504
anatofuz
parents:
diff changeset
505 if (SourceLocDummy == nullptr) {
anatofuz
parents:
diff changeset
506 const std::string StructName = "struct.ident_t";
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
507 StructType *IdentTy =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
508 StructType::getTypeByName(M->getContext(), StructName);
150
anatofuz
parents:
diff changeset
509
anatofuz
parents:
diff changeset
510 // If the ident_t StructType is not available, declare it.
anatofuz
parents:
diff changeset
511 // in LLVM-IR: ident_t = type { i32, i32, i32, i32, i8* }
anatofuz
parents:
diff changeset
512 if (!IdentTy) {
anatofuz
parents:
diff changeset
513 Type *LocMembers[] = {Builder.getInt32Ty(), Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
514 Builder.getInt32Ty(), Builder.getInt32Ty(),
anatofuz
parents:
diff changeset
515 Builder.getInt8PtrTy()};
anatofuz
parents:
diff changeset
516
anatofuz
parents:
diff changeset
517 IdentTy =
anatofuz
parents:
diff changeset
518 StructType::create(M->getContext(), LocMembers, StructName, false);
anatofuz
parents:
diff changeset
519 }
anatofuz
parents:
diff changeset
520
anatofuz
parents:
diff changeset
521 const auto ArrayType =
anatofuz
parents:
diff changeset
522 llvm::ArrayType::get(Builder.getInt8Ty(), /* Length */ 23);
anatofuz
parents:
diff changeset
523
anatofuz
parents:
diff changeset
524 // Global Variable Definitions
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
525 GlobalVariable *StrVar =
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
526 new GlobalVariable(*M, ArrayType, true, GlobalValue::PrivateLinkage,
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
527 nullptr, ".str.ident");
150
anatofuz
parents:
diff changeset
528 StrVar->setAlignment(llvm::Align(1));
anatofuz
parents:
diff changeset
529
anatofuz
parents:
diff changeset
530 SourceLocDummy = new GlobalVariable(
anatofuz
parents:
diff changeset
531 *M, IdentTy, true, GlobalValue::PrivateLinkage, nullptr, LocName);
anatofuz
parents:
diff changeset
532 SourceLocDummy->setAlignment(llvm::Align(8));
anatofuz
parents:
diff changeset
533
anatofuz
parents:
diff changeset
534 // Constant Definitions
anatofuz
parents:
diff changeset
535 Constant *InitStr = ConstantDataArray::getString(
anatofuz
parents:
diff changeset
536 M->getContext(), "Source location dummy.", true);
anatofuz
parents:
diff changeset
537
anatofuz
parents:
diff changeset
538 Constant *StrPtr = static_cast<Constant *>(Builder.CreateInBoundsGEP(
anatofuz
parents:
diff changeset
539 ArrayType, StrVar, {Builder.getInt32(0), Builder.getInt32(0)}));
anatofuz
parents:
diff changeset
540
anatofuz
parents:
diff changeset
541 Constant *LocInitStruct = ConstantStruct::get(
anatofuz
parents:
diff changeset
542 IdentTy, {Builder.getInt32(0), Builder.getInt32(0), Builder.getInt32(0),
anatofuz
parents:
diff changeset
543 Builder.getInt32(0), StrPtr});
anatofuz
parents:
diff changeset
544
anatofuz
parents:
diff changeset
545 // Initialize variables
anatofuz
parents:
diff changeset
546 StrVar->setInitializer(InitStr);
anatofuz
parents:
diff changeset
547 SourceLocDummy->setInitializer(LocInitStruct);
anatofuz
parents:
diff changeset
548 }
anatofuz
parents:
diff changeset
549
anatofuz
parents:
diff changeset
550 return SourceLocDummy;
anatofuz
parents:
diff changeset
551 }
anatofuz
parents:
diff changeset
552
anatofuz
parents:
diff changeset
553 bool ParallelLoopGeneratorKMP::is64BitArch() {
anatofuz
parents:
diff changeset
554 return (LongType->getIntegerBitWidth() == 64);
anatofuz
parents:
diff changeset
555 }
anatofuz
parents:
diff changeset
556
anatofuz
parents:
diff changeset
557 OMPGeneralSchedulingType ParallelLoopGeneratorKMP::getSchedType(
anatofuz
parents:
diff changeset
558 int ChunkSize, OMPGeneralSchedulingType Scheduling) const {
anatofuz
parents:
diff changeset
559 if (ChunkSize == 0 && Scheduling == OMPGeneralSchedulingType::StaticChunked)
anatofuz
parents:
diff changeset
560 return OMPGeneralSchedulingType::StaticNonChunked;
anatofuz
parents:
diff changeset
561
anatofuz
parents:
diff changeset
562 return Scheduling;
anatofuz
parents:
diff changeset
563 }