summaryrefslogtreecommitdiffstats
path: root/clang/test/OpenMP/for_codegen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/OpenMP/for_codegen.cpp')
-rw-r--r--clang/test/OpenMP/for_codegen.cpp182
1 files changed, 175 insertions, 7 deletions
diff --git a/clang/test/OpenMP/for_codegen.cpp b/clang/test/OpenMP/for_codegen.cpp
index 47c5be9becf..80afa1c9452 100644
--- a/clang/test/OpenMP/for_codegen.cpp
+++ b/clang/test/OpenMP/for_codegen.cpp
@@ -25,10 +25,176 @@
// CHECK-LABEL: loop_with_counter_collapse
void loop_with_counter_collapse() {
+ // Captured initializations.
+ // CHECK: store i32 0, i32* [[I_TMP:%.+]],
+ // CHECK: [[VAL:%.+]] = load i32, i32* [[I_TMP]],
+ // CHECK: store i32 [[VAL]], i32* [[J_LB_MIN:%.+]],
+ // CHECK: store i32 3, i32* [[I_TMP]],
+ // CHECK: [[VAL:%.+]] = load i32, i32* [[I_TMP]],
+ // CHECK: store i32 [[VAL]], i32* [[J_LB_MAX:%.+]],
+ // CHECK: [[J_LB_MIN_VAL:%.+]] = load i32, i32* [[J_LB_MIN]],
+ // CHECK: [[J_LB_MAX_VAL:%.+]] = load i32, i32* [[J_LB_MAX]],
+ // CHECK: [[CMP:%.+]] = icmp slt i32 [[J_LB_MIN_VAL]], [[J_LB_MAX_VAL]]
+ // CHECK: [[BOOL:%.+]] = zext i1 [[CMP]] to i8
+ // CHECK: store i8 [[BOOL]], i8* [[J_LB_CMP:%.+]],
+ // CHECK: store i32 0, i32* [[I_TMP]],
+ // CHECK: [[VAL:%.+]] = load i32, i32* [[I_TMP]],
+ // CHECK: [[J_UB_MIN_VAL:%.+]] = add nsw i32 4, [[VAL]]
+ // CHECK: store i32 [[J_UB_MIN_VAL]], i32* [[J_UB_MIN:%.+]],
+ // CHECK: store i32 3, i32* [[I_TMP]],
+ // CHECK: [[VAL:%.+]] = load i32, i32* [[I_TMP]],
+ // CHECK: [[J_UB_MAX_VAL:%.+]] = add nsw i32 4, [[VAL]]
+ // CHECK: store i32 [[J_UB_MAX_VAL]], i32* [[J_UB_MAX:%.+]],
+ // CHECK: [[J_UB_MIN_VAL:%.+]] = load i32, i32* [[J_UB_MIN]],
+ // CHECK: [[J_UB_MAX_VAL:%.+]] = load i32, i32* [[J_UB_MAX]],
+ // CHECK: [[CMP:%.+]] = icmp sgt i32 [[J_UB_MIN_VAL]], [[J_UB_MAX_VAL]]
+ // CHECK: [[BOOL:%.+]] = zext i1 [[CMP]] to i8
+ // CHECK: store i8 [[BOOL]], i8* [[J_UB_CMP:%.+]],
+ // CHECK: [[J_UB_CMP_VAL:%.+]] = load i8, i8* [[J_UB_CMP]],
+ // CHECK: [[BOOL:%.+]] = trunc i8 [[J_UB_CMP_VAL]] to i1
+ // CHECK: br i1 [[BOOL]], label %[[TRUE:[^,]+]], label %[[FALSE:[^,]+]]
+ // CHECK: [[TRUE]]:
+ // CHECK: [[J_UB_MIN_VAL:%.+]] = load i32, i32* [[J_UB_MIN]],
+ // CHECK: br label %[[EXIT:[^,]+]]
+ // CHECK: [[FALSE]]:
+ // CHECK: [[J_UB_MAX_VAL:%.+]] = load i32, i32* [[J_UB_MAX]],
+ // CHECK: br label %[[EXIT]]
+ // CHECK: [[EXIT]]:
+ // CHECK: [[J_UB_VAL:%.+]] = phi i32 [ [[J_UB_MIN_VAL]], %[[TRUE]] ], [ [[J_UB_MAX_VAL]], %[[FALSE]] ]
+ // CHECK: store i32 [[J_UB_VAL]], i32* [[J_UB:%.+]],
+ // CHECK: [[J_LB_CMP_VAL:%.+]] = load i8, i8* [[J_LB_CMP]],
+ // CHECK: [[BOOL:%.+]] = trunc i8 [[J_LB_CMP_VAL]] to i1
+ // CHECK: br i1 [[BOOL]], label %[[TRUE:[^,]+]], label %[[FALSE:[^,]+]]
+ // CHECK: [[TRUE]]:
+ // CHECK: [[J_LB_MIN_VAL:%.+]] = load i32, i32* [[J_LB_MIN]],
+ // CHECK: br label %[[EXIT:[^,]+]]
+ // CHECK: [[FALSE]]:
+ // CHECK: [[J_LB_MAX_VAL:%.+]] = load i32, i32* [[J_LB_MAX]],
+ // CHECK: br label %[[EXIT]]
+ // CHECK: [[EXIT]]:
+ // CHECK: [[J_LB_VAL:%.+]] = phi i32 [ [[J_LB_MIN_VAL]], %[[TRUE]] ], [ [[J_LB_MAX_VAL]], %[[FALSE]] ]
+ // CHECK: store i32 [[J_LB_VAL]], i32* [[J_LB:%.+]],
+ // CHECK: [[J_UB_VAL:%.+]] = load i32, i32* [[J_UB]],
+ // CHECK: [[J_LB_VAL:%.+]] = load i32, i32* [[J_LB]],
+ // CHECK: [[SUB:%.+]] = sub nsw i32 [[J_UB_VAL]], [[J_LB_VAL]]
+ // CHECK: [[SUB_ST:%.+]] = sub nsw i32 [[SUB]], 1
+ // CHECK: [[ADD_ST:%.+]] = add nsw i32 [[SUB_ST]], 1
+ // CHECK: [[DIV_ST:%.+]] = sdiv i32 [[ADD_ST]], 1
+ // CHECK: [[CAST:%.+]] = sext i32 [[DIV_ST]] to i64
+ // CHECK: [[MUL:%.+]] = mul nsw i64 4, [[CAST]]
+ // CHECK: [[NUM_ITERS_VAL:%.+]] = sub nsw i64 [[MUL]], 1
+ // CHECK: store i64 [[NUM_ITERS_VAL]], i64* [[NUM_ITERS:%.+]],
+
+ // Initialization
+ // CHECK: store i32 0, i32* [[I:%.+]],
+ // CHECK: [[I_INIT:%.+]] = load i32, i32* [[I]],
+ // CHECK: store i32 [[I_INIT]], i32* [[J:%.+]],
+
// LIFETIME: call void @llvm.lifetime.end
// LIFETIME: call void @llvm.lifetime.end
- // CHECK: call void @__kmpc_for_static_init_8(%struct.ident_t* @
- // CHECK: call void @__kmpc_for_static_fini(%struct.ident_t* @
+
+ // Precondition for j counter
+ // CHECK: store i32 0, i32* [[TMP_I:%.+]],
+ // CHECK: [[J_LB_VAL:%.+]] = load i32, i32* [[TMP_I]],
+ // CHECK: [[I_VAL:%.+]] = load i32, i32* [[TMP_I]],
+ // CHECK: [[J_UB_VAL:%.+]] = add nsw i32 4, [[I_VAL]]
+ // CHECK: [[CMP:%.+]] = icmp slt i32 [[J_LB_VAL]], [[J_UB_VAL]]
+ // CHECK: br i1 [[CMP]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
+
+ // CHECK: [[THEN]]:
+ // CHECK: store i64 0, i64* [[LB:%.+]],
+ // CHECK: [[NUM_ITERS_VAL:%.+]] = load i64, i64* [[NUM_ITERS]],
+ // CHECK: store i64 [[NUM_ITERS_VAL]], i64* [[UB:%.+]],
+ // CHECK: store i64 1, i64* [[STRIDE:%.+]],
+ // CHECK: store i32 0, i32* [[IS_LAST:%.+]],
+ // CHECK: call void @__kmpc_for_static_init_8(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 34, i32* [[IS_LAST]], i64* [[LB]], i64* [[UB]], i64* [[STRIDE]], i64 1, i64 1)
+ // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
+ // CHECK: [[NUM_ITERS_VAL:%.+]] = load i64, i64* [[NUM_ITERS]],
+ // CHECK: [[CMP:%.+]] = icmp sgt i64 [[UB_VAL]], [[NUM_ITERS_VAL]]
+ // CHECK: br i1 [[CMP]], label %[[TRUE:[^,]+]], label %[[FALSE:[^,]+]]
+ // CHECK: [[TRUE]]:
+ // CHECK: [[NUM_ITERS_VAL:%.+]] = load i64, i64* [[NUM_ITERS]],
+ // CHECK: br label %[[DONE:[^,]+]]
+ // CHECK: [[FALSE]]:
+ // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
+ // CHECK: br label %[[DONE]]
+ // CHECK: [[DONE]]:
+ // CHECK: [[TOP:%.+]] = phi i64 [ [[NUM_ITERS_VAL]], %[[TRUE]] ], [ [[UB_VAL]], %[[FALSE]] ]
+ // CHECK: store i64 [[TOP]], i64* [[UB]],
+ // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]],
+ // CHECK: store i64 [[LB_VAL]], i64* [[IV:%.+]],
+ // CHECK: br label %[[COND:[^,]+]]
+ // CHECK: [[COND]]:
+ // CHECK: [[IV_VAL:%.+]] = load i64, i64* [[IV]],
+ // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]],
+ // CHECK: [[CMP:%.+]] = icmp sle i64 [[IV_VAL]], [[UB_VAL]]
+ // CHECK: br i1 [[CMP]], label %[[BODY:[^,]+]], label %[[CLEANUP:[^,]+]]
+ // LIFETIME: [[CLEANUP]]:
+ // LIFETIME: br label %[[CLEANUP:[^,]+]]
+ // CHECK: [[BODY]]:
+ // CHECK: [[IV_VAL:%.+]] = load i64, i64* [[IV]],
+ // CHECK: [[J_UB_VAL:%.+]] = load i32, i32* [[J_UB]],
+ // CHECK: [[J_LB_VAL:%.+]] = load i32, i32* [[J_LB]],
+ // CHECK: [[SUB:%.+]] = sub nsw i32 [[J_UB_VAL]], [[J_LB_VAL]]
+ // CHECK: [[SUB_ST:%.+]] = sub nsw i32 [[SUB]], 1
+ // CHECK: [[ADD_ST:%.+]] = add nsw i32 [[SUB_ST]], 1
+ // CHECK: [[DIV_ST:%.+]] = sdiv i32 [[ADD_ST]], 1
+ // CHECK: [[MUL:%.+]] = mul nsw i32 1, [[DIV_ST]]
+ // CHECK: [[CAST:%.+]] = sext i32 [[MUL]] to i64
+ // CHECK: [[DIV:%.+]] = sdiv i64 [[IV_VAL]], [[CAST]]
+ // CHECK: [[MUL:%.+]] = mul nsw i64 [[DIV]], 1
+ // CHECK: [[ADD:%.+]] = add nsw i64 0, [[MUL]]
+ // CHECK: [[CAST:%.+]] = trunc i64 [[ADD]] to i32
+ // CHECK: store i32 [[CAST]], i32* [[I_PRIV:%.+]],
+ // CHECK: [[I_VAL:%.+]] = load i32, i32* [[I_PRIV]],
+ // CHECK: [[CONV:%.+]] = sext i32 [[I_VAL]] to i64
+ // CHECK: [[IV_VAL:%.+]] = load i64, i64* [[IV]],
+ // CHECK: [[IV_VAL1:%.+]] = load i64, i64* [[IV]],
+ // CHECK: [[J_UB_VAL:%.+]] = load i32, i32* [[J_UB]],
+ // CHECK: [[J_LB_VAL:%.+]] = load i32, i32* [[J_LB]],
+ // CHECK: [[SUB:%.+]] = sub nsw i32 [[J_UB_VAL]], [[J_LB_VAL]]
+ // CHECK: [[SUB_ST:%.+]] = sub nsw i32 [[SUB]], 1
+ // CHECK: [[ADD_ST:%.+]] = add nsw i32 [[SUB_ST]], 1
+ // CHECK: [[DIV_ST:%.+]] = sdiv i32 [[ADD_ST]], 1
+ // CHECK: [[MUL:%.+]] = mul nsw i32 1, [[DIV_ST]]
+ // CHECK: [[CAST:%.+]] = sext i32 [[MUL]] to i64
+ // CHECK: [[DIV:%.+]] = sdiv i64 [[IV_VAL1]], [[CAST]]
+ // CHECK: [[J_UB_VAL:%.+]] = load i32, i32* [[J_UB]],
+ // CHECK: [[J_LB_VAL:%.+]] = load i32, i32* [[J_LB]],
+ // CHECK: [[SUB:%.+]] = sub nsw i32 [[J_UB_VAL]], [[J_LB_VAL]]
+ // CHECK: [[SUB_ST:%.+]] = sub nsw i32 [[SUB]], 1
+ // CHECK: [[ADD_ST:%.+]] = add nsw i32 [[SUB_ST]], 1
+ // CHECK: [[DIV_ST:%.+]] = sdiv i32 [[ADD_ST]], 1
+ // CHECK: [[MUL:%.+]] = mul nsw i32 1, [[DIV_ST]]
+ // CHECK: [[CAST:%.+]] = sext i32 [[MUL]] to i64
+ // CHECK: [[MUL:%.+]] = mul nsw i64 [[DIV]], [[CAST]]
+ // CHECK: [[SUB:%.+]] = sub nsw i64 [[IV_VAL]], [[MUL]]
+ // CHECK: [[MUL:%.+]] = mul nsw i64 [[SUB:%.+]], 1
+ // CHECK: [[ADD:%.+]] = add nsw i64 [[CONV]], [[MUL]]
+ // CHECK: [[CAST:%.+]] = trunc i64 [[ADD]] to i32
+ // CHECK: store i32 [[CAST]], i32* [[J_PRIV:%.+]],
+
+ // Check that the loop variable is not out of its boundaries.
+ // CHECK: [[J_VAL:%.+]] = load i32, i32* [[J_PRIV]],
+ // CHECK: [[I_VAL:%.+]] = load i32, i32* [[I_PRIV]],
+ // CHECK: [[J_COND:%.+]] = add nsw i32 4, [[I_VAL]]
+ // CHECK: [[CMP:%.+]] = icmp slt i32 [[J_VAL]], [[J_COND]]
+ // CHECK: br i1 [[CMP]], label %[[NEXT:[^,]+]], label %[[BODY_CONT:[^,]+]]
+ // CHECK: [[NEXT]]:
+
+ // Main body is empty.
+ // CHECK: br label %[[BODY_CONT]]
+ // CHECK: [[BODY_CONT]]:
+ // CHECK: br label %[[INC:[^,]+]]
+ // CHECK: [[INC]]:
+ // CHECK: [[IV_VAL:%.+]] = load i64, i64* [[IV]],
+ // CHECK: [[ADD:%.+]] = add nsw i64 [[IV_VAL]], 1
+ // CHECK: store i64 [[ADD]], i64* [[IV]],
+ // CHECK: br label %[[COND]]
+ // CHECK: [[CLEANUP]]:
+ // CHECK: br label %[[EXIT:[^,]+]]
+ // CHECK: [[EXIT]]:
+ // CHECK: call void @__kmpc_for_static_fini(%struct.ident_t* @{{.+}}, i32 %{{.+}})
// LIFETIME: call void @llvm.lifetime.end
// LIFETIME: call void @llvm.lifetime.end
// LIFETIME: call void @llvm.lifetime.end
@@ -40,7 +206,7 @@ void loop_with_counter_collapse() {
// LIFETIME: call void @llvm.lifetime.end
#pragma omp for collapse(2)
for (int i = 0; i < 4; i++) {
- for (int j = i; j < 4; j++) {
+ for (int j = i; j < 4 + i; j++) {
}
}
}
@@ -449,13 +615,14 @@ void for_with_references() {
// CHECK: [[I:%.+]] = alloca i8,
// CHECK: [[CNT:%.+]] = alloca i8*,
// CHECK: [[CNT_PRIV:%.+]] = alloca i8,
-// CHECK: call void @__kmpc_for_static_init_4(
+// CHECK: call void @__kmpc_for_static_init_8(
// CHECK-NOT: load i8, i8* [[CNT]],
// CHECK: call void @__kmpc_for_static_fini(
char i = 0;
char &cnt = i;
-#pragma omp for
+#pragma omp for collapse(2)
for (cnt = 0; cnt < 2; ++cnt)
+ for (int j = cnt; j < 4 + cnt; j++)
k = cnt;
}
@@ -528,13 +695,14 @@ void loop_with_It_plus(It<char> begin, It<char> end) {
// CHECK: call void @__kmpc_for_static_fini(
void loop_with_stmt_expr() {
-#pragma omp for
+#pragma omp for collapse(2)
for (int i = __extension__({float b = 0;b; }); i < __extension__({double c = 1;c; }); i += __extension__({char d = 1; d; }))
+ for (int j = i; j < 4 + i; j++)
;
}
// CHECK-LABEL: loop_with_stmt_expr
// CHECK: call i32 @__kmpc_global_thread_num(
-// CHECK: call void @__kmpc_for_static_init_4(
+// CHECK: call void @__kmpc_for_static_init_8(
// CHECK: call void @__kmpc_for_static_fini(
OpenPOWER on IntegriCloud