llvm/clang/test/Analysis/cfg-openmp.cpp

// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG %s 2>&1 -fopenmp -fopenmp-version=45 | FileCheck %s

// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG %s 2>&1 -fopenmp | FileCheck %s --check-prefix=OMP51

#if _OPENMP == 202011

// OMP51-LABEL:  void target_has_device_addr(int argc)
void target_has_device_addr(int argc) {
// OMP51:   [B1]
// OMP51-NEXT:   [[#TTD:]]: 5
// OMP51-NEXT:   [[#TTD+1]]: int x = 5;
// OMP51-NEXT:   [[#TTD+2]]: x
// OMP51-NEXT:   [[#TTD+3]]: [B1.[[#TTD+2]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-NEXT:   [[#TTD+4]]: [B1.[[#TTD+6]]]
// OMP51-NEXT:   [[#TTD+5]]: [B1.[[#TTD+6]]] = [B1.[[#TTD+3]]]
// OMP51-NEXT:   [[#TTD+6]]: argc
// OMP51-NEXT:   [[#TTD+7]]: #pragma omp target has_device_addr(x)
// OMP51-NEXT:   [B1.[[#TTD+5]]]
  int x = 5;
#pragma omp target has_device_addr(x)
   argc = x;
}
// OMP51-LABEL: void target_s_has_device_addr(int argc)
void target_s_has_device_addr(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// OMP51-DAG:  [B3]
// OMP51-DAG: [[#TSB:]]: x
// OMP51-DAG: [[#TSB+1]]: [B3.[[#TSB]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-DAG: [[#TSB+2]]: argc
// OMP51-DAG: [[#TSB+3]]: [B3.[[#TSB+2]]] = [B3.[[#TSB+1]]]
// OMP51-DAG:  [B1]
// OMP51-DAG: [[#TS:]]: cond
// OMP51-DAG: [[#TS+1]]: [B1.[[#TS]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-DAG: [[#TS+2]]: [B1.[[#TS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// OMP51-DAG: [[#TS+3]]: fp
// OMP51-DAG: [[#TS+4]]: rd
// OMP51-DAG: [[#TS+5]]: lin
// OMP51-DAG: [[#TS+6]]: step_sz
// OMP51-DAG: [[#TS+7]]: [B1.[[#TS+6]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-DAG: [[#TS+8]]: [B3.[[#TSB+2]]]
// OMP51-DAG: [[#TS+9]]: [B3.[[#TSB]]]
// OMP51-DAG: [[#TS+10]]: #pragma omp target simd if(cond) firstprivate(fp) reduction(+: rd) linear(lin: step(step_sz)) has_device_addr(map)
// OMP51-DAG:    for (int i = 0;
// OMP51-DAG: [B3.[[#TSB+3]]];
#pragma omp target simd if(cond) firstprivate(fp) reduction(+:rd) linear(lin: step_sz) has_device_addr(map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}
// OMP51-LABEL: void target_t_l_has_device_addr(int argc)
void target_t_l_has_device_addr(int argc) {
int x, cond, fp, rd, map;
// OMP51-DAG: [B3]
// OMP51-DAG: [[#TTDB:]]: x
// OMP51-DAG: [[#TTDB+1]]: [B3.[[#TTDB]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-DAG: [[#TTDB+2]]: argc
// OMP51-DAG: [[#TTDB+3]]: [B3.[[#TTDB+2]]] = [B3.[[#TTDB+1]]]
// OMP51-DAG: [B1]
// OMP51-DAG: [[#TTD:]]: cond
// OMP51-DAG: [[#TTD+1]]: [B1.[[#TTD]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-DAG: [[#TTD+2]]: [B1.[[#TTD+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// OMP51-DAG: [[#TTD+3]]: fp
// OMP51-DAG: [[#TTD+4]]: rd
// OMP51-DAG: [[#TTD+5]]: [B3.[[#TTDB+2]]]
// OMP51-DAG: [[#TTD+6]]: [B3.[[#TTDB]]]
// OMP51-DAG: [[#TTD+7]]:  #pragma omp target teams loop if(cond) firstprivate(fp) reduction(+: rd) has_device_addr(map)
// OMP51-DAG: for (int i = 0;
// OMP51-DAG:   [B3.[[#TTDB+3]]];
#pragma omp target teams loop if(cond) firstprivate(fp) reduction(+:rd) has_device_addr(map)
   for (int i = 0; i <10; ++i)
     argc = x;
}
// OMP51-LABEL:  void target_p_l_has_device_addr(int argc)
void target_p_l_has_device_addr(int argc) {
int x, cond, fp, rd, map;
#pragma omp target parallel loop if(cond) firstprivate(fp) reduction(+:rd) has_device_addr(map)
// OMP51-DAG: [B3]
// OMP51-DAG: [[#TTDB:]]: x
// OMP51-DAG: [[#TTDB+1]]: [B3.[[#TTDB]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-DAG: [[#TTDB+2]]: argc
// OMP51-DAG: [[#TTDB+3]]: [B3.[[#TTDB+2]]] = [B3.[[#TTDB+1]]]
// OMP51-DAG: [B1]
// OMP51-DAG: [[#TTD:]]: cond
// OMP51-DAG: [[#TTD+1]]: [B1.[[#TTD]]] (ImplicitCastExpr, LValueToRValue, int)
// OMP51-DAG: [[#TTD+2]]: [B1.[[#TTD+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// OMP51-DAG: [[#TTD+3]]: fp
// OMP51-DAG: [[#TTD+4]]: rd
// OMP51-DAG: [[#TTD+5]]: [B3.[[#TTDB+2]]]
// OMP51-DAG: [[#TTD+6]]: [B3.[[#TTDB]]]
// OMP51-DAG: [[#TTD+7]]: #pragma omp target parallel loop if(cond) firstprivate(fp) reduction(+: rd) has_device_addr(map)
// OMP51-DAG: for (int i = 0;
// OMP51-DAG:   [B3.[[#TTDB+3]]];
  for (int i = 0; i < 10; ++i)
    argc = x;
}
struct SomeKernel {
  int targetDev;
  float devPtr;
  SomeKernel();
  ~SomeKernel();
// OMP51-LABEL: template<> void apply<32U>()
  template<unsigned int nRHS>
  void apply() {
// OMP51-DAG: [B1]
// OMP51-DAG: [[#TTD:]]: 10
// OMP51-DAG: [[#TTD+1]]: [B1.[[#TTD:]]] (ImplicitCastExpr, IntegralToFloating, float)
// OMP51-DAG: [[#TTD+2]]: this
// OMP51-DAG: [[#TTD+3]]: [B1.[[#TTD+2]]]->devPtr
// OMP51-DAG: [[#TTD+4]]: [B1.[[#TTD+3]]] = [B1.[[#TTD+1]]]
// OMP51-DAG: [[#TTD+5]]: #pragma omp target has_device_addr(this->devPtr) device(this->targetDev)
// OMP51-DAG:    {
// OMP51-DAG:    [B1.[[#TTD+4]]];
    #pragma omp target has_device_addr(devPtr) device(targetDev)
    {
      devPtr = 10;
    }
  }
};
void use_template() {
  SomeKernel aKern;
  aKern.apply<32>();
}
#else // _OPENMP

// CHECK-LABEL:  void xxx(int argc)
void xxx(int argc) {
// CHECK:        [B1]
// CHECK-NEXT:   1: int x;
// CHECK-NEXT:   2: int cond;
// CHECK-NEXT:   3: int fp;
// CHECK-NEXT:   4: int rd;
// CHECK-NEXT:   5: int lin;
// CHECK-NEXT:   6: int step_sz;
// CHECK-NEXT:   7: int map;
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-NEXT:   [[#ATOM:]]: x
// CHECK-NEXT:   [[#ATOM+1]]: [B1.[[#ATOM]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:   [[#ATOM+2]]: argc
// CHECK-NEXT:   [[#ATOM+3]]: [B1.[[#ATOM+2]]] = [B1.[[#ATOM+1]]]
// CHECK-NEXT:   [[#ATOM+4]]: #pragma omp atomic read
// CHECK-NEXT:   [B1.[[#ATOM+3]]];
#pragma omp atomic read
  argc = x;
// CHECK-NEXT:   [[#CRIT:]]: x
// CHECK-NEXT:   [[#CRIT+1]]: [B1.[[#CRIT]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:   [[#CRIT+2]]: argc
// CHECK-NEXT:   [[#CRIT+3]]: [B1.[[#CRIT+2]]] = [B1.[[#CRIT+1]]]
// CHECK-NEXT:   [[#CRIT+4]]: #pragma omp critical
// CHECK-NEXT:   [B1.[[#CRIT+3]]];
#pragma omp critical
  argc = x;
// CHECK-NEXT:  [[#MASTER:]]: x
// CHECK-NEXT:  [[#MASTER+1]]: [B1.[[#MASTER]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#MASTER+2]]: argc
// CHECK-NEXT:  [[#MASTER+3]]: [B1.[[#MASTER+2]]] = [B1.[[#MASTER+1]]]
// CHECK-NEXT:  [[#MASTER+4]]: #pragma omp master
// CHECK-NEXT:    [B1.[[#MASTER+3]]];
#pragma omp master
  argc = x;
// CHECK-NEXT:  [[#PAR:]]: x
// CHECK-NEXT:  [[#PAR+1]]: [B1.[[#PAR]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#PAR+2]]: argc
// CHECK-NEXT:  [[#PAR+3]]: [B1.[[#PAR+2]]] = [B1.[[#PAR+1]]]
// CHECK-NEXT:  [[#PAR+4]]: cond
// CHECK-NEXT:  [[#PAR+5]]: [B1.[[#PAR+4]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#PAR+6]]: [B1.[[#PAR+5]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-NEXT:  [[#PAR+7]]: fp
// CHECK-NEXT:  [[#PAR+8]]: rd
// CHECK-NEXT:  [[#PAR+9]]: #pragma omp parallel if(cond) firstprivate(fp) reduction(min: rd)
// CHECK-NEXT:    [B1.[[#PAR+3]]];
#pragma omp parallel if(cond) firstprivate(fp) reduction(min:rd)
  argc = x;
// CHECK-NEXT:  [[#PSECT:]]: x
// CHECK-NEXT:  [[#PSECT+1]]: [B1.[[#PSECT]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#PSECT+2]]: argc
// CHECK-NEXT:  [[#PSECT+3]]: [B1.[[#PSECT+2]]] = [B1.[[#PSECT+1]]]
// CHECK-NEXT:  [[#PSECT+4]]: cond
// CHECK-NEXT:  [[#PSECT+5]]: [B1.[[#PSECT+4]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#PSECT+6]]: [B1.[[#PSECT+5]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-NEXT:  [[#PSECT+7]]: fp
// CHECK-NEXT:  [[#PSECT+8]]: rd
// CHECK-NEXT:  [[#PSECT+9]]: #pragma omp parallel sections if(cond) firstprivate(fp) reduction(&&: rd)
// CHECK-NEXT:    {
// CHECK-NEXT:        [B1.[[#PSECT+3]]];
// CHECK-NEXT:    }
#pragma omp parallel sections if(cond) firstprivate(fp) reduction(&&:rd)
  {
    argc = x;
  }
// CHECK-NEXT:  [[#SINGLE:]]: x
// CHECK-NEXT:  [[#SINGLE+1]]: [B1.[[#SINGLE]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#SINGLE+2]]: argc
// CHECK-NEXT:  [[#SINGLE+3]]: [B1.[[#SINGLE+2]]] = [B1.[[#SINGLE+1]]]
// CHECK-NEXT:  [[#SINGLE+4]]: #pragma omp single
// CHECK-NEXT:    [B1.[[#SINGLE+3]]];
#pragma omp single
  argc = x;
// CHECK-NEXT:  [[#TARGET:]]:
// CHECK-SAME:  [B1.[[#TARGET+9]]]
// CHECK-NEXT:  [[#TARGET+1]]: [B1.[[#TARGET+9]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TARGET+2]]: [B1.[[#TARGET+8]]]
// CHECK-NEXT:  [[#TARGET+3]]: [B1.[[#TARGET+8]]] = [B1.[[#TARGET+1]]]
// CHECK-NEXT:  [[#TARGET+4]]: cond
// CHECK-NEXT:  [[#TARGET+5]]: [B1.[[#TARGET+4]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TARGET+6]]: [B1.[[#TARGET+5]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-NEXT:  [[#TARGET+7]]: fp
// CHECK-NEXT:  [[#TARGET+8]]: argc
// CHECK-NEXT:  [[#TARGET+9]]: x
// CHECK-NEXT:  [[#TARGET+10]]: #pragma omp target depend(in : argc) if(cond) firstprivate(fp)
// CHECK-NEXT:    [B1.[[#TARGET+3]]];
#pragma omp target depend(in \
                          : argc) if(cond) firstprivate(fp)
  argc = x;
// CHECK-NEXT:  [[#TP:]]:
// CHECK-SAME:  [B1.[[#TP+11]]]
// CHECK-NEXT:  [[#TP+1]]: [B1.[[#TP+11]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TP+2]]: [B1.[[#TP+10]]]
// CHECK-NEXT:  [[#TP+3]]: [B1.[[#TP+10]]] = [B1.[[#TP+1]]]
// CHECK-NEXT:  [[#TP+4]]: cond
// CHECK-NEXT:  [[#TP+5]]: [B1.[[#TP+4]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TP+6]]: [B1.[[#TP+5]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-NEXT:  [[#TP+7]]: fp
// CHECK-NEXT:  [[#TP+8]]: rd
// CHECK-NEXT:  [[#TP+9]]: map
// CHECK-NEXT:  [[#TP+10]]: argc
// CHECK-NEXT:  [[#TP+11]]: x
// CHECK-NEXT:  [[#TP+12]]: #pragma omp target parallel if(cond) firstprivate(fp) reduction(+: rd) map(to: map)
// CHECK-NEXT:    [B1.[[#TP+3]]];
#pragma omp target parallel if(cond) firstprivate(fp) reduction(+:rd) map(to:map)
  argc = x;
// CHECK-NEXT:  [[#TT:]]:
// CHECK-SAME:  [B1.[[#TT+11]]]
// CHECK-NEXT:  [[#TT+1]]: [B1.[[#TT+11]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TT+2]]: [B1.[[#TT+10]]]
// CHECK-NEXT:  [[#TT+3]]: [B1.[[#TT+10]]] = [B1.[[#TT+1]]]
// CHECK-NEXT:  [[#TT+4]]: cond
// CHECK-NEXT:  [[#TT+5]]: [B1.[[#TT+4]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TT+6]]: [B1.[[#TT+5]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-NEXT:  [[#TT+7]]: fp
// CHECK-NEXT:  [[#TT+8]]: rd
// CHECK-NEXT:  [[#TT+9]]: map
// CHECK-NEXT:  [[#TT+10]]: argc
// CHECK-NEXT:  [[#TT+11]]: x
// CHECK-NEXT:  [[#TT+12]]: #pragma omp target teams if(cond) firstprivate(fp) reduction(+: rd) map(tofrom: map)
// CHECK-NEXT:    [B1.[[#TT+3]]];
#pragma omp target teams if(cond) firstprivate(fp) reduction(+:rd) map(tofrom:map)
  argc = x;
// CHECK-NEXT: [[#TU:]]: cond
// CHECK-NEXT: [[#TU+1]]: [B1.[[#TU]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT: [[#TU+2]]: [B1.[[#TU+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-NEXT: [[#TU+3]]: #pragma omp target update to(x) if(target update: cond)
#pragma omp target update to(x) if(target update:cond)
// CHECK-NEXT:  [[#TASK:]]:
// CHECK-SAME:  [B1.[[#TASK+9]]]
// CHECK-NEXT:  [[#TASK+1]]: [B1.[[#TASK+9]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TASK+2]]: [B1.[[#TASK+8]]]
// CHECK-NEXT:  [[#TASK+3]]: [B1.[[#TASK+8]]] = [B1.[[#TASK+1]]]
// CHECK-NEXT:  [[#TASK+4]]: cond
// CHECK-NEXT:  [[#TASK+5]]: [B1.[[#TASK+4]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TASK+6]]: [B1.[[#TASK+5]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-NEXT:  [[#TASK+7]]: fp
// CHECK-NEXT:  [[#TASK+8]]: argc
// CHECK-NEXT:  [[#TASK+9]]: x
// CHECK-NEXT:  [[#TASK+10]]: #pragma omp task if(cond) firstprivate(fp)
// CHECK-NEXT:    [B1.[[#TASK+3]]];
#pragma omp task if(cond) firstprivate(fp)
  argc = x;
// CHECK-NEXT:  [[#TG:]]: x
// CHECK-NEXT:  [[#TG+1]]: [B1.[[#TG]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TG+2]]: argc
// CHECK-NEXT:  [[#TG+3]]: [B1.[[#TG+2]]] = [B1.[[#TG+1]]]
// CHECK-NEXT:  [[#TG+4]]: #pragma omp taskgroup
// CHECK-NEXT:    [B1.[[#TG+3]]];
#pragma omp taskgroup
  argc = x;
// CHECK-NEXT:  [[#TEAMS:]]: x
// CHECK-NEXT:  [[#TEAMS+1]]: [B1.[[#TEAMS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:  [[#TEAMS+2]]: argc
// CHECK-NEXT:  [[#TEAMS+3]]: [B1.[[#TEAMS+2]]] = [B1.[[#TEAMS+1]]]
// CHECK-NEXT:  [[#TEAMS+4]]: [B1.[[#TEAMS+7]]]
// CHECK-NEXT:  [[#TEAMS+5]]: [B1.[[#TEAMS+8]]]
// CHECK-NEXT:  [[#TEAMS+6]]: #pragma omp teams firstprivate(fp) reduction(+: rd)
// CHECK-NEXT:    [B1.[[#TEAMS+3]]];
// CHECK-NEXT:  [[#TEAMS+7]]: fp
// CHECK-NEXT:  [[#TEAMS+8]]: rd
// CHECK-NEXT:  [[#TEAMS+9]]: argc
// CHECK-NEXT:  [[#TEAMS+10]]: x
// CHECK-NEXT:  [[#TEAMS+11]]: #pragma omp target
#pragma omp target
#pragma omp teams firstprivate(fp) reduction(+:rd)
  argc = x;
// CHECK-NEXT:  [B1.[[#TEAMS+6]]]   Preds
}

// CHECK-LABEL:  void dpf(int argc)
void dpf(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#DPFB:]]: x
// CHECK-DAG:  [[#DPFB+1]]: [B3.[[#DPFB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#DPFB+2]]: argc
// CHECK-DAG:  [[#DPFB+3]]: [B3.[[#DPFB+2]]] = [B3.[[#DPFB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#DPF:]]: cond
// CHECK-DAG:  [[#DPF+1]]: [B1.[[#DPF]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#DPF+2]]: [B1.[[#DPF+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#DPF+3]]: fp
// CHECK-DAG:  [[#DPF+4]]: rd
// CHECK-DAG:  [[#DPF+5]]: #pragma omp distribute parallel for if(parallel: cond) firstprivate(fp) reduction(+: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#DPFB+3]]];
#pragma omp distribute parallel for if(parallel:cond) firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void dpfs(int argc)
void dpfs(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#DPFSB:]]: x
// CHECK-DAG:  [[#DPFSB+1]]: [B3.[[#DPFSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#DPFSB+2]]: argc
// CHECK-DAG:  [[#DPFSB+3]]: [B3.[[#DPFSB+2]]] = [B3.[[#DPFSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#DPFS:]]: cond
// CHECK-DAG:  [[#DPFS+1]]: [B1.[[#DPFS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#DPFS+2]]: [B1.[[#DPFS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#DPFS+3]]: fp
// CHECK-DAG:  [[#DPFS+4]]: rd
// CHECK-DAG:  [[#DPFS+5]]: #pragma omp distribute parallel for simd if(cond) firstprivate(fp) reduction(-: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#DPFSB+3]]];
#pragma omp distribute parallel for simd if(cond)  firstprivate(fp) reduction(-:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void ds(int argc)
void ds(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#DSB:]]: x
// CHECK-DAG:  [[#DSB+1]]: [B3.[[#DSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#DSB+2]]: argc
// CHECK-DAG:  [[#DSB+3]]: [B3.[[#DSB+2]]] = [B3.[[#DSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#DS:]]: #pragma omp distribute simd
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#DSB+3]]];
#pragma omp distribute simd
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void for_fn(int argc)
void for_fn(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#FORB:]]: x
// CHECK-DAG:  [[#FORB+1]]: [B3.[[#FORB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#FORB+2]]: argc
// CHECK-DAG:  [[#FORB+3]]: [B3.[[#FORB+2]]] = [B3.[[#FORB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#FOR:]]: lin
// CHECK-DAG:  [[#FOR+1]]: step_sz
// CHECK-DAG:  [[#FOR+2]]: [B1.[[#FOR+1]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#FOR+3]]: #pragma omp for linear(lin: step(step_sz))
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#FORB+3]]];
#pragma omp for linear(lin : step_sz)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void fs(int argc)
void fs(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#FSB:]]: x
// CHECK-DAG:  [[#FSB+1]]: [B3.[[#FSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#FSB+2]]: argc
// CHECK-DAG:  [[#FSB+3]]: [B3.[[#FSB+2]]] = [B3.[[#FSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#FS:]]: lin
// CHECK-DAG:  [[#FS+1]]: step_sz
// CHECK-DAG:  [[#FS+2]]: [B1.[[#FS+1]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#FS+3]]: #pragma omp for simd linear(lin: step(step_sz))
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#FSB+3]]];
#pragma omp for simd linear(lin: step_sz)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void ord(int argc)
void ord(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#ORDB:]]: x
// CHECK-DAG:  [[#ORDB+1]]: [B3.[[#ORDB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#ORDB+2]]: argc
// CHECK-DAG:  [[#ORDB+3]]: [B3.[[#ORDB+2]]] = [B3.[[#ORDB+1]]]
// CHECK-DAG:  [[#ORDB+4]]: #pragma omp ordered
// CHECK-DAG:    [B3.[[#ORDB+3]]];
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#ORD:]]: #pragma omp for ordered
// CHECK-DAG:    for (int i = 0
// CHECK-DAG:[B3.[[#ORDB+4]]]    }
#pragma omp for ordered
  for (int i = 0; i < 10; ++i) {
#pragma omp ordered
    argc = x;
  }
}

// CHECK-LABEL:  void pf(int argc)
void pf(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#PFB:]]: x
// CHECK-DAG:  [[#PFB+1]]: [B3.[[#PFB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PFB+2]]: argc
// CHECK-DAG:  [[#PFB+3]]: [B3.[[#PFB+2]]] = [B3.[[#PFB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#PF:]]: cond
// CHECK-DAG:  [[#PF+1]]: [B1.[[#PF]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PF+2]]: [B1.[[#PF+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#PF+3]]: fp
// CHECK-DAG:  [[#PF+4]]: rd
// CHECK-DAG:  [[#PF+5]]: lin
// CHECK-DAG:  [[#PF+6]]: step_sz
// CHECK-DAG:  [[#PF+7]]: [B1.[[#PF+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PF+8]]: #pragma omp parallel for if(cond) firstprivate(fp) reduction(&: rd) linear(lin: step(step_sz))
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#PFB+3]]];
#pragma omp parallel for if(cond) firstprivate(fp) reduction(&:rd) linear(lin: step_sz)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void pfs(int argc)
void pfs(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#PFSB:]]: x
// CHECK-DAG:  [[#PFSB+1]]: [B3.[[#PFSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PFSB+2]]: argc
// CHECK-DAG:  [[#PFSB+3]]: [B3.[[#PFSB+2]]] = [B3.[[#PFSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#PFS:]]: cond
// CHECK-DAG:  [[#PFS+1]]: [B1.[[#PFS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PFS+2]]: [B1.[[#PFS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#PFS+3]]: fp
// CHECK-DAG:  [[#PFS+4]]: rd
// CHECK-DAG:  [[#PFS+5]]: lin
// CHECK-DAG:  [[#PFS+6]]: step_sz
// CHECK-DAG:  [[#PFS+7]]: [B1.[[#PFS+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PFS+8]]: #pragma omp parallel for simd if(cond) firstprivate(fp) reduction(|: rd) linear(lin: step(step_sz))
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#PFSB+3]]];
#pragma omp parallel for simd if(cond) firstprivate(fp) reduction(|:rd) linear(lin: step_sz)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void simd(int argc)
void simd(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#SIMDB:]]: x
// CHECK-DAG:  [[#SIMDB+1]]: [B3.[[#SIMDB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#SIMDB+2]]: argc
// CHECK-DAG:  [[#SIMDB+3]]: [B3.[[#SIMDB+2]]] = [B3.[[#SIMDB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#SIMD:]]: lin
// CHECK-DAG:  [[#SIMD+1]]: step_sz
// CHECK-DAG:  [[#SIMD+2]]: [B1.[[#SIMD+1]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#SIMD+3]]: #pragma omp simd linear(lin: step(step_sz))
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#SIMDB+3]]];
#pragma omp simd linear(lin: step_sz)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void tpf(int argc)
void tpf(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TPFB:]]: x
// CHECK-DAG:  [[#TPFB+1]]: [B3.[[#TPFB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TPFB+2]]: argc
// CHECK-DAG:  [[#TPFB+3]]: [B3.[[#TPFB+2]]] = [B3.[[#TPFB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TPF:]]: cond
// CHECK-DAG:  [[#TPF+1]]: [B1.[[#TPF]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TPF+2]]: [B1.[[#TPF+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TPF+3]]: fp
// CHECK-DAG:  [[#TPF+4]]: rd
// CHECK-DAG:  [[#TPF+5]]: lin
// CHECK-DAG:  [[#TPF+6]]: step_sz
// CHECK-DAG:  [[#TPF+7]]: [B1.[[#TPF+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TPF+8]]: map
// CHECK-DAG:  [[#TPF+9]]: [B3.[[#TPFB+2]]]
// CHECK-DAG:  [[#TPF+10]]: [B3.[[#TPFB]]]
// CHECK-DAG:  [[#TPF+11]]: #pragma omp target parallel for if(parallel: cond) firstprivate(fp) reduction(max: rd) linear(lin: step(step_sz)) map(tofrom: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TPFB+3]]];
#pragma omp target parallel for if(parallel:cond) firstprivate(fp) reduction(max:rd) linear(lin: step_sz) map(map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void tpfs(int argc)
void tpfs(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TPFSB:]]: x
// CHECK-DAG:  [[#TPFSB+1]]: [B3.[[#TPFSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TPFSB+2]]: argc
// CHECK-DAG:  [[#TPFSB+3]]: [B3.[[#TPFSB+2]]] = [B3.[[#TPFSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TPFS:]]: cond
// CHECK-DAG:  [[#TPFS+1]]: [B1.[[#TPFS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TPFS+2]]: [B1.[[#TPFS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TPFS+3]]: fp
// CHECK-DAG:  [[#TPFS+4]]: rd
// CHECK-DAG:  [[#TPFS+5]]: lin
// CHECK-DAG:  [[#TPFS+6]]: step_sz
// CHECK-DAG:  [[#TPFS+7]]: [B1.[[#TPFS+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TPFS+8]]: map
// CHECK-DAG:  [[#TPFS+9]]: [B3.[[#TPFSB+2]]]
// CHECK-DAG:  [[#TPFS+10]]: [B3.[[#TPFSB]]]
// CHECK-DAG:  [[#TPFS+11]]: #pragma omp target parallel for simd if(target: cond) firstprivate(fp) reduction(*: rd) linear(lin: step(step_sz)) map(tofrom: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TPFSB+3]]];
#pragma omp target parallel for simd if(target:cond) firstprivate(fp) reduction(*:rd) linear(lin: step_sz) map(tofrom:map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void ts(int argc)
void ts(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TSB:]]: x
// CHECK-DAG:  [[#TSB+1]]: [B3.[[#TSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TSB+2]]: argc
// CHECK-DAG:  [[#TSB+3]]: [B3.[[#TSB+2]]] = [B3.[[#TSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TS:]]: cond
// CHECK-DAG:  [[#TS+1]]: [B1.[[#TS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TS+2]]: [B1.[[#TS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TS+3]]: fp
// CHECK-DAG:  [[#TS+4]]: rd
// CHECK-DAG:  [[#TS+5]]: lin
// CHECK-DAG:  [[#TS+6]]: step_sz
// CHECK-DAG:  [[#TS+7]]: [B1.[[#TS+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TS+8]]: [B3.[[#TSB+2]]]
// CHECK-DAG:  [[#TS+9]]: [B3.[[#TSB]]]
// CHECK-DAG:  [[#TS+10]]: #pragma omp target simd if(cond) firstprivate(fp) reduction(+: rd) linear(lin: step(step_sz)) map(alloc: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TSB+3]]];
#pragma omp target simd if(cond) firstprivate(fp) reduction(+:rd) linear(lin: step_sz) map(alloc:map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void ttd(int argc)
void ttd(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TTDB:]]: x
// CHECK-DAG:  [[#TTDB+1]]: [B3.[[#TTDB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDB+2]]: argc
// CHECK-DAG:  [[#TTDB+3]]: [B3.[[#TTDB+2]]] = [B3.[[#TTDB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TTD:]]: cond
// CHECK-DAG:  [[#TTD+1]]: [B1.[[#TTD]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTD+2]]: [B1.[[#TTD+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TTD+3]]: fp
// CHECK-DAG:  [[#TTD+4]]: rd
// CHECK-DAG:  [[#TTD+5]]: [B3.[[#TTDB+2]]]
// CHECK-DAG:  [[#TTD+6]]: [B3.[[#TTDB]]]
// CHECK-DAG:  [[#TTD+7]]: #pragma omp target teams distribute if(cond) firstprivate(fp) reduction(+: rd) map(alloc: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TTDB+3]]];
#pragma omp target teams distribute if(cond) firstprivate(fp) reduction(+:rd) map(alloc:map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void ttdpf(int argc)
void ttdpf(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TTDPFB:]]: x
// CHECK-DAG:  [[#TTDPFB+1]]: [B3.[[#TTDPFB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDPFB+2]]: argc
// CHECK-DAG:  [[#TTDPFB+3]]: [B3.[[#TTDPFB+2]]] = [B3.[[#TTDPFB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TTDPF:]]: cond
// CHECK-DAG:  [[#TTDPF+1]]: [B1.[[#TTDPF]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDPF+2]]: [B1.[[#TTDPF+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TTDPF+3]]: fp
// CHECK-DAG:  [[#TTDPF+4]]: rd
// CHECK-DAG:  [[#TTDPF+5]]: [B3.[[#TTDPFB+2]]]
// CHECK-DAG:  [[#TTDPF+6]]: [B3.[[#TTDPFB]]]
// CHECK-DAG:  [[#TTDPF+7]]: #pragma omp target teams distribute parallel for if(cond) firstprivate(fp) reduction(+: rd) map(alloc: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TTDPFB+3]]];
#pragma omp target teams distribute parallel for if(cond) firstprivate(fp) reduction(+:rd) map(alloc:map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void ttdpfs(int argc)
void ttdpfs(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TTDPFSB:]]: x
// CHECK-DAG:  [[#TTDPFSB+1]]: [B3.[[#TTDPFSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDPFSB+2]]: argc
// CHECK-DAG:  [[#TTDPFSB+3]]: [B3.[[#TTDPFSB+2]]] = [B3.[[#TTDPFSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TTDPFS:]]: cond
// CHECK-DAG:  [[#TTDPFS+1]]: [B1.[[#TTDPFS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDPFS+2]]: [B1.[[#TTDPFS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TTDPFS+3]]: fp
// CHECK-DAG:  [[#TTDPFS+4]]: rd
// CHECK-DAG:  [[#TTDPFS+5]]: [B3.[[#TTDPFSB+2]]]
// CHECK-DAG:  [[#TTDPFS+6]]: [B3.[[#TTDPFSB]]]
// CHECK-DAG:  [[#TTDPFS+7]]: #pragma omp target teams distribute parallel for simd if(parallel: cond) firstprivate(fp) reduction(+: rd) map(from: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TTDPFSB+3]]];
#pragma omp target teams distribute parallel for simd if(parallel:cond) firstprivate(fp) reduction(+:rd) map(from:map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void ttds(int argc)
void ttds(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TTDSB:]]: x
// CHECK-DAG:  [[#TTDSB+1]]: [B3.[[#TTDSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDSB+2]]: argc
// CHECK-DAG:  [[#TTDSB+3]]: [B3.[[#TTDSB+2]]] = [B3.[[#TTDSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TTDS:]]: cond
// CHECK-DAG:  [[#TTDS+1]]: [B1.[[#TTDS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDS+2]]: [B1.[[#TTDS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TTDS+3]]: fp
// CHECK-DAG:  [[#TTDS+4]]: rd
// CHECK-DAG:  [[#TTDS+5]]: map
// CHECK-DAG:  [[#TTDS+6]]: [B3.[[#TTDSB+2]]]
// CHECK-DAG:  [[#TTDS+7]]: [B3.[[#TTDSB]]]
// CHECK-DAG:  [[#TTDS+8]]: #pragma omp target teams distribute simd if(cond) firstprivate(fp) reduction(+: rd) map(tofrom: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TTDPFSB+3]]];
#pragma omp target teams distribute simd if(cond) firstprivate(fp) reduction(+:rd) map(map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void tl(int argc)
void tl(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TLB:]]: x
// CHECK-DAG:  [[#TLB+1]]: [B3.[[#TLB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TLB+2]]: argc
// CHECK-DAG:  [[#TLB+3]]: [B3.[[#TLB+2]]] = [B3.[[#TLB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TL:]]: cond
// CHECK-DAG:  [[#TL+1]]: [B1.[[#TL]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TL+2]]: [B1.[[#TL+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TL+3]]: fp
// CHECK-DAG:  [[#TL+4]]: rd
// CHECK-DAG:  [[#TL+5]]: [B3.[[#TLB+2]]]
// CHECK-DAG:  [[#TL+6]]: [B3.[[#TLB]]]
// CHECK-DAG:  [[#TL+7]]: #pragma omp taskloop if(cond) firstprivate(fp) reduction(+: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TLB+3]]];
#pragma omp taskloop if(cond) firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void maskedtaskloop(int argc)
void maskedtaskloop(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#MTLB:]]: x
// CHECK-DAG:  [[#MTLB+1]]: [B3.[[#MTLB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#MTLB+2]]: argc
// CHECK-DAG:  [[#MTLB+3]]: [B3.[[#MTLB+2]]] = [B3.[[#MTLB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#MTL:]]: cond
// CHECK-DAG:  [[#MTL+1]]: [B1.[[#MTL]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#MTL+2]]: [B1.[[#MTL+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#MTL+3]]: fp
// CHECK-DAG:  [[#MTL+4]]: rd
// CHECK-DAG:  [[#MTL+5]]: [B3.[[#MTLB+2]]]
// CHECK-DAG:  [[#MTL+6]]: [B3.[[#MTLB]]]
// CHECK-DAG:  [[#MTL+7]]: #pragma omp masked taskloop if(cond) firstprivate(fp) reduction(+: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#MTLB+3]]];
#pragma omp masked taskloop if(cond) firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void parallelmaskedtaskloop(int argc)
void parallelmaskedtaskloop(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#PMTLB:]]: x
// CHECK-DAG:  [[#PMTLB+1]]: [B3.[[#PMTLB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PMTLB+2]]: argc
// CHECK-DAG:  [[#PMTLB+3]]: [B3.[[#PMTLB+2]]] = [B3.[[#PMTLB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#PMTL:]]: cond
// CHECK-DAG:  [[#PMTL+1]]: [B1.[[#PMTL]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PMTL+2]]: [B1.[[#PMTL+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#PMTL+3]]: fp
// CHECK-DAG:  [[#PMTL+4]]: rd
// CHECK-DAG:  [[#PMTL+5]]: [B3.[[#PMTLB+2]]]
// CHECK-DAG:  [[#PMTL+6]]: [B3.[[#PMTLB]]]
// CHECK-DAG:  [[#PMTL+7]]: #pragma omp parallel masked taskloop if(cond) firstprivate(fp) reduction(+: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#PMTLB+3]]];
#pragma omp parallel masked taskloop if(cond) firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void parallelmaskedtasksimdloop(int argc)
void parallelmaskedtasksimdloop(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#PMTLSB:]]: x
// CHECK-DAG:  [[#PMTLSB+1]]: [B3.[[#PMTLSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PMTLSB+2]]: argc
// CHECK-DAG:  [[#PMTLSB+3]]: [B3.[[#PMTLSB+2]]] = [B3.[[#PMTLSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#PMTLS:]]: cond
// CHECK-DAG:  [[#PMTLS+1]]: [B1.[[#PMTLS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PMTLS+2]]: [B1.[[#PMTLS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#PMTLS+3]]: fp
// CHECK-DAG:  [[#PMTLS+4]]: rd
// CHECK-DAG:  [[#PMTLS+5]]: [B3.[[#PMTLSB+2]]]
// CHECK-DAG:  [[#PMTLS+6]]: [B3.[[#PMTLSB]]]
// CHECK-DAG:  [[#PMTLS+7]]: #pragma omp parallel masked taskloop simd if(cond) firstprivate(fp) reduction(+: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#PMTLSB+3]]];
#pragma omp parallel masked taskloop simd if(cond) firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void tls(int argc)
void tls(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TLSB:]]: x
// CHECK-DAG:  [[#TLSB+1]]: [B3.[[#TLSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TLSB+2]]: argc
// CHECK-DAG:  [[#TLSB+3]]: [B3.[[#TLSB+2]]] = [B3.[[#TLSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TLS:]]: cond
// CHECK-DAG:  [[#TLS+1]]: [B1.[[#TLS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TLS+2]]: [B1.[[#TLS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TLS+3]]: fp
// CHECK-DAG:  [[#TLS+4]]: rd
// CHECK-DAG:  [[#TLS+5]]: lin
// CHECK-DAG:  [[#TLS+6]]: step_sz
// CHECK-DAG:  [[#TLS+7]]: [B1.[[#TLS+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TLS+8]]: [B3.[[#TLSB+2]]]
// CHECK-DAG:  [[#TLS+9]]: [B3.[[#TLSB]]]
// CHECK-DAG:  [[#TLS+10]]: #pragma omp taskloop simd if(cond) firstprivate(fp) reduction(+: rd) linear(lin: step(step_sz))
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TLSB+3]]];
#pragma omp taskloop simd if(cond) firstprivate(fp) reduction(+:rd) linear(lin: step_sz)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void maskedtaskloopsimd(int argc)
void maskedtaskloopsimd(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#MTLSB:]]: x
// CHECK-DAG:  [[#MTLSB+1]]: [B3.[[#MTLSB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#MTLSB+2]]: argc
// CHECK-DAG:  [[#MTLSB+3]]: [B3.[[#MTLSB+2]]] = [B3.[[#MTLSB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#MTLS:]]: cond
// CHECK-DAG:  [[#MTLS+1]]: [B1.[[#MTLS]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#MTLS+2]]: [B1.[[#MTLS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#MTLS+3]]: fp
// CHECK-DAG:  [[#MTLS+4]]: rd
// CHECK-DAG:  [[#MTLS+5]]: lin
// CHECK-DAG:  [[#MTLS+6]]: step_sz
// CHECK-DAG:  [[#MTLS+7]]: [B1.[[#MTLS+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#MTLS+8]]: [B3.[[#MTLSB+2]]]
// CHECK-DAG:  [[#MTLS+9]]: [B3.[[#MTLSB]]]
// CHECK-DAG:  [[#MTLS+10]]: #pragma omp masked taskloop simd if(cond) firstprivate(fp) reduction(+: rd) linear(lin: step(step_sz))
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#MTLSB+3]]];
#pragma omp masked taskloop simd if(cond) firstprivate(fp) reduction(+:rd) linear(lin: step_sz)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void tdpf(int argc)
void tdpf(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TDPF:]]: [B1.{{.+}}]
// CHECK-DAG:  [[#TDPF+1]]: [B1.[[#TDPF+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TDPF+2]]: [B1.[[#TDPF+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TDPF+3]]: [B1.[[#TDPF+7]]]
// CHECK-DAG:  [[#TDPF+4]]: [B1.[[#TDPF+8]]]
// CHECK-DAG:  [[#TDPF+5]]: #pragma omp teams distribute parallel for if(cond) firstprivate(fp) reduction(+: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TDPFB:]]];
// CHECK-DAG:  [[#TDPF+6]]: cond
// CHECK-DAG:  [[#TDPF+7]]: fp
// CHECK-DAG:  [[#TDPF+8]]: rd
// CHECK-DAG:  [[#TDPF+9]]: argc
// CHECK-DAG:  [[#TDPF+10]]: x
// CHECK-DAG:  [[#TDPF+11]]: #pragma omp target
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TDPFB-3]]: x
// CHECK-DAG:  [[#TDPFB-2]]: [B3.[[#TDPFB-3]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TDPFB-1]]: argc
// CHECK-DAG:  [[#TDPFB]]: [B3.[[#TDPFB-1]]] = [B3.[[#TDPFB-2]]]
#pragma omp target
#pragma omp teams distribute parallel for if(cond) firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void tdpfs(int argc)
void tdpfs(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TDPFS:]]: [B1.{{.+}}]
// CHECK-DAG:  [[#TDPFS+1]]: [B1.[[#TDPFS+6]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TDPFS+2]]: [B1.[[#TDPFS+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TDPFS+3]]: [B1.[[#TDPFS+7]]]
// CHECK-DAG:  [[#TDPFS+4]]: [B1.[[#TDPFS+8]]]
// CHECK-DAG:  [[#TDPFS+5]]: #pragma omp teams distribute parallel for simd if(cond) firstprivate(fp) reduction(+: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TDPFSB:]]];
// CHECK-DAG:  [[#TDPFS+6]]: cond
// CHECK-DAG:  [[#TDPFS+7]]: fp
// CHECK-DAG:  [[#TDPFS+8]]: rd
// CHECK-DAG:  [[#TDPFS+9]]: argc
// CHECK-DAG:  [[#TDPFS+10]]: x
// CHECK-DAG:  [[#TDPFS+11]]: #pragma omp target
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TDPFSB-3]]: x
// CHECK-DAG:  [[#TDPFSB-2]]: [B3.[[#TDPFSB-3]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TDPFSB-1]]: argc
// CHECK-DAG:  [[#TDPFSB]]: [B3.[[#TDPFSB-1]]] = [B3.[[#TDPFSB-2]]]
#pragma omp target
#pragma omp teams distribute parallel for simd if(cond) firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void tds(int argc)
void tds(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TDS:]]: #pragma omp teams distribute simd firstprivate(fp) reduction(+: rd)
// CHECK-DAG:  [[#TDS-2]]: [B1.[[#TDS+1]]]
// CHECK-DAG:  [[#TDS-1]]: [B1.[[#TDS+2]]]
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TDSB:]]];
// CHECK-DAG:  [[#TDS+1]]: fp
// CHECK-DAG:  [[#TDS+2]]: rd
// CHECK-DAG:  [[#TDS+3]]: argc
// CHECK-DAG:  [[#TDS+4]]: x
// CHECK-DAG:  [[#TDS+5]]: #pragma omp target
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TDSB-3]]: x
// CHECK-DAG:  [[#TDSB-2]]: [B3.[[#TDSB-3]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TDSB-1]]: argc
// CHECK-DAG:  [[#TDSB]]: [B3.[[#TDSB-1]]] = [B3.[[#TDSB-2]]]
#pragma omp target
#pragma omp teams distribute simd firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void teamsloop(int argc)
void teamsloop(int argc) {
  int x, cond, fp, rd, lin, step_sz, map;
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TDS:]]: #pragma omp teams loop firstprivate(fp) reduction(+: rd)
// CHECK-DAG:  [[#TDS-2]]: [B1.[[#TDS+1]]]
// CHECK-DAG:  [[#TDS-1]]: [B1.[[#TDS+2]]]
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TDSB:]]];
// CHECK-DAG:  [[#TDS+1]]: fp
// CHECK-DAG:  [[#TDS+2]]: rd
// CHECK-DAG:  [[#TDS+3]]: argc
// CHECK-DAG:  [[#TDS+4]]: x
// CHECK-DAG:  [[#TDS+5]]: #pragma omp target
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TDSB-3]]: x
// CHECK-DAG:  [[#TDSB-2]]: [B3.[[#TDSB-3]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TDSB-1]]: argc
// CHECK-DAG:  [[#TDSB]]: [B3.[[#TDSB-1]]] = [B3.[[#TDSB-2]]]
#pragma omp target
#pragma omp teams loop firstprivate(fp) reduction(+:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void targetteamsloop(int argc)
void targetteamsloop(int argc) {
  int x, cond, fp, rd, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TTDB:]]: x
// CHECK-DAG:  [[#TTDB+1]]: [B3.[[#TTDB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDB+2]]: argc
// CHECK-DAG:  [[#TTDB+3]]: [B3.[[#TTDB+2]]] = [B3.[[#TTDB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TTD:]]: cond
// CHECK-DAG:  [[#TTD+1]]: [B1.[[#TTD]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTD+2]]: [B1.[[#TTD+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TTD+3]]: fp
// CHECK-DAG:  [[#TTD+4]]: rd
// CHECK-DAG:  [[#TTD+5]]: [B3.[[#TTDB+2]]]
// CHECK-DAG:  [[#TTD+6]]: [B3.[[#TTDB]]]
// CHECK-DAG:  [[#TTD+7]]: #pragma omp target teams loop if(cond) firstprivate(fp) reduction(+: rd) map(alloc: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TTDB+3]]];
#pragma omp target teams loop if(cond) firstprivate(fp) reduction(+:rd) map(alloc:map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void parallelloop(int argc)
void parallelloop(int argc) {
  int x, cond, fp, rd;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#PFB:]]: x
// CHECK-DAG:  [[#PFB+1]]: [B3.[[#PFB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PFB+2]]: argc
// CHECK-DAG:  [[#PFB+3]]: [B3.[[#PFB+2]]] = [B3.[[#PFB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#PF:]]: cond
// CHECK-DAG:  [[#PF+1]]: [B1.[[#PF]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#PF+2]]: [B1.[[#PF+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#PF+3]]: fp
// CHECK-DAG:  [[#PF+4]]: rd
// CHECK-DAG:  [[#PF+5]]: #pragma omp parallel loop if(cond) firstprivate(fp) reduction(&: rd)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#PFB+3]]];
#pragma omp parallel loop if(cond) firstprivate(fp) reduction(&:rd)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void targetparallelloop(int argc)
void targetparallelloop(int argc) {
  int x, cond, fp, rd, map;
// CHECK-DAG:   [B3]
// CHECK-DAG:  [[#TTDB:]]: x
// CHECK-DAG:  [[#TTDB+1]]: [B3.[[#TTDB]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTDB+2]]: argc
// CHECK-DAG:  [[#TTDB+3]]: [B3.[[#TTDB+2]]] = [B3.[[#TTDB+1]]]
// CHECK-DAG:   [B1]
// CHECK-DAG:  [[#TTD:]]: cond
// CHECK-DAG:  [[#TTD+1]]: [B1.[[#TTD]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-DAG:  [[#TTD+2]]: [B1.[[#TTD+1]]] (ImplicitCastExpr, IntegralToBoolean, _Bool)
// CHECK-DAG:  [[#TTD+3]]: fp
// CHECK-DAG:  [[#TTD+4]]: rd
// CHECK-DAG:  [[#TTD+5]]: [B3.[[#TTDB+2]]]
// CHECK-DAG:  [[#TTD+6]]: [B3.[[#TTDB]]]
// CHECK-DAG:  [[#TTD+7]]: #pragma omp target parallel loop if(cond) firstprivate(fp) reduction(+: rd) map(alloc: map)
// CHECK-DAG:    for (int i = 0;
// CHECK-DAG:        [B3.[[#TTDB+3]]];
#pragma omp target parallel loop if(cond) firstprivate(fp) reduction(+:rd) map(alloc:map)
  for (int i = 0; i < 10; ++i)
    argc = x;
}

// CHECK-LABEL:  void parallelmasked(int argc)
void parallelmasked(int argc) {
  int x = 0;
// CHECK:        [B1]
// CHECK-NEXT:   1: 0
// CHECK-NEXT:   2: int x = 0;
// CHECK-NEXT:   [[#MASKED:]]: x
// CHECK-NEXT:   [[#MASKED+1]]: [B1.[[#MASKED]]] (ImplicitCastExpr, LValueToRValue, int)
// CHECK-NEXT:   [[#MASKED+2]]: argc
// CHECK-NEXT:   [[#MASKED+3]]: [B1.[[#MASKED+2]]] = [B1.[[#MASKED+1]]]
// CHECK-NEXT:   [[#MASKED+4]]: #pragma omp parallel masked
#pragma omp parallel masked
  argc = x;
}
#endif  // _OPENMP