51 lines · plain
1!===----------------------------------------------------------------------===!2! This directory can be used to add Integration tests involving multiple3! stages of the compiler (for eg. from Fortran to LLVM IR). It should not4! contain executable tests. We should only add tests here sparingly and only5! if there is no other way to test. Repeat this message in each test that is6! added to this directory and sub-directories.7!===----------------------------------------------------------------------===!8 9!RUN: %if x86-registered-target %{ %flang_fc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fopenmp %s -o - | FileCheck --check-prefixes=CHECK,X86 %s %}10!RUN: %if aarch64-registerd-target %{ %flang_fc1 -triple aarch64-unknown-linux-gnu -emit-llvm -fopenmp %s -o - | FileCheck --check-prefixes=CHECK,AARCH64 %s %}11 12!CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 813!CHECK: %[[X_NEW_VAL:.*]] = alloca { float, float }, align 814!CHECK: %[[VAL_1:.*]] = alloca { float, float }, i64 1, align 815!CHECK: %[[ORIG_VAL:.*]] = alloca { float, float }, i64 1, align 816!CHECK: store { float, float } { float 2.000000e+00, float 2.000000e+00 }, ptr %[[ORIG_VAL]], align 417!CHECK: br label %entry18 19!CHECK: entry:20!CHECK: call void @__atomic_load(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], i32 0)21!CHECK: %[[PHI_NODE_ENTRY_1:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 822!CHECK: br label %.atomic.cont23 24!CHECK: .atomic.cont25!CHECK: %[[VAL_4:.*]] = phi { float, float } [ %[[PHI_NODE_ENTRY_1]], %entry ], [ %{{.*}}, %.atomic.cont ]26!CHECK: %[[VAL_5:.*]] = extractvalue { float, float } %[[VAL_4]], 027!CHECK: %[[VAL_6:.*]] = extractvalue { float, float } %[[VAL_4]], 128!CHECK: %[[VAL_7:.*]] = fadd contract float %[[VAL_5]], 1.000000e+0029!CHECK: %[[VAL_8:.*]] = fadd contract float %[[VAL_6]], 1.000000e+0030!CHECK: %[[VAL_9:.*]] = insertvalue { float, float } undef, float %[[VAL_7]], 031!CHECK: %[[VAL_10:.*]] = insertvalue { float, float } %[[VAL_9]], float %[[VAL_8]], 132!CHECK: store { float, float } %[[VAL_10]], ptr %[[X_NEW_VAL]], align 433!CHECK: %[[VAL_11:.*]] = call i1 @__atomic_compare_exchange(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]],34!i32 2, i32 2)35!CHECK: %[[VAL_12:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 436!CHECK: br i1 %[[VAL_11]], label %.atomic.exit, label %.atomic.cont37 38!CHECK: .atomic.exit39!AARCH64: %[[LCSSA:.*]] = phi { float, float } [ %[[VAL_10]], %.atomic.cont ]40!AARCH64: store { float, float } %[[LCSSA]], ptr %[[VAL_1]], align 441!X86: store { float, float } %[[VAL_10]], ptr %[[VAL_1]], align 442 43program main44 complex*8 ia, ib45 ia = (2, 2)46 !$omp atomic capture47 ia = ia + (1, 1)48 ib = ia49 !$omp end atomic50end program51