1121cac01SJeroen Dobbelaere; RUN: opt < %s  -loop-vectorize -force-vector-width=4 -force-vector-interleave=2  -S | FileCheck %s
2121cac01SJeroen Dobbelaere
3121cac01SJeroen Dobbelaeredefine void @test1(float* noalias nocapture %a, float* noalias nocapture readonly %b) {
4121cac01SJeroen Dobbelaereentry:
5121cac01SJeroen Dobbelaere  br label %for.body
6121cac01SJeroen Dobbelaere
7*872f7000SDávid Bolvanský; CHECK-LABEL: @test1
8*872f7000SDávid Bolvanský; CHECK: vector.body:
9*872f7000SDávid Bolvanský; CHECK: @llvm.experimental.noalias.scope.decl
10*872f7000SDávid Bolvanský; CHECK-NOT: @llvm.experimental.noalias.scope.decl
11*872f7000SDávid Bolvanský; CHECK: for.body:
12*872f7000SDávid Bolvanský; CHECK: @llvm.experimental.noalias.scope.decl
13*872f7000SDávid Bolvanský; CHECK-NOT: @llvm.experimental.noalias.scope.decl
14*872f7000SDávid Bolvanský; CHECK: ret void
15121cac01SJeroen Dobbelaere
16121cac01SJeroen Dobbelaerefor.body:                                         ; preds = %for.body, %entry
17121cac01SJeroen Dobbelaere  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
18121cac01SJeroen Dobbelaere  %arrayidx = getelementptr inbounds float, float* %b, i64 %indvars.iv
19121cac01SJeroen Dobbelaere  %0 = load float, float* %arrayidx, align 4
20121cac01SJeroen Dobbelaere  %cmp1 = fcmp ogt float %0, 1.000000e+02
21121cac01SJeroen Dobbelaere  tail call void @llvm.experimental.noalias.scope.decl(metadata !0)
22121cac01SJeroen Dobbelaere  %add = fadd float %0, 1.000000e+00
23121cac01SJeroen Dobbelaere  %arrayidx5 = getelementptr inbounds float, float* %a, i64 %indvars.iv
24121cac01SJeroen Dobbelaere  store float %add, float* %arrayidx5, align 4
25121cac01SJeroen Dobbelaere  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
26121cac01SJeroen Dobbelaere  %exitcond = icmp eq i64 %indvars.iv, 1599
27121cac01SJeroen Dobbelaere  br i1 %exitcond, label %for.end, label %for.body
28121cac01SJeroen Dobbelaere
29121cac01SJeroen Dobbelaerefor.end:                                          ; preds = %for.body
30121cac01SJeroen Dobbelaere  ret void
31121cac01SJeroen Dobbelaere}
32121cac01SJeroen Dobbelaere
33121cac01SJeroen Dobbelaeredeclare void @llvm.experimental.noalias.scope.decl(metadata)
34121cac01SJeroen Dobbelaere
35121cac01SJeroen Dobbelaere%struct.data = type { float*, float* }
36121cac01SJeroen Dobbelaere
37121cac01SJeroen Dobbelaeredefine void @test2(%struct.data* nocapture readonly %d) {
38121cac01SJeroen Dobbelaereentry:
39121cac01SJeroen Dobbelaere  %b = getelementptr inbounds %struct.data, %struct.data* %d, i64 0, i32 1
40121cac01SJeroen Dobbelaere  %0 = load float*, float** %b, align 8
41121cac01SJeroen Dobbelaere  %ptrint = ptrtoint float* %0 to i64
42121cac01SJeroen Dobbelaere  %maskedptr = and i64 %ptrint, 31
43121cac01SJeroen Dobbelaere  %maskcond = icmp eq i64 %maskedptr, 0
44121cac01SJeroen Dobbelaere  %a = getelementptr inbounds %struct.data, %struct.data* %d, i64 0, i32 0
45121cac01SJeroen Dobbelaere  %1 = load float*, float** %a, align 8
46121cac01SJeroen Dobbelaere  %ptrint2 = ptrtoint float* %1 to i64
47121cac01SJeroen Dobbelaere  %maskedptr3 = and i64 %ptrint2, 31
48121cac01SJeroen Dobbelaere  %maskcond4 = icmp eq i64 %maskedptr3, 0
49121cac01SJeroen Dobbelaere  br label %for.body
50121cac01SJeroen Dobbelaere
51*872f7000SDávid Bolvanský; CHECK-LABEL: @test2
52*872f7000SDávid Bolvanský; CHECK: vector.body:
53*872f7000SDávid Bolvanský; CHECK: @llvm.experimental.noalias.scope.decl(metadata [[SCOPE0_LIST:!.*]])
54*872f7000SDávid Bolvanský; CHECK: @llvm.experimental.noalias.scope.decl(metadata [[SCOPE4_LIST:!.*]])
55*872f7000SDávid Bolvanský; CHECK-NOT: @llvm.experimental.noalias.scope.decl
56*872f7000SDávid Bolvanský; CHECK: for.body:
57*872f7000SDávid Bolvanský; CHECK: @llvm.experimental.noalias.scope.decl(metadata [[SCOPE0_LIST]])
58*872f7000SDávid Bolvanský; CHECK: @llvm.experimental.noalias.scope.decl(metadata [[SCOPE4_LIST]])
59*872f7000SDávid Bolvanský; CHECK-NOT: @llvm.experimental.noalias.scope.decl
60*872f7000SDávid Bolvanský; CHECK: ret void
61121cac01SJeroen Dobbelaere
62121cac01SJeroen Dobbelaerefor.body:                                         ; preds = %for.body, %entry
63121cac01SJeroen Dobbelaere  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
64121cac01SJeroen Dobbelaere  tail call void @llvm.experimental.noalias.scope.decl(metadata !0)
65121cac01SJeroen Dobbelaere  %arrayidx = getelementptr inbounds float, float* %0, i64 %indvars.iv
66121cac01SJeroen Dobbelaere  %2 = load float, float* %arrayidx, align 4
67121cac01SJeroen Dobbelaere  %add = fadd float %2, 1.000000e+00
68121cac01SJeroen Dobbelaere  tail call void @llvm.experimental.noalias.scope.decl(metadata !4)
69121cac01SJeroen Dobbelaere  %arrayidx5 = getelementptr inbounds float, float* %1, i64 %indvars.iv
70121cac01SJeroen Dobbelaere  store float %add, float* %arrayidx5, align 4
71121cac01SJeroen Dobbelaere  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
72121cac01SJeroen Dobbelaere  %exitcond = icmp eq i64 %indvars.iv, 1599
73121cac01SJeroen Dobbelaere  br i1 %exitcond, label %for.end, label %for.body
74121cac01SJeroen Dobbelaere
75121cac01SJeroen Dobbelaerefor.end:                                          ; preds = %for.body
76121cac01SJeroen Dobbelaere  ret void
77121cac01SJeroen Dobbelaere}
78121cac01SJeroen Dobbelaere
79121cac01SJeroen Dobbelaeredefine void @predicated_noalias_scope_decl(float* noalias nocapture readonly %a, float* noalias nocapture %b, i32 %n) {
80*872f7000SDávid Bolvanský
81121cac01SJeroen Dobbelaere; Check that the vector.body still contains a llvm.experimental.noalias.scope.decl
82*872f7000SDávid Bolvanský
83121cac01SJeroen Dobbelaere; CHECK-LABEL: @predicated_noalias_scope_decl(
84121cac01SJeroen Dobbelaere; CHECK:   vector.body:
85*872f7000SDávid Bolvanský; CHECK:   call void @llvm.experimental.noalias.scope.decl
86*872f7000SDávid Bolvanský; CHECK-NOT: @llvm.experimental.noalias.scope.decl
87121cac01SJeroen Dobbelaere; CHECK:   scalar.ph:
88*872f7000SDávid Bolvanský; CHECK-NOT: @llvm.experimental.noalias.scope.decl
89121cac01SJeroen Dobbelaere; CHECK:   if.else:
90*872f7000SDávid Bolvanský; CHECK:   call void @llvm.experimental.noalias.scope.decl
91*872f7000SDávid Bolvanský; CHECK-NOT: @llvm.experimental.noalias.scope.decl
92*872f7000SDávid Bolvanský; CHECK: }
93121cac01SJeroen Dobbelaere
94121cac01SJeroen Dobbelaereentry:
95121cac01SJeroen Dobbelaere  %cmp15 = icmp eq i32 %n, 0
96121cac01SJeroen Dobbelaere  br i1 %cmp15, label %for.cond.cleanup, label %for.body.preheader
97121cac01SJeroen Dobbelaere
98121cac01SJeroen Dobbelaerefor.body.preheader:                               ; preds = %entry
99121cac01SJeroen Dobbelaere  %0 = zext i32 %n to i64
100121cac01SJeroen Dobbelaere  br label %for.body
101121cac01SJeroen Dobbelaere
102121cac01SJeroen Dobbelaerefor.cond.cleanup.loopexit:                        ; preds = %if.end5
103121cac01SJeroen Dobbelaere  br label %for.cond.cleanup
104121cac01SJeroen Dobbelaere
105121cac01SJeroen Dobbelaerefor.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry
106121cac01SJeroen Dobbelaere  ret void
107121cac01SJeroen Dobbelaere
108121cac01SJeroen Dobbelaerefor.body:                                         ; preds = %for.body.preheader, %if.end5
109121cac01SJeroen Dobbelaere  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %if.end5 ]
110121cac01SJeroen Dobbelaere  %cmp1 = icmp ult i64 %indvars.iv, 495616
111121cac01SJeroen Dobbelaere  br i1 %cmp1, label %if.end5, label %if.else
112121cac01SJeroen Dobbelaere
113121cac01SJeroen Dobbelaereif.else:                                          ; preds = %for.body
114121cac01SJeroen Dobbelaere  %cmp2 = icmp ult i64 %indvars.iv, 991232
115121cac01SJeroen Dobbelaere  tail call void @llvm.experimental.noalias.scope.decl(metadata !0)
116121cac01SJeroen Dobbelaere  br label %if.end5
117121cac01SJeroen Dobbelaere
118121cac01SJeroen Dobbelaereif.end5:                                          ; preds = %for.body, %if.else
119121cac01SJeroen Dobbelaere  %x.0 = phi float [ 4.200000e+01, %if.else ], [ 2.300000e+01, %for.body ]
120121cac01SJeroen Dobbelaere  %arrayidx = getelementptr inbounds float, float* %a, i64 %indvars.iv
121121cac01SJeroen Dobbelaere  %1 = load float, float* %arrayidx, align 4
122121cac01SJeroen Dobbelaere  %mul = fmul float %x.0, %1
123121cac01SJeroen Dobbelaere  %arrayidx7 = getelementptr inbounds float, float* %b, i64 %indvars.iv
124121cac01SJeroen Dobbelaere  store float %mul, float* %arrayidx7, align 4
125121cac01SJeroen Dobbelaere  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
126121cac01SJeroen Dobbelaere  %cmp = icmp eq i64 %indvars.iv.next, %0
127121cac01SJeroen Dobbelaere  br i1 %cmp, label %for.cond.cleanup.loopexit, label %for.body
128121cac01SJeroen Dobbelaere}
129121cac01SJeroen Dobbelaere
130121cac01SJeroen Dobbelaere!0 = !{ !1 }
131121cac01SJeroen Dobbelaere!1 = distinct !{ !1, !2 }
132121cac01SJeroen Dobbelaere!2 = distinct !{ !2 }
133121cac01SJeroen Dobbelaere!3 = distinct !{ !3, !2 }
134121cac01SJeroen Dobbelaere!4 = !{ !3 }
135121cac01SJeroen Dobbelaere
136*872f7000SDávid Bolvanský; CHECK: [[SCOPE0_LIST]] = !{[[SCOPE0:!.*]]}
137*872f7000SDávid Bolvanský; CHECK: [[SCOPE0]] = distinct !{[[SCOPE0]], [[SCOPE0_DOM:!.*]]}
138*872f7000SDávid Bolvanský; CHECK: [[SCOPE0_DOM]] = distinct !{[[SCOPE0_DOM]]}
139*872f7000SDávid Bolvanský; CHECK: [[SCOPE4_LIST]] = !{[[SCOPE4:!.*]]}
140*872f7000SDávid Bolvanský; CHECK: [[SCOPE4]] = distinct !{[[SCOPE4]], [[SCOPE0_DOM]]}
141