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