Skip to content

Commit d8c31d4

Browse files
committed
[OPENMP50]Fix capturing of if condition in target parallel for simd
directive. Fixed capturing of the if condition if no modifer was specified in this condition. Previously could capture it only in outer region and it could lead to a compiler crash.
1 parent 5a486e0 commit d8c31d4

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10705,8 +10705,10 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
1070510705
switch (DKind) {
1070610706
case OMPD_target_parallel_for_simd:
1070710707
if (OpenMPVersion >= 50 &&
10708-
(NameModifier == OMPD_unknown || NameModifier == OMPD_simd))
10708+
(NameModifier == OMPD_unknown || NameModifier == OMPD_simd)) {
1070910709
CaptureRegion = OMPD_parallel;
10710+
break;
10711+
}
1071010712
LLVM_FALLTHROUGH;
1071110713
case OMPD_target_parallel:
1071210714
case OMPD_target_parallel_for:

clang/test/OpenMP/target_parallel_for_simd_codegen.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ struct S1 {
539539
short int c[2][n];
540540

541541
#ifdef OMP5
542-
#pragma omp target parallel for simd if(target: n>60) if(simd:n)
542+
#pragma omp target parallel for simd if(n>60)
543543
#else
544544
#pragma omp target parallel for simd if(target: n>60)
545545
#endif // OMP5
@@ -576,20 +576,22 @@ int bar(int n){
576576
// CHECK: define {{.*}}[[FS1]]
577577
//
578578
// CHECK: i8* @llvm.stacksave()
579+
// CHECK-32: store i32 %{{.+}}, i32* %__vla_expr
580+
// OMP50: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 60
579581
// CHECK-64: [[B_ADDR:%.+]] = bitcast i[[SZ]]* [[B_CADDR:%.+]] to i32*
580582
// CHECK-64: store i32 %{{.+}}, i32* [[B_ADDR]],
581583
// CHECK-64: [[B_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[B_CADDR]],
582584

583-
// CHECK-32: store i32 %{{.+}}, i32* %__vla_expr
584585
// CHECK-32: store i32 %{{.+}}, i32* [[B_ADDR:%.+]],
585586
// CHECK-32: [[B_CVAL:%.+]] = load i[[SZ]], i[[SZ]]* [[B_ADDR]],
586587

588+
// OMP45: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 60
587589
// OMP50: [[TOBOOL:%.+]] = trunc i8 %{{.+}} to i1
588590
// OMP50: [[CONV:%.+]] = bitcast i[[SZ]]* [[CAP:%.+]] to i8*
589591
// OMP50: [[FROMBOOL:%.+]] = zext i1 [[TOBOOL]] to i8
590592
// OMP50: store i8 [[FROMBOOL]], i8* [[CONV]],
591593
// OMP50: [[SIMD_COND:%.+]] = load i[[SZ]], i[[SZ]]* [[CAP]],
592-
// CHECK: [[IF:%.+]] = icmp sgt i32 {{[^,]+}}, 60
594+
// OMP50: [[IF:%.+]] = trunc i8 %{{.+}} to i1
593595
// CHECK: br i1 [[IF]], label %[[TRY:[^,]+]], label %[[FAIL:[^,]+]]
594596
// CHECK: [[TRY]]
595597
// We capture 2 VLA sizes in this target region
@@ -599,7 +601,7 @@ int bar(int n){
599601
// CHECK-32: [[CSIZE:%.+]] = sext i32 [[CSZSIZE]] to i64
600602

601603
// OMP45-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 6, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* [[SR:%[^,]+]], i64* getelementptr inbounds ([6 x i64], [6 x i64]* [[MAPT7]], i32 0, i32 0), i32 1, i32 0)
602-
// OMP50-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 7, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* [[SR:%[^,]+]], i64* getelementptr inbounds ([7 x i64], [7 x i64]* [[MAPT7]], i32 0, i32 0), i32 1, i32 0)
604+
// OMP50-DAG: [[RET:%.+]] = call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 7, i8** [[BPR:%[^,]+]], i8** [[PR:%[^,]+]], i64* [[SR:%[^,]+]], i64* getelementptr inbounds ([7 x i64], [7 x i64]* [[MAPT7]], i32 0, i32 0), i32 1, i32 %{{.+}})
603605
// OMP45-DAG: [[BPR]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[BP:%.+]], i32 0, i32 0
604606
// OMP45-DAG: [[PR]] = getelementptr inbounds [6 x i8*], [6 x i8*]* [[P:%.+]], i32 0, i32 0
605607
// OMP45-DAG: [[SR]] = getelementptr inbounds [6 x i64], [6 x i64]* [[S:%.+]], i32 0, i32 0

0 commit comments

Comments
 (0)