53 lines · cpp
1// Check code generation2// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=IR3 4// Check same results after serialization round-trip5// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s6// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=IR7// expected-no-diagnostics8 9#ifndef HEADER10#define HEADER11 12// placeholder for loop body code.13extern "C" void body(...) {}14 15 16// IR-LABEL: @func(17// IR-NEXT: [[ENTRY:.*]]:18// IR-NEXT: %[[I:.+]] = alloca i32, align 419// IR-NEXT: store i32 7, ptr %[[I]], align 420// IR-NEXT: br label %[[FOR_COND:.+]]21// IR-EMPTY:22// IR-NEXT: [[FOR_COND]]:23// IR-NEXT: %[[TMP0:.+]] = load i32, ptr %[[I]], align 424// IR-NEXT: %[[CMP:.+]] = icmp slt i32 %[[TMP0]], 1725// IR-NEXT: br i1 %[[CMP]], label %[[FOR_BODY:.+]], label %[[FOR_END:.+]]26// IR-EMPTY:27// IR-NEXT: [[FOR_BODY]]:28// IR-NEXT: %[[TMP1:.+]] = load i32, ptr %[[I]], align 429// IR-NEXT: call void (...) @body(i32 noundef %[[TMP1]])30// IR-NEXT: br label %[[FOR_INC:.+]]31// IR-EMPTY:32// IR-NEXT: [[FOR_INC]]:33// IR-NEXT: %[[TMP2:.+]] = load i32, ptr %[[I]], align 434// IR-NEXT: %[[ADD:.+]] = add nsw i32 %[[TMP2]], 335// IR-NEXT: store i32 %[[ADD]], ptr %[[I]], align 436// IR-NEXT: br label %[[FOR_COND]], !llvm.loop ![[LOOP2:[0-9]+]]37// IR-EMPTY:38// IR-NEXT: [[FOR_END]]:39// IR-NEXT: ret void40// IR-NEXT: }41extern "C" void func() {42 #pragma omp unroll full43 for (int i = 7; i < 17; i += 3)44 body(i);45}46 47#endif /* HEADER */48 49 50// IR: ![[LOOP2]] = distinct !{![[LOOP2]], ![[LOOPPROP3:[0-9]+]], ![[LOOPPROP4:[0-9]+]]}51// IR: ![[LOOPPROP3]] = !{!"llvm.loop.mustprogress"}52// IR: ![[LOOPPROP4]] = !{!"llvm.loop.unroll.full"}53