187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm -fexceptions -fcxx-exceptions -o - < %s | FileCheck %s
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t < %s
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -debug-info-kind=limited -std=c++11 -include-pch %t -verify -emit-llvm -o - < %s | FileCheck %s
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm -o - < %s | FileCheck %s --check-prefix=TERM_DEBUG
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// REQUIRES: x86-registered-target
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-no-diagnostics
787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#ifndef HEADER
887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define HEADER
987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarlong long get_val() { return 0; }
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainardouble *g_ptr;
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-LABEL: define {{.*void}} @{{.*}}simple{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid simple(float *a, float *b, float *c, float *d) {
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_4(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i32* [[LB:%[^,]+]], i32* [[UB:%[^,]+]], i32* [[STRIDE:%[^,]+]], i32 1, i32 1)
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i32 [[UB_VAL]], 5
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i32 [ 5, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[UP]], i32* [[UB]],
2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i32, i32* [[LB]],
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[LB_VAL]], i32* [[OMP_IV:%[^,]+]],
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV:%.+]] = load i32, i32* [[OMP_IV]]
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]]
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP:%.+]] = icmp sle i32 [[IV]], [[UB_VAL]]
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP]], label %[[SIMPLE_LOOP1_BODY:.+]], label %[[SIMPLE_LOOP1_END:[^,]+]]
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (int i = 3; i < 32; i += 5) {
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP1_BODY]]
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate i from IV:
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1_1:%.+]] = load i32, i32* [[OMP_IV]]{{.*}}
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CALC_I_1:%.+]] = mul nsw i32 [[IV1_1]], 5
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_I_2:%.+]] = add nsw i32 3, [[CALC_I_1]]
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[CALC_I_2]], i32* [[LC_I:.+]]
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ... loop body ...
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// End of body: store into a[i]:
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store float [[RESULT:%.+]], float*
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a[i] = b[i] * c[i] * d[i];
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1_2:%.+]] = load i32, i32* [[OMP_IV]]
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD1_2:%.+]] = add nsw i32 [[IV1_2]], 1
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[ADD1_2]], i32* [[OMP_IV]]
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// br label %{{.+}}, !llvm.loop !{{.+}}
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP1_END]]
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  long long k = get_val();
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp for simd linear(k : 3) schedule(simd, nonmonotonic: dynamic)
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[K0:%.+]] = call {{.*}}i64 @{{.*}}get_val
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i64 [[K0]], i64* [[K_VAR:%[^,]+]]
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[K0LOAD:%.+]] = load i64, i64* [[K_VAR]]
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i64 [[K0LOAD]], i64* [[LIN0:%[^,]+]]
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call void @__kmpc_dispatch_init_4(%ident_t* {{.+}}, i32 %{{.+}}, i32 1073741859, i32 0, i32 8, i32 1, i32 1)
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[NEXT:%.+]] = call i32 @__kmpc_dispatch_next_4(%ident_t* {{.+}}, i32 %{{.+}}, i32* %{{.+}}, i32* [[LB:%.+]], i32* [[UB:%.+]], i32* %{{.+}})
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[COND:%.+]] = icmp ne i32 [[NEXT]], 0
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[COND]], label %[[CONT:.+]], label %[[END:.+]]
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CONT]]
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i32, i32* [[LB]],
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[LB_VAL]], i32* [[OMP_IV2:%[^,]+]],
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[IV2:%.+]] = load i32, i32* [[OMP_IV2]]{{.*}}!llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID:[0-9]+]]
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]]{{.*}}!llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID]]
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP2:%.+]] = icmp sle i32 [[IV2]], [[UB_VAL]]
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP2]], label %[[SIMPLE_LOOP2_BODY:.+]], label %[[SIMPLE_LOOP2_END:[^,]+]]
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (int i = 10; i > 1; i--) {
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP2_BODY]]
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate i from IV:
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[IV2_0:%.+]] = load i32, i32* [[OMP_IV2]]{{.*}}!llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID]]
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// FIXME: It is interesting, why the following "mul 1" was not constant folded?
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[IV2_1:%.+]] = mul nsw i32 [[IV2_0]], 1
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_I_1:%.+]] = sub nsw i32 10, [[IV2_1]]
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[LC_I_1]], i32* {{.+}}, !llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID]]
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LIN0_1:%.+]] = load i64, i64* [[LIN0]]{{.*}}!llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID]]
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[IV2_2:%.+]] = load i32, i32* [[OMP_IV2]]{{.*}}!llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID]]
8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LIN_MUL1:%.+]] = mul nsw i32 [[IV2_2]], 3
8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LIN_EXT1:%.+]] = sext i32 [[LIN_MUL1]] to i64
8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LIN_ADD1:%.+]] = add nsw i64 [[LIN0_1]], [[LIN_EXT1]]
8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Update of the privatized version of linear variable!
9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i64 [[LIN_ADD1]], i64* [[K_PRIVATIZED:%[^,]+]]
9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a[k]++;
9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    k = k + 3;
9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[IV2_2:%.+]] = load i32, i32* [[OMP_IV2]]{{.*}}!llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID]]
9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD2_2:%.+]] = add nsw i32 [[IV2_2]], 1
9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[ADD2_2]], i32* [[OMP_IV2]]{{.*}}!llvm.mem.parallel_loop_access ![[SIMPLE_LOOP2_ID]]
9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// br label {{.+}}, !llvm.loop ![[SIMPLE_LOOP2_ID]]
9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP2_END]]
9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Update linear vars after loop, as the loop was operating on a private version.
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LIN0_2:%.+]] = load i64, i64* [[LIN0]]
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LIN_ADD2:%.+]] = add nsw i64 [[LIN0_2]], 27
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i64 [[LIN_ADD2]], i64* [[K_VAR]]
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int lin = 12;
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd linear(lin : get_val()), linear(g_ptr)
10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Init linear private var.
11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 12, i32* [[LIN_VAR:%[^,]+]]
11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LIN_LOAD:%.+]] = load i32, i32* [[LIN_VAR]]
11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[LIN_LOAD]], i32* [[LIN_START:%[^,]+]]
11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Remember linear step.
11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CALL_VAL:%.+]] = invoke
11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[CALL_VAL]], i64* [[LIN_STEP:%[^,]+]]
11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[GLIN_LOAD:%.+]] = load double*, double** [[GLIN_VAR:@[^,]+]]
11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store double* [[GLIN_LOAD]], double** [[GLIN_START:%[^,]+]]
11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_8u(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i64* [[LB:%[^,]+]], i64* [[UB:%[^,]+]], i64* [[STRIDE:%[^,]+]], i64 1, i64 1)
12187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
12287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp ugt i64 [[UB_VAL]], 3
12387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
12487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i64 [ 3, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[UP]], i64* [[UB]],
13287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]],
13387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[LB_VAL]], i64* [[OMP_IV3:%[^,]+]],
13487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV3:%.+]] = load i64, i64* [[OMP_IV3]]
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]]
13787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP3:%.+]] = icmp ule i64 [[IV3]], [[UB_VAL]]
13887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP3]], label %[[SIMPLE_LOOP3_BODY:.+]], label %[[SIMPLE_LOOP3_END:[^,]+]]
13987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (unsigned long long it = 2000; it >= 600; it-=400) {
14087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP3_BODY]]
14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate it from IV:
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV3_0:%.+]] = load i64, i64* [[OMP_IV3]]
14387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_1:%.+]] = mul i64 [[IV3_0]], 400
14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_2:%.+]] = sub i64 2000, [[LC_IT_1]]
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[LC_IT_2]], i64*
14687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
14787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Linear start and step are used to calculate current value of the linear variable.
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NOT: store i32 {{.+}}, i32* [[LIN_VAR]],
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[IV3_1:%.+]] = load i64, i64* [[OMP_IV3]]
15387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[MUL:%.+]] = mul i64 [[IV3_1]], 1
15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[GEP:%.+]] = getelementptr{{.*}}[[GLINSTART]]
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store double* [[GEP]], double** [[G_PTR_CUR:%[^,]+]]
15687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    *g_ptr++ = 0.0;
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[GEP_VAL:%.+]] = load double{{.*}}[[G_PTR_CUR]]
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store double{{.*}}[[GEP_VAL]]
15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a[it + lin]++;
16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FLT_INC:%.+]] = fadd float
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store float [[FLT_INC]],
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV3_2:%.+]] = load i64, i64* [[OMP_IV3]]
16387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD3_2:%.+]] = add i64 [[IV3_2]], 1
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[ADD3_2]], i64* [[OMP_IV3]]
16587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
16687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP3_END]]
16787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
16887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
16987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Linear start and step are used to calculate final value of the linear variables.
17087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LINSTART:.+]] = load i32, i32* [[LIN_START]]
17187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LINSTEP:.+]] = load i64, i64* [[LIN_STEP]]
17287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 {{.+}}, i32* [[LIN_VAR]],
17387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[GLINSTART:.+]] = load double*, double** [[GLIN_START]]
17487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store double* {{.*}}[[GLIN_VAR]]
17587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
17687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
17787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd
17887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_4(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i32* [[LB:%[^,]+]], i32* [[UB:%[^,]+]], i32* [[STRIDE:%[^,]+]], i32 1, i32 1)
17987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
18087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i32 [[UB_VAL]], 3
18187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
18287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
18387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
18487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
18587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
18687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
18787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
18887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i32 [ 3, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
18987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[UP]], i32* [[UB]],
19087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i32, i32* [[LB]],
19187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[LB_VAL]], i32* [[OMP_IV4:%[^,]+]],
19287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV4:%.+]] = load i32, i32* [[OMP_IV4]]
1944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]]
19587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP4:%.+]] = icmp sle i32 [[IV4]], [[UB_VAL]]
19687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP4]], label %[[SIMPLE_LOOP4_BODY:.+]], label %[[SIMPLE_LOOP4_END:[^,]+]]
19787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (short it = 6; it <= 20; it-=-4) {
19887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP4_BODY]]
19987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate it from IV:
2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV4_0:%.+]] = load i32, i32* [[OMP_IV4]]
20187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_1:%.+]] = mul nsw i32 [[IV4_0]], 4
20287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_2:%.+]] = add nsw i32 6, [[LC_IT_1]]
20387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_3:%.+]] = trunc i32 [[LC_IT_2]] to i16
2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i16 [[LC_IT_3]], i16*
20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV4_2:%.+]] = load i32, i32* [[OMP_IV4]]
20787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD4_2:%.+]] = add nsw i32 [[IV4_2]], 1
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[ADD4_2]], i32* [[OMP_IV4]]
20987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
21087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP4_END]]
21187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
21287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
21387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
21487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd
21587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_4(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i32* [[LB:%[^,]+]], i32* [[UB:%[^,]+]], i32* [[STRIDE:%[^,]+]], i32 1, i32 1)
21687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
21787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i32 [[UB_VAL]], 25
21887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
21987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
22087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
22187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
22287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
22387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
22487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
22587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i32 [ 25, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
22687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[UP]], i32* [[UB]],
22787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i32, i32* [[LB]],
22887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[LB_VAL]], i32* [[OMP_IV5:%[^,]+]],
22987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV5:%.+]] = load i32, i32* [[OMP_IV5]]
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]]
23287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP5:%.+]] = icmp sle i32 [[IV5]], [[UB_VAL]]
23387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP5]], label %[[SIMPLE_LOOP5_BODY:.+]], label %[[SIMPLE_LOOP5_END:[^,]+]]
23487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (unsigned char it = 'z'; it >= 'a'; it+=-1) {
23587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP5_BODY]]
23687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate it from IV:
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV5_0:%.+]] = load i32, i32* [[OMP_IV5]]
23887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[IV5_1:%.+]] = mul nsw i32 [[IV5_0]], 1
23987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_1:%.+]] = sub nsw i32 122, [[IV5_1]]
24087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_2:%.+]] = trunc i32 [[LC_IT_1]] to i8
2414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i8 [[LC_IT_2]], i8*
24287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV5_2:%.+]] = load i32, i32* [[OMP_IV5]]
24487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD5_2:%.+]] = add nsw i32 [[IV5_2]], 1
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[ADD5_2]], i32* [[OMP_IV5]]
24687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
24787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP5_END]]
24887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
24987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
25087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
25187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NOT: mul i32 %{{.+}}, 10
25287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd
25387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (unsigned i=100; i<10; i+=10) {
25487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
25587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
25687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int A;
25787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp parallel
25887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  {
25987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: store i32 -1, i32* [[A:%.+]],
26087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  A = -1;
26187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd lastprivate(A)
26287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_8(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i64* [[LB:%[^,]+]], i64* [[UB:%[^,]+]], i64* [[STRIDE:%[^,]+]], i64 1, i64 1)
26387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
26487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i64 [[UB_VAL]], 6
26587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
26687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
26787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
26887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
26987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
27087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
27287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i64 [ 6, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
27387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[UP]], i64* [[UB]],
27487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]],
27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[LB_VAL]], i64* [[OMP_IV7:%[^,]+]],
27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SIMD_LOOP7_COND:[^,]+]]
27887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMD_LOOP7_COND]]
2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[IV7:%.+]] = load i64, i64* [[OMP_IV7]]
2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[UB_VAL:%.+]] = load i64, i64* [[UB]]
28187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP7:%.+]] = icmp sle i64 [[IV7]], [[UB_VAL]]
28287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP7]], label %[[SIMPLE_LOOP7_BODY:.+]], label %[[SIMPLE_LOOP7_END:[^,]+]]
28387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (long long i = -10; i < 10; i += 3) {
28487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP7_BODY]]
28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate i from IV:
2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV7_0:%.+]] = load i64, i64* [[OMP_IV7]]
28787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_1:%.+]] = mul nsw i64 [[IV7_0]], 3
28887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_2:%.+]] = add nsw i64 -10, [[LC_IT_1]]
2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[LC_IT_2]], i64* [[LC:%[^,]+]],
2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[LC_VAL:%.+]] = load i64, i64* [[LC]]
29187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CONV:%.+]] = trunc i64 [[LC_VAL]] to i32
2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[CONV]], i32* [[A_PRIV:%[^,]+]],
29387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    A = i;
2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV7_2:%.+]] = load i64, i64* [[OMP_IV7]]
29587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD7_2:%.+]] = add nsw i64 [[IV7_2]], 1
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[ADD7_2]], i64* [[OMP_IV7]]
29787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
29887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP7_END]]
29987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
30087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: load i32, i32*
30187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: icmp ne i32 %{{.+}}, 0
30287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 %{{.+}}, label
30387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[A_PRIV_VAL:%.+]] = load i32, i32* [[A_PRIV]],
30487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[A_PRIV_VAL]], i32* %{{.+}},
30587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br label
30687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
30787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
30887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int R;
30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp parallel
31087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  {
31187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // CHECK: store i32 -1, i32* [[R:%[^,]+]],
31287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  R = -1;
31387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 1, i32* [[R_PRIV:%[^,]+]],
31487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd reduction(*:R)
31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_8(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i64* [[LB:%[^,]+]], i64* [[UB:%[^,]+]], i64* [[STRIDE:%[^,]+]], i64 1, i64 1)
31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
31787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i64 [[UB_VAL]], 6
31887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
31987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
32087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
32187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
32287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
32387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
32487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
32587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i64 [ 6, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
32687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[UP]], i64* [[UB]],
32787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]],
32887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[LB_VAL]], i64* [[OMP_IV8:%[^,]+]],
32987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
33087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SIMD_LOOP8_COND:[^,]+]]
33187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMD_LOOP8_COND]]
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[IV8:%.+]] = load i64, i64* [[OMP_IV8]]
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[UB_VAL:%.+]] = load i64, i64* [[UB]]
33487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP8:%.+]] = icmp sle i64 [[IV8]], [[UB_VAL]]
33587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP8]], label %[[SIMPLE_LOOP8_BODY:.+]], label %[[SIMPLE_LOOP8_END:[^,]+]]
33687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (long long i = -10; i < 10; i += 3) {
33787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP8_BODY]]
33887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate i from IV:
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV8_0:%.+]] = load i64, i64* [[OMP_IV8]]
34087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_1:%.+]] = mul nsw i64 [[IV8_0]], 3
34187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[LC_IT_2:%.+]] = add nsw i64 -10, [[LC_IT_1]]
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[LC_IT_2]], i64* [[LC:%[^,]+]],
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[LC_VAL:%.+]] = load i64, i64* [[LC]]
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store i32 %{{.+}}, i32* [[R_PRIV]],
34587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    R *= i;
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV8_2:%.+]] = load i64, i64* [[OMP_IV8]]
34787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD8_2:%.+]] = add nsw i64 [[IV8_2]], 1
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[ADD8_2]], i64* [[OMP_IV8]]
34987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
35087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SIMPLE_LOOP8_END]]
35187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
35287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call i32 @__kmpc_reduce(
35387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[R_PRIV_VAL:%.+]] = load i32, i32* [[R_PRIV]],
35487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[RED:%.+]] = mul nsw i32 %{{.+}}, [[R_PRIV_VAL]]
35587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[RED]], i32* %{{.+}},
35687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: call void @__kmpc_end_reduce(
35787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
35887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
35987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
36087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
36187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <class T, unsigned K> T tfoo(T a) { return a + K; }
36287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
36387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename T, unsigned N>
36487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint templ1(T a, T *z) {
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp for simd collapse(N) schedule(simd: static, N)
36687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (int i = 0; i < N * 2; i++) {
36787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (long long j = 0; j < (N + N + N + N); j += 2) {
36887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      z[i + j] = a + tfoo<T, N>(i + j);
36987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
37087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
37187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
37287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
37387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
37487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Instatiation templ1<float,2>
37587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-LABEL: define {{.*i32}} @{{.*}}templ1{{.*}}(float {{.+}}, float* {{.+}})
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_8(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 45, i32* %{{[^,]+}}, i64* [[LB:%[^,]+]], i64* [[UB:%[^,]+]], i64* [[STRIDE:%[^,]+]], i64 1, i64 2)
37787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
37887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i64 [[UB_VAL]], 15
37987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
38087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
38187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
38287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
38387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
38487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
38587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
38687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i64 [ 15, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
38787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[UP]], i64* [[UB]],
38887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]],
38987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[LB_VAL]], i64* [[T1_OMP_IV:%[^,]+]],
39087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
39187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ...
3924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: icmp sle i64
3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV:%.+]] = load i64, i64* [[T1_OMP_IV]]
3944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[UB_VAL:%.+]] = load i64, i64* [[UB]]
39587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP1:%.+]] = icmp sle i64 [[IV]], [[UB_VAL]]
39687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP1]], label %[[T1_BODY:.+]], label %[[T1_END:[^,]+]]
39787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[T1_BODY]]
39887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Loop counters i and j updates:
3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1:%.+]] = load i64, i64* [[T1_OMP_IV]]
40087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[I_1:%.+]] = sdiv i64 [[IV1]], 4
40187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[I_1_MUL1:%.+]] = mul nsw i64 [[I_1]], 1
40287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[I_1_ADD0:%.+]] = add nsw i64 0, [[I_1_MUL1]]
40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[I_2:%.+]] = trunc i64 [[I_1_ADD0]] to i32
4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[I_2]], i32*
4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV2:%.+]] = load i64, i64* [[T1_OMP_IV]]
40687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[J_1:%.+]] = srem i64 [[IV2]], 4
40787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[J_2:%.+]] = mul nsw i64 [[J_1]], 2
40887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[J_2_ADD0:%.+]] = add nsw i64 0, [[J_2]]
4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[J_2_ADD0]], i64*
41087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// simd.for.inc:
4114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV3:%.+]] = load i64, i64* [[T1_OMP_IV]]
41287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[INC:%.+]] = add nsw i64 [[IV3]], 1
4134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[INC]], i64* [[T1_OMP_IV]]
41487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br label {{%.+}}
41587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[T1_END]]
41687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
41887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: ret i32 0
41987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
42087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid inst_templ1() {
42187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  float a;
42287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  float z[100];
42387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  templ1<float,2> (a, z);
42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
42587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
42687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
42787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartypedef int MyIdx;
42887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
42987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarclass IterDouble {
43087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  double *Ptr;
43187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IterDouble operator++ () const {
43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    IterDouble n;
43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    n.Ptr = Ptr + 1;
43587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return n;
43687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
43787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool operator < (const IterDouble &that) const {
43887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Ptr < that.Ptr;
43987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
44087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  double & operator *() const {
44187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return *Ptr;
44287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
44387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  MyIdx operator - (const IterDouble &that) const {
44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return (MyIdx) (Ptr - that.Ptr);
44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IterDouble operator + (int Delta) {
44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    IterDouble re;
44887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    re.Ptr = Ptr + Delta;
44987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return re;
45087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
45187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
45287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///~IterDouble() {}
45387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
45487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
45587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-LABEL: define {{.*void}} @{{.*}}iter_simple{{.*}}
45687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid iter_simple(IterDouble ia, IterDouble ib, IterDouble ic) {
45787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
45887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Calculate number of iterations before the loop body.
45987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[DIFF1:%.+]] = invoke {{.*}}i32 @{{.*}}IterDouble{{.*}}
46087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[DIFF2:%.+]] = sub nsw i32 [[DIFF1]], 1
46187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[DIFF3:%.+]] = add nsw i32 [[DIFF2]], 1
46287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[DIFF4:%.+]] = sdiv i32 [[DIFF3]], 1
46387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[DIFF5:%.+]] = sub nsw i32 [[DIFF4]], 1
46487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[DIFF5]], i32* [[OMP_LAST_IT:%[^,]+]]{{.+}}
46587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd
46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_4(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i32* [[LB:%[^,]+]], i32* [[UB:%[^,]+]], i32* [[STRIDE:%[^,]+]], i32 1, i32 1)
46887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-DAG: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
46987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-DAG: [[OMP_LAST_IT_VAL:%.+]] = load i32, i32* [[OMP_LAST_IT]],
47087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i32 [[UB_VAL]], [[OMP_LAST_IT_VAL]]
47187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
47287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[OMP_LAST_IT_VAL:%.+]] = load i32, i32* [[OMP_LAST_IT]],
47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i32 [ [[OMP_LAST_IT_VAL]], %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[UP]], i32* [[UB]],
48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i32, i32* [[LB]],
48287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[LB_VAL]], i32* [[IT_OMP_IV:%[^,]+]],
48387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV:%.+]] = load i32, i32* [[IT_OMP_IV]]
4854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: [[UB_VAL:%.+]] = load i32, i32* [[UB]]
48687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP:%.+]] = icmp sle i32 [[IV]], [[UB_VAL]]
48787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP]], label %[[IT_BODY:[^,]+]], label %[[IT_END:[^,]+]]
48887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (IterDouble i = ia; i < ib; ++i) {
48987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[IT_BODY]]
49087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate i from index:
4914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1:%.+]] = load i32, i32* [[IT_OMP_IV]]
49287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Call of operator+ (i, IV).
49387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: {{%.+}} = invoke {{.+}} @{{.*}}IterDouble{{.*}}
49487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ... loop body ...
49587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar   *i = *ic * 0.5;
49687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Float multiply and save result.
49787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[MULR:%.+]] = fmul double {{%.+}}, 5.000000e-01
49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: invoke {{.+}} @{{.*}}IterDouble{{.*}}
4994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store double [[MULR:%.+]], double* [[RESULT_ADDR:%.+]]
50087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar   ++ic;
50187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
5024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV2:%.+]] = load i32, i32* [[IT_OMP_IV]]
50387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD2:%.+]] = add nsw i32 [[IV2]], 1
5044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[ADD2]], i32* [[IT_OMP_IV]]
50587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// br label %{{.*}}, !llvm.loop ![[ITER_LOOP_ID]]
50687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
50787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[IT_END]]
50887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
50987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
51087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: ret void
51187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
51287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
51387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
51487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-LABEL: define {{.*void}} @{{.*}}collapsed{{.*}}
51587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid collapsed(float *a, float *b, float *c, float *d) {
51687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int i; // outer loop counter
51787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned j; // middle loop couter, leads to unsigned icmp in loop header.
51887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // k declared in the loop init below
51987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  short l; // inner loop counter
52087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_4u(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i32* [[LB:%[^,]+]], i32* [[UB:%[^,]+]], i32* [[STRIDE:%[^,]+]], i32 1, i32 1)
52187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
52287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp ugt i32 [[UB_VAL]], 119
52387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
52487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
52587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
52787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]],
52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
53087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i32 [ 119, %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[UP]], i32* [[UB]],
53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i32, i32* [[LB]],
53387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 [[LB_VAL]], i32* [[OMP_IV:%[^,]+]],
53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
53587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd collapse(4)
53687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV:%.+]] = load i32, i32* [[OMP_IV]]
5384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i32, i32* [[UB]]
53987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP:%.+]] = icmp ule i32 [[IV]], [[UB_VAL]]
54087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP]], label %[[COLL1_BODY:[^,]+]], label %[[COLL1_END:[^,]+]]
54187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (i = 1; i < 3; i++) // 2 iterations
54287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (j = 2u; j < 5u; j++) //3 iterations
54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      for (int k = 3; k <= 6; k++) // 4 iterations
54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        for (l = 4; l < 9; ++l) // 5 iterations
54587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        {
54687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[COLL1_BODY]]
54787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate i from index:
5484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1:%.+]] = load i32, i32* [[OMP_IV]]
54987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Calculation of the loop counters values.
55087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CALC_I_1:%.+]] = udiv i32 [[IV1]], 60
55187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_I_1_MUL1:%.+]] = mul i32 [[CALC_I_1]], 1
55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_I_2:%.+]] = add i32 1, [[CALC_I_1_MUL1]]
55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[CALC_I_2]], i32* [[LC_I:.+]]
5544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1_2:%.+]] = load i32, i32* [[OMP_IV]]
55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_J_1:%.+]] = udiv i32 [[IV1_2]], 20
55687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_J_2:%.+]] = urem i32 [[CALC_J_1]], 3
55787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_J_2_MUL1:%.+]] = mul i32 [[CALC_J_2]], 1
55887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_J_3:%.+]] = add i32 2, [[CALC_J_2_MUL1]]
55987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[CALC_J_3]], i32* [[LC_J:.+]]
5604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1_3:%.+]] = load i32, i32* [[OMP_IV]]
56187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_K_1:%.+]] = udiv i32 [[IV1_3]], 5
56287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_K_2:%.+]] = urem i32 [[CALC_K_1]], 4
56387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_K_2_MUL1:%.+]] = mul i32 [[CALC_K_2]], 1
56487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_K_3:%.+]] = add i32 3, [[CALC_K_2_MUL1]]
56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i32 [[CALC_K_3]], i32* [[LC_K:.+]]
5664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1_4:%.+]] = load i32, i32* [[OMP_IV]]
56787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_L_1:%.+]] = urem i32 [[IV1_4]], 5
56887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_L_1_MUL1:%.+]] = mul i32 [[CALC_L_1]], 1
56987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_L_2:%.+]] = add i32 4, [[CALC_L_1_MUL1]]
57087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CALC_L_3:%.+]] = trunc i32 [[CALC_L_2]] to i16
57187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i16 [[CALC_L_3]], i16* [[LC_L:.+]]
57287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ... loop body ...
57387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// End of body: store into a[i]:
5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store float [[RESULT:%.+]], float* [[RESULT_ADDR:%.+]]
57587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    float res = b[j] * c[k];
57687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a[i] = res * d[l];
5774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV2:%.+]] = load i32, i32* [[OMP_IV]]
57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD2:%.+]] = add i32 [[IV2]], 1
5794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 [[ADD2]], i32* [[OMP_IV]]
58087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// br label %{{[^,]+}}, !llvm.loop ![[COLL1_LOOP_ID]]
58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[COLL1_END]]
58287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
58387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// i,j,l are updated; k is not updated.
58487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_fini(%ident_t* {{.+}}, i32 %{{.+}})
5854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: br i1
5864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store i32 3, i32*
5874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 5,
5884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i32 7,
5894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i16 9, i16*
59087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_barrier(%ident_t* {{.+}}, i32 %{{.+}})
59187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: ret void
59287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
59387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
59487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarextern char foo();
59587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarextern double globalfloat;
59687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
59787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-LABEL: define {{.*void}} @{{.*}}widened{{.*}}
59887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid widened(float *a, float *b, float *c, float *d) {
59987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int i; // outer loop counter
60087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  short j; // inner loop counter
60187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  globalfloat = 1.0;
60287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int localint = 1;
60387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store double {{.+}}, double* [[GLOBALFLOAT:@.+]]
60487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Counter is widened to 64 bits.
60587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK:     [[MUL:%.+]] = mul nsw i64 2, %{{.+}}
60687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[SUB:%.+]] = sub nsw i64 [[MUL]], 1
60787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: store i64 [[SUB]], i64* [[OMP_LAST_IT:%[^,]+]],
60887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: call void @__kmpc_for_static_init_8(%ident_t* {{[^,]+}}, i32 %{{[^,]+}}, i32 34, i32* %{{[^,]+}}, i64* [[LB:%[^,]+]], i64* [[UB:%[^,]+]], i64* [[STRIDE:%[^,]+]], i64 1, i64 1)
60987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-DAG: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
61087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-DAG: [[OMP_LAST_IT_VAL:%.+]] = load i64, i64* [[OMP_LAST_IT]],
61187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[CMP:%.+]] = icmp sgt i64 [[UB_VAL]], [[OMP_LAST_IT_VAL]]
61287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br i1 [[CMP]], label %[[TRUE:.+]], label %[[FALSE:[^,]+]]
61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[TRUE]]
61487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[OMP_LAST_IT_VAL:%.+]] = load i64, i64* [[OMP_LAST_IT]],
61587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH:[^,]+]]
61687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[FALSE]]
61787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
61887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: br label %[[SWITCH]]
61987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[SWITCH]]
62087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[UP:%.+]] = phi i64 [ [[OMP_LAST_IT_VAL]], %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
62187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[UP]], i64* [[UB]],
62287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]],
62387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i64 [[LB_VAL]], i64* [[OMP_IV:%[^,]+]],
62487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
62587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  #pragma omp for simd collapse(2) private(globalfloat, localint)
62687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV:%.+]] = load i64, i64* [[OMP_IV]]
6284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]]
62987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[CMP:%.+]] = icmp sle i64 [[IV]], [[UB_VAL]]
63087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: br i1 [[CMP]], label %[[WIDE1_BODY:[^,]+]], label %[[WIDE1_END:[^,]+]]
63187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (i = 1; i < 3; i++) // 2 iterations
63287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (j = 0; j < foo(); j++) // foo() iterations
63387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  {
63487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[WIDE1_BODY]]
63587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Start of body: calculate i from index:
6364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1:%.+]] = load i64, i64* [[OMP_IV]]
63787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Calculation of the loop counters values...
63887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 {{[^,]+}}, i32* [[LC_I:.+]]
6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV1_2:%.+]] = load i64, i64* [[OMP_IV]]
64087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i16 {{[^,]+}}, i16* [[LC_J:.+]]
64187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ... loop body ...
64287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
64387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Here we expect store into private double var, not global
64487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NOT: store double {{.+}}, double* [[GLOBALFLOAT]]
64587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    globalfloat = (float)j/i;
64687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    float res = b[j] * c[j];
64787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Store into a[i]:
6484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store float [[RESULT:%.+]], float* [[RESULT_ADDR:%.+]]
64987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a[i] = res * d[i];
65087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Then there's a store into private var localint:
6514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: store i32 {{.+}}, i32* [[LOCALINT:%[^,]+]]
65287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    localint = (int)j;
6534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [[IV2:%.+]] = load i64, i64* [[OMP_IV]]
65487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: [[ADD2:%.+]] = add nsw i64 [[IV2]], 1
6554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-NEXT: store i64 [[ADD2]], i64* [[OMP_IV]]
65687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
65787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// br label %{{[^,]+}}, !llvm.loop ![[WIDE1_LOOP_ID]]
65887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[WIDE1_END]]
65987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
66087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// i,j are updated.
66187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i32 3, i32* [[I:%[^,]+]]
66287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store i16
66387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
66487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Here we expect store into original localint, not its privatized version.
66587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NOT: store i32 {{.+}}, i32* [[LOCALINT]]
66687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  localint = (int)j;
66787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: ret void
66887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
66987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
67087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// TERM_DEBUG-LABEL: bar
67187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint bar() {return 0;};
67287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
67387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// TERM_DEBUG-LABEL: parallel_simd
67487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid parallel_simd(float *a) {
67587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma omp parallel
67687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma omp for simd
67787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // TERM_DEBUG-NOT: __kmpc_global_thread_num
67887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // TERM_DEBUG:     invoke i32 {{.*}}bar{{.*}}()
67987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // TERM_DEBUG:     unwind label %[[TERM_LPAD:.+]],
68087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // TERM_DEBUG-NOT: __kmpc_global_thread_num
68187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // TERM_DEBUG:     [[TERM_LPAD]]
68287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // TERM_DEBUG:     call void @__clang_call_terminate
68387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // TERM_DEBUG:     unreachable
68487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (unsigned i = 131071; i <= 2147483647; i += 127)
68587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a[i] += bar();
68687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
68787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// TERM_DEBUG: !{{[0-9]+}} = !DILocation(line: [[@LINE-11]],
68887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif // HEADER
689