brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.2 KiB · 5515f08 Raw
146 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_  size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _2// RUN: %clang_cc1 -fopenmp-enable-irbuilder -verify -fopenmp -fopenmp-version=45 -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s3// expected-no-diagnostics4 5#ifndef HEADER6#define HEADER7 8 9extern "C" void workshareloop_unsigned_down(float *a) {10#pragma omp for11  for (unsigned i = 32000000; i > 33; i -= 7) {12    a[i] = i;13  }14}15 16#endif // HEADER17 18 19 20 21 22// CHECK-LABEL: define {{[^@]+}}@workshareloop_unsigned_down23// CHECK-SAME: (ptr noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] {24// CHECK-NEXT:  entry:25// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 826// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 427// CHECK-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 828// CHECK-NEXT:    [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_0:%.*]], align 429// CHECK-NEXT:    [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 430// CHECK-NEXT:    [[P_LASTITER:%.*]] = alloca i32, align 431// CHECK-NEXT:    [[P_LOWERBOUND:%.*]] = alloca i32, align 432// CHECK-NEXT:    [[P_UPPERBOUND:%.*]] = alloca i32, align 433// CHECK-NEXT:    [[P_STRIDE:%.*]] = alloca i32, align 434// CHECK-NEXT:    store ptr [[A]], ptr [[A_ADDR]], align 835// CHECK-NEXT:    store i32 32000000, ptr [[I]], align 436// CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], ptr [[AGG_CAPTURED]], i32 0, i32 037// CHECK-NEXT:    store ptr [[I]], ptr [[TMP0]], align 838// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_0]], ptr [[AGG_CAPTURED1]], i32 0, i32 039// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[I]], align 440// CHECK-NEXT:    store i32 [[TMP2]], ptr [[TMP1]], align 441// CHECK-NEXT:    call void @__captured_stmt(ptr [[DOTCOUNT_ADDR]], ptr [[AGG_CAPTURED]])42// CHECK-NEXT:    [[DOTCOUNT:%.*]] = load i32, ptr [[DOTCOUNT_ADDR]], align 443// CHECK-NEXT:    br label [[OMP_LOOP_PREHEADER:%.*]]44// CHECK:       omp_loop.preheader:45// CHECK-NEXT:    store i32 0, ptr [[P_LOWERBOUND]], align 446// CHECK-NEXT:    [[TMP3:%.*]] = sub i32 [[DOTCOUNT]], 147// CHECK-NEXT:    store i32 [[TMP3]], ptr [[P_UPPERBOUND]], align 448// CHECK-NEXT:    store i32 1, ptr [[P_STRIDE]], align 449// CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])50// CHECK-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0)51// CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 452// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 453// CHECK-NEXT:    [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]]54// CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[TMP6]], 155// CHECK-NEXT:    br label [[OMP_LOOP_HEADER:%.*]]56// CHECK:       omp_loop.header:57// CHECK-NEXT:    [[OMP_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ]58// CHECK-NEXT:    br label [[OMP_LOOP_COND:%.*]]59// CHECK:       omp_loop.cond:60// CHECK-NEXT:    [[OMP_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_LOOP_IV]], [[TMP7]]61// CHECK-NEXT:    br i1 [[OMP_LOOP_CMP]], label [[OMP_LOOP_BODY:%.*]], label [[OMP_LOOP_EXIT:%.*]]62// CHECK:       omp_loop.body:63// CHECK-NEXT:    [[TMP8:%.*]] = add i32 [[OMP_LOOP_IV]], [[TMP4]]64// CHECK-NEXT:    call void @__captured_stmt.1(ptr [[I]], i32 [[TMP8]], ptr [[AGG_CAPTURED1]])65// CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[I]], align 466// CHECK-NEXT:    [[CONV:%.*]] = uitofp i32 [[TMP9]] to float67// CHECK-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[A_ADDR]], align 868// CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 469// CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[TMP11]] to i6470// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw float, ptr [[TMP10]], i64 [[IDXPROM]]71// CHECK-NEXT:    store float [[CONV]], ptr [[ARRAYIDX]], align 472// CHECK-NEXT:    br label [[OMP_LOOP_INC]]73// CHECK:       omp_loop.inc:74// CHECK-NEXT:    [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 175// CHECK-NEXT:    br label [[OMP_LOOP_HEADER]]76// CHECK:       omp_loop.exit:77// CHECK-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]])78// CHECK-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])79// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM2]])80// CHECK-NEXT:    br label [[OMP_LOOP_AFTER:%.*]]81// CHECK:       omp_loop.after:82// CHECK-NEXT:    ret void83//84//85// CHECK-LABEL: define {{[^@]+}}@__captured_stmt86// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR1:[0-9]+]] {87// CHECK-NEXT:  entry:88// CHECK-NEXT:    [[DISTANCE_ADDR:%.*]] = alloca ptr, align 889// CHECK-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 890// CHECK-NEXT:    [[DOTSTART:%.*]] = alloca i32, align 491// CHECK-NEXT:    [[DOTSTOP:%.*]] = alloca i32, align 492// CHECK-NEXT:    [[DOTSTEP:%.*]] = alloca i32, align 493// CHECK-NEXT:    store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 894// CHECK-NEXT:    store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 895// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 896// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP0]], i32 0, i32 097// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 898// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 499// CHECK-NEXT:    store i32 [[TMP3]], ptr [[DOTSTART]], align 4100// CHECK-NEXT:    store i32 33, ptr [[DOTSTOP]], align 4101// CHECK-NEXT:    store i32 -7, ptr [[DOTSTEP]], align 4102// CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4103// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4104// CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[TMP4]], [[TMP5]]105// CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]106// CHECK:       cond.true:107// CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTSTART]], align 4108// CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTSTOP]], align 4109// CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[TMP6]], [[TMP7]]110// CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4111// CHECK-NEXT:    [[SUB1:%.*]] = sub nsw i32 0, [[TMP8]]112// CHECK-NEXT:    [[SUB2:%.*]] = sub i32 [[SUB1]], 1113// CHECK-NEXT:    [[ADD:%.*]] = add i32 [[SUB]], [[SUB2]]114// CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4115// CHECK-NEXT:    [[SUB3:%.*]] = sub nsw i32 0, [[TMP9]]116// CHECK-NEXT:    [[DIV:%.*]] = udiv i32 [[ADD]], [[SUB3]]117// CHECK-NEXT:    br label [[COND_END:%.*]]118// CHECK:       cond.false:119// CHECK-NEXT:    br label [[COND_END]]120// CHECK:       cond.end:121// CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ]122// CHECK-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8123// CHECK-NEXT:    store i32 [[COND]], ptr [[TMP10]], align 4124// CHECK-NEXT:    ret void125//126//127// CHECK-LABEL: define {{[^@]+}}@__captured_stmt.1128// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR1]] {129// CHECK-NEXT:  entry:130// CHECK-NEXT:    [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8131// CHECK-NEXT:    [[LOGICAL_ADDR:%.*]] = alloca i32, align 4132// CHECK-NEXT:    [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8133// CHECK-NEXT:    store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8134// CHECK-NEXT:    store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4135// CHECK-NEXT:    store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8136// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8137// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_0:%.*]], ptr [[TMP0]], i32 0, i32 0138// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4139// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4140// CHECK-NEXT:    [[MUL:%.*]] = mul i32 -7, [[TMP3]]141// CHECK-NEXT:    [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]]142// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8143// CHECK-NEXT:    store i32 [[ADD]], ptr [[TMP4]], align 4144// CHECK-NEXT:    ret void145//146