[Clang][OpenMP] Bug fix Default clause variable category (#165276)

In the default clause taking care of new comments in the previous
"Support for Default clause variable category"
[157063](https://github.com/llvm/llvm-project/pull/157063) and adding a
new test case.

---------

Co-authored-by: Sunil Kuravinakop <kuravina@pe31.hpc.amslabs.hpecorp.net>
This commit is contained in:
SunilKuravinakop 2025-11-14 21:35:49 +05:30 committed by GitHub
parent 8aa7d823b0
commit 39774f9caf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 95 additions and 3 deletions

View File

@ -1364,15 +1364,15 @@ DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter,
DefaultDataSharingAttributes IterDA = Iter->DefaultAttr;
switch (Iter->DefaultVCAttr) {
case DSA_VC_aggregate:
if (!VD->getType()->isAggregateType())
if (!D->getType()->isAggregateType())
IterDA = DSA_none;
break;
case DSA_VC_pointer:
if (!VD->getType()->isPointerType())
if (!D->getType()->isPointerType())
IterDA = DSA_none;
break;
case DSA_VC_scalar:
if (!VD->getType()->isScalarType())
if (!D->getType()->isScalarType())
IterDA = DSA_none;
break;
case DSA_VC_all:

View File

@ -0,0 +1,92 @@
// RUN: %clangxx -Xclang -verify -Wno-vla -fopenmp -fopenmp-version=60 -x c++ -S -emit-llvm %s -o - | FileCheck %s
// expected-no-diagnostics
#ifndef HEADER
#define HEADER
#include <vector>
int global;
#define VECTOR_SIZE 4
int main (int argc, char **argv) {
int i,n;
int x;
n = VECTOR_SIZE;
#pragma omp parallel masked firstprivate(x) num_threads(2)
{
int *xPtr = nullptr;
// scalar
#pragma omp task default(shared:scalar)
{
xPtr = &x;
}
#pragma omp taskwait
// pointer
#pragma omp task default(shared:pointer) shared(x)
{
xPtr = &x;
}
#pragma omp taskwait
}
int *aggregate[VECTOR_SIZE] = {0,0,0,0};
#pragma omp parallel masked num_threads(2)
{
// aggregate
#pragma omp task default(shared:aggregate)
for(i=0;i<n;i++) {
aggregate[i] = &x;
}
#pragma omp taskwait
#pragma omp task default(shared:aggregate) shared(x)
for(i=0;i<n;i++) {
aggregate[i] = &x;
}
#pragma omp taskwait
// all
#pragma omp task default(shared:all)
for(i=0;i<n;i++) {
aggregate[i] = &x;
}
#pragma omp taskwait
}
}
#endif
// CHECK-LABEL: define {{.*}}main.omp_outlined{{.*}}
// CHECK-NEXT: entry:
// CHECK: %x.addr = alloca{{.*}}
// CHECK: %xPtr = alloca{{.*}}
// CHECK: store ptr null, ptr %xPtr{{.*}}
// CHECK: store ptr %xPtr{{.*}}
// CHECK: store ptr %x.addr{{.*}}
// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
// CHECK: ret void
//
// CHECK: define {{.*}}main.omp_outlined{{.*}}
// CHECK-NEXT: entry:
// CHECK-DAG: %i.addr = alloca{{.*}}
// CHECK-DAG: %n.addr = alloca{{.*}}
// CHECK-DAG: %aggregate.addr = alloca{{.*}}
// CHECK-DAG: %x.addr = alloca{{.*}}
// CHECK: [[TMP0:%.*]] = load{{.*}}%i.addr{{.*}}
// CHECK-NEXT: [[TMP1:%.*]] = load{{.*}}%n.addr{{.*}}
// CHECK-NEXT: [[TMP2:%.*]] = load{{.*}}%aggregate.addr{{.*}}
// CHECK-NEXT: [[TMP3:%.*]] = load{{.*}}%x.addr{{.*}}
// CHECK: store ptr [[TMP2]]{{.*}}
// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
// CHECK: store ptr [[TMP2]]{{.*}}
// CHECK: store ptr [[TMP3]]{{.*}}
// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
// CHECK: store ptr [[TMP0]]{{.*}}
// CHECK: store ptr [[TMP1]]{{.*}}
// CHECK: store ptr [[TMP2]]{{.*}}
// CHECK: store ptr [[TMP3]]{{.*}}
// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
// CHECK: ret void