192 lines · c
1// RUN: %clang_cc1 -verify -fopenmp -x c -emit-llvm %s -triple %itanium_abi_triple -o - -femit-all-decls -disable-llvm-passes | FileCheck %s2// RUN: %clang_cc1 -fopenmp -x c -triple %itanium_abi_triple -emit-pch -o %t %s -femit-all-decls -disable-llvm-passes3// RUN: %clang_cc1 -fopenmp -x c -triple %itanium_abi_triple -include-pch %t -verify %s -emit-llvm -o - -femit-all-decls -disable-llvm-passes | FileCheck --check-prefix=CHECK-LOAD %s4 5// RUN: %clang_cc1 -fopenmp -x c -triple %itanium_abi_triple -emit-pch -o %t %s -femit-all-decls -disable-llvm-passes -fopenmp-version=456// RUN: %clang_cc1 -fopenmp -x c -triple %itanium_abi_triple -include-pch %t -verify %s -emit-llvm -o - -femit-all-decls -disable-llvm-passes -fopenmp-version=45 | FileCheck --check-prefixes=CHECK-LOAD,OMP45-LOAD %s7 8// RUN: %clang_cc1 -verify -fopenmp-simd -x c -emit-llvm %s -triple %itanium_abi_triple -o - -femit-all-decls -disable-llvm-passes | FileCheck --check-prefix SIMD-ONLY0 %s9// RUN: %clang_cc1 -fopenmp-simd -x c -triple %itanium_abi_triple -emit-pch -o %t %s -femit-all-decls -disable-llvm-passes10// RUN: %clang_cc1 -fopenmp-simd -x c -triple %itanium_abi_triple -include-pch %t -verify %s -emit-llvm -o - -femit-all-decls -disable-llvm-passes | FileCheck --check-prefix SIMD-ONLY0 %s11// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}12// expected-no-diagnostics13 14#ifndef HEADER15#define HEADER16 17// CHECK: [[SSS_INT:.+]] = type { i32 }18// CHECK-LOAD: [[SSS_INT:.+]] = type { i32 }19 20// CHECK-DAG: [[SSS_INIT:@.+]] = private constant %struct.SSS zeroinitializer21// CHECK-DAG: [[INT_INIT:@.+]] = private constant i32 022 23#pragma omp declare reduction(+ : int, char : omp_out *= omp_in)24// CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)25// CHECK: [[MUL:%.+]] = mul nsw i3226// CHECK-NEXT: store i32 [[MUL]], ptr27// CHECK-NEXT: ret void28// CHECK-NEXT: }29// CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)30// CHECK-LOAD: [[MUL:%.+]] = mul nsw i3231// CHECK-LOAD-NEXT: store i32 [[MUL]], ptr32// CHECK-LOAD-NEXT: ret void33// CHECK-LOAD-NEXT: }34 35// CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)36// CHECK: sext i837// CHECK: sext i838// CHECK: [[MUL:%.+]] = mul nsw i3239// CHECK-NEXT: [[TRUNC:%.+]] = trunc i32 [[MUL]] to i840// CHECK-NEXT: store i8 [[TRUNC]], ptr41// CHECK-NEXT: ret void42// CHECK-NEXT: }43// CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)44// CHECK-LOAD: sext i845// CHECK-LOAD: sext i846// CHECK-LOAD: [[MUL:%.+]] = mul nsw i3247// CHECK-LOAD-NEXT: [[TRUNC:%.+]] = trunc i32 [[MUL]] to i848// CHECK-LOAD-NEXT: store i8 [[TRUNC]], ptr49// CHECK-LOAD-NEXT: ret void50// CHECK-LOAD-NEXT: }51 52#pragma omp declare reduction(fun : float : omp_out += omp_in) initializer(omp_priv = 15 + omp_orig)53// CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)54// CHECK: [[ADD:%.+]] = fadd float55// CHECK-NEXT: store float [[ADD]], ptr56// CHECK-NEXT: ret void57// CHECK-NEXT: }58// CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)59// CHECK: [[ADD:%.+]] = fadd float 1.560// CHECK-NEXT: store float [[ADD]], ptr61// CHECK-NEXT: ret void62// CHECK-NEXT: }63// CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)64// CHECK-LOAD: [[ADD:%.+]] = fadd float65// CHECK-LOAD-NEXT: store float [[ADD]], ptr66// CHECK-LOAD-NEXT: ret void67// CHECK-LOAD-NEXT: }68// CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)69// CHECK-LOAD: [[ADD:%.+]] = fadd float 1.570// CHECK-LOAD-NEXT: store float [[ADD]], ptr71// CHECK-LOAD-NEXT: ret void72// CHECK-LOAD-NEXT: }73 74struct SSS {75 int field;76#pragma omp declare reduction(+ : int, char : omp_out *= omp_in)77 // CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)78 // CHECK: [[MUL:%.+]] = mul nsw i3279 // CHECK-NEXT: store i32 [[MUL]], ptr80 // CHECK-NEXT: ret void81 // CHECK-NEXT: }82 83 // CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)84 // CHECK: sext i885 // CHECK: sext i886 // CHECK: [[MUL:%.+]] = mul nsw i3287 // CHECK-NEXT: [[TRUNC:%.+]] = trunc i32 [[MUL]] to i888 // CHECK-NEXT: store i8 [[TRUNC]], ptr89 // CHECK-NEXT: ret void90 // CHECK-NEXT: }91};92 93void init(struct SSS *priv, struct SSS orig);94 95#pragma omp declare reduction(fun : struct SSS : omp_out = omp_in) initializer(init(&omp_priv, omp_orig))96// CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)97// CHECK: call void @llvm.memcpy98// CHECK-NEXT: ret void99// CHECK-NEXT: }100// CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)101// CHECK: call void @init(102// CHECK-NEXT: ret void103// CHECK-NEXT: }104// CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)105// CHECK-LOAD: call void @llvm.memcpy106// CHECK-LOAD-NEXT: ret void107// CHECK-LOAD-NEXT: }108// CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)109// CHECK-LOAD: call void @init(110// CHECK-LOAD-NEXT: ret void111// CHECK-LOAD-NEXT: }112 113// CHECK-LABEL: @main114// CHECK-LOAD-LABEL: @main115int main(void) {116#pragma omp declare reduction(fun : struct SSS : omp_out = omp_in) initializer(init(&omp_priv, omp_orig))117 // CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)118 // CHECK: call void @llvm.memcpy119 // CHECK-NEXT: ret void120 // CHECK-NEXT: }121 // CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)122 // CHECK: call void @init(123 // CHECK-NEXT: ret void124 // CHECK-NEXT: }125 // CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)126 // CHECK-LOAD: call void @llvm.memcpy127 // CHECK-LOAD-NEXT: ret void128 // CHECK-LOAD-NEXT: }129 // CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)130 // CHECK-LOAD: call void @init(131 // CHECK-LOAD-NEXT: ret void132 // CHECK-LOAD-NEXT: }133 {134#pragma omp declare reduction(fun : struct SSS : omp_out = omp_in) initializer(init(&omp_priv, omp_orig))135 // CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)136 // CHECK: call void @llvm.memcpy137 // CHECK-NEXT: ret void138 // CHECK-NEXT: }139 // CHECK: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)140 // CHECK: call void @init(141 // CHECK-NEXT: ret void142 // CHECK-NEXT: }143 // CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)144 // CHECK-LOAD: call void @llvm.memcpy145 // CHECK-LOAD-NEXT: ret void146 // CHECK-LOAD-NEXT: }147 // CHECK-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)148 // CHECK-LOAD: call void @init(149 // CHECK-LOAD-NEXT: ret void150 // CHECK-LOAD-NEXT: }151 }152 return 0;153}154 155// OMP45-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)156// OMP45-LOAD: [[MUL:%.+]] = mul nsw i32157// OMP45-LOAD-NEXT: store i32 [[MUL]], ptr158// OMP45-LOAD-NEXT: ret void159// OMP45-LOAD-NEXT: }160 161// OMP45-LOAD: define internal {{.*}}void @{{[^(]+}}(ptr noalias noundef %0, ptr noalias noundef %1)162// OMP45-LOAD: sext i8163// OMP45-LOAD: sext i8164// OMP45-LOAD: [[MUL:%.+]] = mul nsw i32165// OMP45-LOAD-NEXT: [[TRUNC:%.+]] = trunc i32 [[MUL]] to i8166// OMP45-LOAD-NEXT: store i8 [[TRUNC]], ptr167// OMP45-LOAD-NEXT: ret void168// OMP45-LOAD-NEXT: }169 170// CHECK-LABEL: bar171struct SSS ss;172int in;173void bar(void) {174 // CHECK: [[SS_PRIV:%.+]] = alloca %struct.SSS,175 // CHECK: [[IN_PRIV:%.+]] = alloca i32,176 // CHECK: call void @llvm.memcpy.p0.p0.i{{64|32}}(ptr {{.*}}[[SS_PRIV]], ptr {{.*}}[[SSS_INIT]], i{{64|32}} 4, i1 false)177 // CHECK: [[IN_VAL:%.+]] = load i32, ptr [[INT_INIT]],178 // CHECK: store i32 [[IN_VAL]], ptr [[IN_PRIV]],179 // CHECK: call void @__kmpc_for_static_init_4(180#pragma omp declare reduction(+ \181 : struct SSS \182 : omp_out = omp_in)183#pragma omp declare reduction(+ \184 : int \185 : omp_out = omp_in)186#pragma omp for reduction(+ \187 : ss, in)188 for (int i = 0; i < 10; ++i)189 ;190}191#endif192