llvm-project/clang/test/OpenMP/split_counts_verify.c
Amit Tiwari 1972cf64fd
[Clang][OpenMP] Implement Loop splitting #pragma omp split directive (#183261)
OpenMP 6.0 Loop-splitting directive `#pragma omp split` construct with `counts`
clause
2026-04-03 10:42:31 +05:30

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