mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[OpenMP]Add support for workshare loop modifier in lowering
When lowering the dynamic, guided, auto and runtime types of scheduling, there is an optional monotonic or non-monotonic modifier. This patch adds support in the OMP IR Builder to pass this down to the runtime functions. Also implements tests for the variants. Differential Revision: https://reviews.llvm.org/D102008
This commit is contained in:
parent
fd59827ea3
commit
ae07366301
@ -117,10 +117,12 @@ enum class OMPScheduleType {
|
||||
Runtime = 37,
|
||||
Auto = 38, // auto
|
||||
|
||||
ModifierMonotonic =
|
||||
(1 << 29), // Set if the monotonic schedule modifier was present
|
||||
ModifierNonmonotonic =
|
||||
(1 << 30), /**< Set if the nonmonotonic schedule modifier was present */
|
||||
|
||||
LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierNonmonotonic)
|
||||
(1 << 30), // Set if the nonmonotonic schedule modifier was present
|
||||
ModifierMask = ModifierMonotonic | ModifierNonmonotonic,
|
||||
LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue */ ModifierMask)
|
||||
};
|
||||
|
||||
} // end namespace omp
|
||||
|
@ -1431,10 +1431,8 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createDynamicWorkshareLoop(
|
||||
|
||||
Value *ThreadNum = getOrCreateThreadID(SrcLoc);
|
||||
|
||||
OMPScheduleType DynamicSchedType =
|
||||
SchedType | OMPScheduleType::ModifierNonmonotonic;
|
||||
Constant *SchedulingType =
|
||||
ConstantInt::get(I32Type, static_cast<int>(DynamicSchedType));
|
||||
ConstantInt::get(I32Type, static_cast<int>(SchedType));
|
||||
|
||||
// Call the "init" function.
|
||||
Builder.CreateCall(DynamicInit,
|
||||
|
@ -1721,7 +1721,7 @@ TEST_P(OpenMPIRBuilderTestWithParams, DynamicWorkShareLoop) {
|
||||
|
||||
omp::OMPScheduleType SchedType = GetParam();
|
||||
uint32_t ChunkSize = 1;
|
||||
switch (SchedType) {
|
||||
switch (SchedType & ~omp::OMPScheduleType::ModifierMask) {
|
||||
case omp::OMPScheduleType::DynamicChunked:
|
||||
case omp::OMPScheduleType::GuidedChunked:
|
||||
ChunkSize = 7;
|
||||
@ -1794,8 +1794,9 @@ TEST_P(OpenMPIRBuilderTestWithParams, DynamicWorkShareLoop) {
|
||||
EXPECT_EQ(InitCall->getCalledFunction()->getName(),
|
||||
"__kmpc_dispatch_init_4u");
|
||||
EXPECT_EQ(InitCall->getNumArgOperands(), 7U);
|
||||
EXPECT_EQ(InitCall->getArgOperand(6),
|
||||
ConstantInt::get(Type::getInt32Ty(Ctx), ChunkSize));
|
||||
EXPECT_EQ(InitCall->getArgOperand(6), ConstantInt::get(LCTy, ChunkSize));
|
||||
ConstantInt *SchedVal = cast<ConstantInt>(InitCall->getArgOperand(2));
|
||||
EXPECT_EQ(SchedVal->getValue(), static_cast<uint64_t>(SchedType));
|
||||
|
||||
ConstantInt *OrigLowerBound =
|
||||
dyn_cast<ConstantInt>(LowerBoundStore->getValueOperand());
|
||||
@ -1827,12 +1828,23 @@ TEST_P(OpenMPIRBuilderTestWithParams, DynamicWorkShareLoop) {
|
||||
EXPECT_FALSE(verifyModule(*M, &errs()));
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(OpenMPWSLoopSchedulingTypes,
|
||||
OpenMPIRBuilderTestWithParams,
|
||||
INSTANTIATE_TEST_CASE_P(
|
||||
OpenMPWSLoopSchedulingTypes, OpenMPIRBuilderTestWithParams,
|
||||
::testing::Values(omp::OMPScheduleType::DynamicChunked,
|
||||
omp::OMPScheduleType::GuidedChunked,
|
||||
omp::OMPScheduleType::Auto,
|
||||
omp::OMPScheduleType::Runtime));
|
||||
omp::OMPScheduleType::Auto, omp::OMPScheduleType::Runtime,
|
||||
omp::OMPScheduleType::DynamicChunked |
|
||||
omp::OMPScheduleType::ModifierMonotonic,
|
||||
omp::OMPScheduleType::DynamicChunked |
|
||||
omp::OMPScheduleType::ModifierNonmonotonic,
|
||||
omp::OMPScheduleType::GuidedChunked |
|
||||
omp::OMPScheduleType::ModifierMonotonic,
|
||||
omp::OMPScheduleType::GuidedChunked |
|
||||
omp::OMPScheduleType::ModifierNonmonotonic,
|
||||
omp::OMPScheduleType::Auto |
|
||||
omp::OMPScheduleType::ModifierMonotonic,
|
||||
omp::OMPScheduleType::Runtime |
|
||||
omp::OMPScheduleType::ModifierMonotonic));
|
||||
|
||||
TEST_F(OpenMPIRBuilderTest, MasterDirective) {
|
||||
using InsertPointTy = OpenMPIRBuilder::InsertPointTy;
|
||||
|
Loading…
Reference in New Issue
Block a user