1; RUN: opt < %s  -O1  -S -loop-versioning-licm -licm 2>&1 | FileCheck %s
2; RUN: opt < %s  -S -passes='loop-versioning-licm,licm' 2>&1 | FileCheck %s
3
4; CHECK-LABEL: @without_metadata(
5define i32 @without_metadata(i32* nocapture %var1, i32* nocapture readnone %var2, i32* nocapture %var3, i32 %itr) #0 {
6entry:
7  %cmp14 = icmp eq i32 %itr, 0
8  br i1 %cmp14, label %for.end13, label %for.cond1.preheader.preheader
9
10for.cond1.preheader.preheader:                    ; preds = %entry
11  br label %for.cond1.preheader
12
13for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc11
14  %j.016 = phi i32 [ %j.1.lcssa, %for.inc11 ], [ 0, %for.cond1.preheader.preheader ]
15  %i.015 = phi i32 [ %inc12, %for.inc11 ], [ 0, %for.cond1.preheader.preheader ]
16  %cmp212 = icmp ult i32 %j.016, %itr
17  br i1 %cmp212, label %for.body3.lr.ph, label %for.inc11
18
19for.body3.lr.ph:                                  ; preds = %for.cond1.preheader
20  %add = add i32 %i.015, %itr
21  %idxprom6 = zext i32 %i.015 to i64
22  %arrayidx7 = getelementptr inbounds i32, i32* %var3, i64 %idxprom6
23  br label %for.body3
24
25for.body3:                                        ; preds = %for.body3.lr.ph, %for.body3
26  %j.113 = phi i32 [ %j.016, %for.body3.lr.ph ], [ %inc, %for.body3 ]
27  %idxprom = zext i32 %j.113 to i64
28  %arrayidx = getelementptr inbounds i32, i32* %var1, i64 %idxprom
29; CHECK: store i32 %add, i32* %arrayidx, align 4, !alias.scope {{.*}}, !noalias {{.*}}
30  store i32 %add, i32* %arrayidx, align 4
31  %0 = load i32, i32* %arrayidx7, align 4
32  %add8 = add nsw i32 %0, %add
33  store i32 %add8, i32* %arrayidx7, align 4
34  %inc = add nuw i32 %j.113, 1
35  %cmp2 = icmp ult i32 %inc, %itr
36  br i1 %cmp2, label %for.body3, label %for.inc11.loopexit
37
38for.inc11.loopexit:                               ; preds = %for.body3
39  br label %for.inc11
40
41for.inc11:                                        ; preds = %for.inc11.loopexit, %for.cond1.preheader
42  %j.1.lcssa = phi i32 [ %j.016, %for.cond1.preheader ], [ %itr, %for.inc11.loopexit ]
43  %inc12 = add nuw i32 %i.015, 1
44  %cmp = icmp ult i32 %inc12, %itr
45  br i1 %cmp, label %for.cond1.preheader, label %for.end13.loopexit
46
47for.end13.loopexit:                               ; preds = %for.inc11
48  br label %for.end13
49
50for.end13:                                        ; preds = %for.end13.loopexit, %entry
51  ret i32 0
52}
53
54; CHECK-LABEL: @with_metadata(
55define i32 @with_metadata(i32* nocapture %var1, i32* nocapture readnone %var2, i32* nocapture %var3, i32 %itr) #0 {
56entry:
57  %cmp14 = icmp eq i32 %itr, 0
58  br i1 %cmp14, label %for.end13, label %for.cond1.preheader.preheader
59
60for.cond1.preheader.preheader:                    ; preds = %entry
61  br label %for.cond1.preheader
62
63for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc11
64  %j.016 = phi i32 [ %j.1.lcssa, %for.inc11 ], [ 0, %for.cond1.preheader.preheader ]
65  %i.015 = phi i32 [ %inc12, %for.inc11 ], [ 0, %for.cond1.preheader.preheader ]
66  %cmp212 = icmp ult i32 %j.016, %itr
67  br i1 %cmp212, label %for.body3.lr.ph, label %for.inc11
68
69for.body3.lr.ph:                                  ; preds = %for.cond1.preheader
70  %add = add i32 %i.015, %itr
71  %idxprom6 = zext i32 %i.015 to i64
72  %arrayidx7 = getelementptr inbounds i32, i32* %var3, i64 %idxprom6
73  br label %for.body3
74
75for.body3:                                        ; preds = %for.body3.lr.ph, %for.body3
76  %j.113 = phi i32 [ %j.016, %for.body3.lr.ph ], [ %inc, %for.body3 ]
77  %idxprom = zext i32 %j.113 to i64
78  %arrayidx = getelementptr inbounds i32, i32* %var1, i64 %idxprom
79; CHECK-NOT: store i32 %add, i32* %arrayidx, align 4, !alias.scope {{.*}}, !noalias {{.*}}
80  store i32 %add, i32* %arrayidx, align 4
81  %0 = load i32, i32* %arrayidx7, align 4
82  %add8 = add nsw i32 %0, %add
83  store i32 %add8, i32* %arrayidx7, align 4
84  %inc = add nuw i32 %j.113, 1
85  %cmp2 = icmp ult i32 %inc, %itr
86  br i1 %cmp2, label %for.body3, label %for.inc11.loopexit, !llvm.loop !0
87
88for.inc11.loopexit:                               ; preds = %for.body3
89  br label %for.inc11
90
91for.inc11:                                        ; preds = %for.inc11.loopexit, %for.cond1.preheader
92  %j.1.lcssa = phi i32 [ %j.016, %for.cond1.preheader ], [ %itr, %for.inc11.loopexit ]
93  %inc12 = add nuw i32 %i.015, 1
94  %cmp = icmp ult i32 %inc12, %itr
95  br i1 %cmp, label %for.cond1.preheader, label %for.end13.loopexit
96
97for.end13.loopexit:                               ; preds = %for.inc11
98  br label %for.end13
99
100for.end13:                                        ; preds = %for.end13.loopexit, %entry
101  ret i32 0
102}
103
104!0 = distinct !{!0, !1}
105!1 = !{!"llvm.loop.licm_versioning.disable"}
106