124 lines
5.9 KiB
C
124 lines
5.9 KiB
C
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --version 5
|
|
/*
|
|
* Verify #pragma omp split counts(c1, c2, ...) at syntax and IR levels.
|
|
* counts(3, omp_fill, 2) with n=10 splits into: [0..3), [3..8), [8..10).
|
|
* Sum 0+1+...+9 = 45.
|
|
* For end-to-end runtime tests see openmp/runtime/test/transform/split/.
|
|
*/
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=60 -fsyntax-only -verify %s
|
|
// expected-no-diagnostics
|
|
|
|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fopenmp -fopenmp-version=60 -emit-llvm %s -o - | FileCheck %s --check-prefix=IR
|
|
|
|
int main(void) {
|
|
const int n = 10;
|
|
int sum = 0;
|
|
|
|
#pragma omp split counts(3, omp_fill, 2)
|
|
for (int i = 0; i < n; ++i) {
|
|
sum += i;
|
|
}
|
|
|
|
return (sum == 45) ? 0 : 1;
|
|
}
|
|
// IR-LABEL: define dso_local i32 @main(
|
|
// IR-SAME: ) #[[ATTR0:[0-9]+]] {
|
|
// IR-NEXT: [[ENTRY:.*:]]
|
|
// IR-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: [[N:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: [[SUM:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: [[DOTSPLIT_IV_0_I:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: [[DOTSPLIT_IV_1_I:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: [[DOTSPLIT_IV_2_I:%.*]] = alloca i32, align 4
|
|
// IR-NEXT: store i32 0, ptr [[RETVAL]], align 4
|
|
// IR-NEXT: store i32 10, ptr [[N]], align 4
|
|
// IR-NEXT: store i32 0, ptr [[SUM]], align 4
|
|
// IR-NEXT: store i32 0, ptr [[I]], align 4
|
|
// IR-NEXT: store i32 0, ptr [[DOTSPLIT_IV_0_I]], align 4
|
|
// IR-NEXT: br label %[[FOR_COND:.*]]
|
|
// IR: [[FOR_COND]]:
|
|
// IR-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTSPLIT_IV_0_I]], align 4
|
|
// IR-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 3
|
|
// IR-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]
|
|
// IR: [[FOR_BODY]]:
|
|
// IR-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTSPLIT_IV_0_I]], align 4
|
|
// IR-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_IV]], align 4
|
|
// IR-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// IR-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP2]], 1
|
|
// IR-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
|
|
// IR-NEXT: store i32 [[ADD]], ptr [[I]], align 4
|
|
// IR-NEXT: [[TMP3:%.*]] = load i32, ptr [[I]], align 4
|
|
// IR-NEXT: [[TMP4:%.*]] = load i32, ptr [[SUM]], align 4
|
|
// IR-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP4]], [[TMP3]]
|
|
// IR-NEXT: store i32 [[ADD1]], ptr [[SUM]], align 4
|
|
// IR-NEXT: br label %[[FOR_INC:.*]]
|
|
// IR: [[FOR_INC]]:
|
|
// IR-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSPLIT_IV_0_I]], align 4
|
|
// IR-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1
|
|
// IR-NEXT: store i32 [[INC]], ptr [[DOTSPLIT_IV_0_I]], align 4
|
|
// IR-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]]
|
|
// IR: [[FOR_END]]:
|
|
// IR-NEXT: store i32 3, ptr [[DOTSPLIT_IV_1_I]], align 4
|
|
// IR-NEXT: br label %[[FOR_COND2:.*]]
|
|
// IR: [[FOR_COND2]]:
|
|
// IR-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSPLIT_IV_1_I]], align 4
|
|
// IR-NEXT: [[CMP3:%.*]] = icmp slt i32 [[TMP6]], 8
|
|
// IR-NEXT: br i1 [[CMP3]], label %[[FOR_BODY4:.*]], label %[[FOR_END10:.*]]
|
|
// IR: [[FOR_BODY4]]:
|
|
// IR-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSPLIT_IV_1_I]], align 4
|
|
// IR-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 4
|
|
// IR-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// IR-NEXT: [[MUL5:%.*]] = mul nsw i32 [[TMP8]], 1
|
|
// IR-NEXT: [[ADD6:%.*]] = add nsw i32 0, [[MUL5]]
|
|
// IR-NEXT: store i32 [[ADD6]], ptr [[I]], align 4
|
|
// IR-NEXT: [[TMP9:%.*]] = load i32, ptr [[I]], align 4
|
|
// IR-NEXT: [[TMP10:%.*]] = load i32, ptr [[SUM]], align 4
|
|
// IR-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP10]], [[TMP9]]
|
|
// IR-NEXT: store i32 [[ADD7]], ptr [[SUM]], align 4
|
|
// IR-NEXT: br label %[[FOR_INC8:.*]]
|
|
// IR: [[FOR_INC8]]:
|
|
// IR-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTSPLIT_IV_1_I]], align 4
|
|
// IR-NEXT: [[INC9:%.*]] = add nsw i32 [[TMP11]], 1
|
|
// IR-NEXT: store i32 [[INC9]], ptr [[DOTSPLIT_IV_1_I]], align 4
|
|
// IR-NEXT: br label %[[FOR_COND2]], !llvm.loop [[LOOP4:![0-9]+]]
|
|
// IR: [[FOR_END10]]:
|
|
// IR-NEXT: store i32 8, ptr [[DOTSPLIT_IV_2_I]], align 4
|
|
// IR-NEXT: br label %[[FOR_COND11:.*]]
|
|
// IR: [[FOR_COND11]]:
|
|
// IR-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTSPLIT_IV_2_I]], align 4
|
|
// IR-NEXT: [[CMP12:%.*]] = icmp slt i32 [[TMP12]], 10
|
|
// IR-NEXT: br i1 [[CMP12]], label %[[FOR_BODY13:.*]], label %[[FOR_END19:.*]]
|
|
// IR: [[FOR_BODY13]]:
|
|
// IR-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTSPLIT_IV_2_I]], align 4
|
|
// IR-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// IR-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// IR-NEXT: [[MUL14:%.*]] = mul nsw i32 [[TMP14]], 1
|
|
// IR-NEXT: [[ADD15:%.*]] = add nsw i32 0, [[MUL14]]
|
|
// IR-NEXT: store i32 [[ADD15]], ptr [[I]], align 4
|
|
// IR-NEXT: [[TMP15:%.*]] = load i32, ptr [[I]], align 4
|
|
// IR-NEXT: [[TMP16:%.*]] = load i32, ptr [[SUM]], align 4
|
|
// IR-NEXT: [[ADD16:%.*]] = add nsw i32 [[TMP16]], [[TMP15]]
|
|
// IR-NEXT: store i32 [[ADD16]], ptr [[SUM]], align 4
|
|
// IR-NEXT: br label %[[FOR_INC17:.*]]
|
|
// IR: [[FOR_INC17]]:
|
|
// IR-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTSPLIT_IV_2_I]], align 4
|
|
// IR-NEXT: [[INC18:%.*]] = add nsw i32 [[TMP17]], 1
|
|
// IR-NEXT: store i32 [[INC18]], ptr [[DOTSPLIT_IV_2_I]], align 4
|
|
// IR-NEXT: br label %[[FOR_COND11]], !llvm.loop [[LOOP5:![0-9]+]]
|
|
// IR: [[FOR_END19]]:
|
|
// IR-NEXT: [[TMP18:%.*]] = load i32, ptr [[SUM]], align 4
|
|
// IR-NEXT: [[CMP20:%.*]] = icmp eq i32 [[TMP18]], 45
|
|
// IR-NEXT: [[TMP19:%.*]] = zext i1 [[CMP20]] to i64
|
|
// IR-NEXT: [[COND:%.*]] = select i1 [[CMP20]], i32 0, i32 1
|
|
// IR-NEXT: ret i32 [[COND]]
|
|
//
|
|
//.
|
|
// IR: [[LOOP2]] = distinct !{[[LOOP2]], [[META3:![0-9]+]]}
|
|
// IR: [[META3]] = !{!"llvm.loop.mustprogress"}
|
|
// IR: [[LOOP4]] = distinct !{[[LOOP4]], [[META3]]}
|
|
// IR: [[LOOP5]] = distinct !{[[LOOP5]], [[META3]]}
|
|
//.
|