| // 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]]} |
| //. |