1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-enable-irbuilder -verify -fopenmp -fopenmp-version=45 -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
29fbd33adSArnamoy Bhattacharyya // expected-no-diagnostics
39fbd33adSArnamoy Bhattacharyya 
49fbd33adSArnamoy Bhattacharyya struct S {
59fbd33adSArnamoy Bhattacharyya   int a, b;
69fbd33adSArnamoy Bhattacharyya };
79fbd33adSArnamoy Bhattacharyya 
89fbd33adSArnamoy Bhattacharyya struct P {
99fbd33adSArnamoy Bhattacharyya   int a, b;
109fbd33adSArnamoy Bhattacharyya };
119fbd33adSArnamoy Bhattacharyya 
simple(float * a,float * b,int * c)129fbd33adSArnamoy Bhattacharyya void simple(float *a, float *b, int *c) {
139fbd33adSArnamoy Bhattacharyya   S s, *p;
149fbd33adSArnamoy Bhattacharyya   P pp;
159fbd33adSArnamoy Bhattacharyya #pragma omp simd
169fbd33adSArnamoy Bhattacharyya   for (int i = 3; i < 32; i += 5) {
179fbd33adSArnamoy Bhattacharyya     // llvm.access.group test
189fbd33adSArnamoy Bhattacharyya     // CHECK: %[[A_ADDR:.+]] = alloca float*, align 8
199fbd33adSArnamoy Bhattacharyya     // CHECK: %[[B_ADDR:.+]] = alloca float*, align 8
209fbd33adSArnamoy Bhattacharyya     // CHECK: %[[S:.+]] = alloca %struct.S, align 4
219fbd33adSArnamoy Bhattacharyya     // CHECK: %[[P:.+]] = alloca %struct.S*, align 8
229fbd33adSArnamoy Bhattacharyya     // CHECK: %[[I:.+]] = alloca i32, align 4
239fbd33adSArnamoy Bhattacharyya     // CHECK: %[[TMP3:.+]] = load float*, float** %[[B_ADDR:.+]], align 8, !llvm.access.group ![[META3:[0-9]+]]
249fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP4:.+]] = load i32, i32* %[[I:.+]], align 4, !llvm.access.group ![[META3:[0-9]+]]
259fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[IDXPROM:.+]] = sext i32 %[[TMP4:.+]] to i64
269fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[ARRAYIDX:.+]] = getelementptr inbounds float, float* %[[TMP3:.+]], i64 %[[IDXPROM:.+]]
279fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP5:.+]] = load float, float* %[[ARRAYIDX:.+]], align 4, !llvm.access.group ![[META3:[0-9]+]]
289fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[A2:.+]] = getelementptr inbounds %struct.S, %struct.S* %[[S:.+]], i32 0, i32 0
299fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP6:.+]] = load i32, i32* %[[A2:.+]], align 4, !llvm.access.group ![[META3:[0-9]+]]
309fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[CONV:.+]] = sitofp i32 %[[TMP6:.+]] to float
319fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[ADD:.+]] = fadd float %[[TMP5:.+]], %[[CONV:.+]]
329fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP7:.+]] = load %struct.S*, %struct.S** %[[P:.+]], align 8, !llvm.access.group ![[META3:[0-9]+]]
339fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[A3:.+]] = getelementptr inbounds %struct.S, %struct.S* %[[TMP7:.+]], i32 0, i32 0
349fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP8:.+]] = load i32, i32* %[[A3:.+]], align 4, !llvm.access.group ![[META3:[0-9]+]]
359fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[CONV4:.+]] = sitofp i32 %[[TMP8:.+]] to float
369fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[ADD5:.+]] = fadd float %[[ADD:.+]], %[[CONV4:.+]]
379fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP9:.+]] = load float*, float** %[[A_ADDR:.+]], align 8, !llvm.access.group ![[META3:[0-9]+]]
389fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP10:.+]] = load i32, i32* %[[I:.+]], align 4, !llvm.access.group ![[META3:[0-9]+]]
399fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[IDXPROM6:.+]] = sext i32 %[[TMP10:.+]] to i64
409fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[ARRAYIDX7:.+]] = getelementptr inbounds float, float* %[[TMP9:.+]], i64 %[[IDXPROM6:.+]]
419fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: store float %[[ADD5:.+]], float* %[[ARRAYIDX7:.+]], align 4, !llvm.access.group ![[META3:[0-9]+]]
429fbd33adSArnamoy Bhattacharyya     // llvm.loop test
439fbd33adSArnamoy Bhattacharyya     // CHECK: %[[OMP_LOOPDOTNEXT:.+]] = add nuw i32 %[[OMP_LOOPDOTIV:.+]], 1
449fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: br label %omp_loop.header, !llvm.loop ![[META4:[0-9]+]]
459fbd33adSArnamoy Bhattacharyya     a[i] = b[i] + s.a + p->a;
469fbd33adSArnamoy Bhattacharyya   }
479fbd33adSArnamoy Bhattacharyya 
489fbd33adSArnamoy Bhattacharyya #pragma omp simd
499fbd33adSArnamoy Bhattacharyya   for (int j = 3; j < 32; j += 5) {
509fbd33adSArnamoy Bhattacharyya     // test if unique access groups were used for a second loop
519fbd33adSArnamoy Bhattacharyya     // CHECK: %[[A22:.+]] = getelementptr inbounds %struct.P, %struct.P* %[[PP:.+]], i32 0, i32 0
529fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP14:.+]] = load i32, i32* %[[A22:.+]], align 4, !llvm.access.group ![[META7:[0-9]+]]
539fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP15:.+]] = load i32*, i32** %[[C_ADDR:.+]], align 8, !llvm.access.group ![[META7:[0-9]+]]
549fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[TMP16:.+]] = load i32, i32* %[[J:.+]], align 4, !llvm.access.group ![[META7:[0-9]+]]
559fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[IDXPROM23:.+]] = sext i32 %[[TMP16:.+]] to i64
569fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: %[[ARRAYIDX24:.+]] = getelementptr inbounds i32, i32* %[[TMP15:.+]], i64 %[[IDXPROM23:.+]]
579fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: store i32 %[[TMP14:.+]], i32* %[[ARRAYIDX24:.+]], align 4, !llvm.access.group ![[META7:[0-9]+]]
589fbd33adSArnamoy Bhattacharyya     // check llvm.loop metadata
599fbd33adSArnamoy Bhattacharyya     // CHECK: %[[OMP_LOOPDOTNEXT:.+]] = add nuw i32 %[[OMP_LOOPDOTIV:.+]], 1
609fbd33adSArnamoy Bhattacharyya     // CHECK-NEXT: br label %[[OMP_LLOP_BODY:.*]], !llvm.loop ![[META8:[0-9]+]]
619fbd33adSArnamoy Bhattacharyya     c[j] = pp.a;
629fbd33adSArnamoy Bhattacharyya   }
639fbd33adSArnamoy Bhattacharyya }
649fbd33adSArnamoy Bhattacharyya 
659fbd33adSArnamoy Bhattacharyya // CHECK: ![[META3:[0-9]+]] = distinct !{}
669fbd33adSArnamoy Bhattacharyya // CHECK-NEXT: ![[META4]]  = distinct !{![[META4]], ![[META5:[0-9]+]], ![[META6:[0-9]+]]}
679fbd33adSArnamoy Bhattacharyya // CHECK-NEXT: ![[META5]]  = !{!"llvm.loop.parallel_accesses", ![[META3]]}
689fbd33adSArnamoy Bhattacharyya // CHECK-NEXT: ![[META6]]  = !{!"llvm.loop.vectorize.enable", i1 true}
699fbd33adSArnamoy Bhattacharyya // CHECK-NEXT: ![[META7:[0-9]+]] = distinct !{}
709fbd33adSArnamoy Bhattacharyya // CHECK-NEXT: ![[META8]]  = distinct !{![[META8]], ![[META9:[0-9]+]], ![[META6]]}
719fbd33adSArnamoy Bhattacharyya // CHECK-NEXT: ![[META9]]  = !{!"llvm.loop.parallel_accesses", ![[META7]]}
72